Member 13979563 Ответов: 1

Одно утверждение "если" срабатывает, хотя этого не должно быть, независимо от того, как я пытаюсь его исправить


Я немного новичок в программировании, и в моем классе нам было поручено сделать программу для выполнения трех типов преобразований. Когда я запускаю эту программу, большинство ее аспектов работают совершенно нормально. Все команды работают нормально, но всякий раз, когда я прохожу через команду (например, "деньги") и выхожу из окна GUI, программа запускает оператор if для "null", но также все еще запускает тот, который выскакивает с предупреждением GUI. Я не могу понять, почему он это делает (как и мой учитель), и на данный момент я просто хочу знать, почему предупреждающий графический интерфейс всегда активируется, а не как это исправить.

Ps: Я знаю, что есть более простые способы выполнить то, что я хотел сделать, но в тот момент, когда я писал это, я был очень новым. Кроме того, этот материал является беспорядком на данный момент, и там все еще могут быть остатки неудачных попыток исправить эту проблему, извините.

Вот вам и код:

import javax.swing.JOptionPane;
import java.util.Scanner;
import java.text.DecimalFormat;

public class Conversion {

	public static void main(String[] args) {
			
		DecimalFormat rnd2= new DecimalFormat("0.00");
		DecimalFormat rnd5= new DecimalFormat("0.00000");
		Scanner reader = new Scanner(System.in);
		
		double m, m1, m2, m3, i, cm, s, w, wr, d, dr, h, hr, min, minr, sec;
		String ask = "null",loop = "true";

	if(ask.equals("null")) {
		System.out.println("Do you want to convert Money, Inches, Seconds, or All? End the program by typing \"End\".");
			ask = reader.nextLine();
	}
	if(ask.equals("End")) {
		loop = "false";
		reader.close();
	}

	else {
		
		while(loop.equals("true")) {
			
			if(!ask.equals("All") && !ask.equals("Money") && !ask.equals("Inches") && !ask.equals("Seconds") && !ask.equals("End") && !ask.equals("null")){

				loop = "true";	
				ask = JOptionPane.showInputDialog(null,"Please Enter \"All\", \"Money\", \"Inches\", \"Seconds\", or type \"End\" to end the program.","WARNING",JOptionPane.WARNING_MESSAGE);
				
			}

			else if(ask.equals("All")) {
				System.out.println("Enter your money as \"Dollar.Cents\" in U.S. Dollars, then your inches, then seconds");
				m = reader.nextDouble();
				i = reader.nextDouble();
				s = reader.nextDouble();
				
				m1 = m*0.86;	//Euro
				m2 = m*0.00016;	//BitCoin
				m3 = m*19.3;	//Peso
				
				cm = i*2.54;
				/* Super Sweaty Conversion Mumbo Jumbo */
				w = (int)s/604800;
				wr = s - w*604800;
				d = (int)wr/86400;
				dr = wr - d*86400;
				h = (int)dr/3600;
				hr = dr - h*3600;
				min = (int)hr/60;
				minr = hr - min*60;
				sec = (int)minr;
				
				ask = "null";
				loop = "true";
				JOptionPane.showMessageDialog(null,
						"Your $"+m+" is equal to\n"+rnd2.format(m1)+" Euros\n"+rnd5.format(m2)+" BitCoins\n"+rnd2.format(m3)+" Pesos\n\n"+
						i+" inches is eqaul to "+cm+" centimeters\n\n"+
						s+" seconds is equal to "+w+" weeks, "+d+" days, "+h+" hours,"+min+" minutes, and "+sec+" seconds",
						"Conversions", JOptionPane.PLAIN_MESSAGE);	
	
			}
			

			else if(ask.equals("Money")) {
				System.out.println("Enter your money as \"Dollar.Cents\" in U.S. Dollars");
				m = reader.nextDouble();
				
				m1 = m*0.86;	//Euro
				m2 = m*0.00016;	//BitCoin
				m3 = m*19.3;	//Peso
				
				ask = "null";
				loop = "true";
				JOptionPane.showMessageDialog(null,
						"\nYour $"+m+" is equal to\n"+rnd2.format(m1)+" Euros\n"+rnd5.format(m2)+" BitCoins\n"+rnd2.format(m3)+" Pesos\n",
						"Conversion", JOptionPane.PLAIN_MESSAGE);

			}
			
			else if(ask.equals("Inches")) {
				
				System.out.println("Enter your length in Inches");
				i = reader.nextDouble();
				cm = i*2.54;
				
				ask = "null";
				loop = "true";
				JOptionPane.showMessageDialog(null,
						"\n"+i+" inches is eqaul to "+cm+" centimeters\n",
						"Conversion", JOptionPane.PLAIN_MESSAGE);	
	
			}
			
			else if(ask.equals("Seconds")) {
				
				System.out.println("Enter the number of seconds to convert");
				s = reader.nextDouble();
				
				w = (int)s/604800;
				wr = s - (int)w*604800;
				d = (int)wr/86400;
				dr = wr - (int)d*86400;
				h = (int)dr/3600;
				hr = dr - (int)h*3600;
				min = (int)hr/60;
				minr = hr - (int)min*60;
				sec = (int)minr;
				
				ask = "null";
				loop = "true";
				JOptionPane.showMessageDialog(null,
						"\n"+s+" seconds is equal to "+w+" weeks, "+d+" days, "+h+" hours,"+min+" minutes, and "+sec+" seconds\n",
						"Conversion", JOptionPane.PLAIN_MESSAGE);	
			}
			else if(ask.equals("End")) {
				loop = "false";
				reader.close();	
			}
			else if(ask.equals("null")) {
				System.out.println("Do you want to convert Money, Inches, Seconds, or All? End the program by typing \"End\".");
					ask = reader.nextLine();
			}
		}
	}
}
}


Что я уже пробовал:

Я попытался изменить операторы "else if" на каждую комбинацию и вариацию if, else и else, если бы я мог придумать, а также изменить критерии для всех операторов if

Используя только оператор else для графического интерфейса предупреждения, не все вещи &&!ask.equals
Также только с помощью одного усилителя;

С помощью третьей, внешней переменной, чтобы направить поток, если заявления

Изменение порядка высказываний (в этот момент я был в отчаянии)

ZurdoDev

1. какая строка кода выполняется, когда вы не думаете, что это должно быть?
2. Отладки кода. Поставьте точку останова и шагните через нее. Отладка является наиболее важным навыком, чтобы узнать, как разработчик.

Richard Deeming

while(loop.equals("true"))

Если бы только Ява была один boolean тип[^] чтобы справиться с такими вещами! :Д

1 Ответов

Рейтинг:
1

Patrice T

Цитата:
Я попытался изменить операторы "else if" на каждую комбинацию и вариацию if, else и else, если бы я мог придумать, а также изменить критерии для всех операторов if
Используя только оператор else для графического интерфейса предупреждения, не все вещи &&!ask.equals
Также только с помощью одного усилителя;
С помощью третьей, внешней переменной, чтобы направить поток, если заявления
Изменение порядка высказываний (в этот момент я был в отчаянии)

Попытка случайных вещей-это не решение, вам нужно понять, что делает ваш код, и есть инструмент, который позволяет вам наблюдать за вашим кодом, когда он выполняет и проверяет переменные. Этот инструмент и есть тот самый отладчик.
-----
Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш cpde, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.
Отладчик - Википедия, свободная энциклопедия[^]
http://docs.oracle.com/javase/7/docs/technotes/tools/windows/jdb.html[^]
https://www.jetbrains.com/idea/help/debugging-your-first-java-application.html[^]
Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.