Проблемы с Java - входные данные сканера и операторы If (X == Input)
Я только что прочитал семь тем, связанных с проблемами сканера Java, но ни одна не содержала ответа на мою проблему.
Я пытаюсь получить пользовательский ввод с консоли. Я создаю объект "Сканер" (вход), затем пытаюсь сохранить команду пользователя в строке с именем "команда". Затем я передаю "команду" обратно в исходную функцию runGame. Кажется, что сканер / команда действительно читает текст записи. (Если я ввожу 'd', а затем печатаю содержимое команды, она печатает 'd'.)
Но когда я возвращаю строку и сохраняю ее в nextMove, она ломается. Например, я введу "d", но затем (nextMove == "d"), если оператор не вызывается. Фактически, что бы я ни вводил, вводится только оператор else.
Что я делаю неправильно? Как я могу это исправить
Вот оригинальный код функции:
public void runGame() {
drawWindow();
while(true) {
String nextMove = takeInput();
if(nextMove == "d")
System.out.print("WORRRRDDD d");
else if(nextMove == "w")
System.out.print("WORRRRDDD w ");
else {
drawWindow();
System.out.print("YOU GOT ELSED");
continue;
}
}
}
А вот код функции takeInput/Scanner:
public String takeInput() {
String command;
input = new Scanner(System.in); // "input" is the Scanner object used for all input.
try{
System.out.print("Enter command (d, w, stop, restart, exit): ");
command = input.next();
} catch(Exception e) {
System.out.println("You entered an invalid command.");
return null;
}
System.out.println("\n RETURNING COMMAND" + command + " \n");
return command;
}
Пока вы помогаете (я собираюсь искать, но если я его не найду), как лучше распознать пустой ввод в объекте сканера?
И должны ли быть какие-либо другие исключения / ловушки, о которых мне нужно беспокоиться при вводе пользователем в консоли?
4 ответа
Вместо того, чтобы использовать ==
использовать .equals(String)
так что ваш чек будет выглядеть так:
if(nextMove.equals("d"))
==
проверяет, что переменные являются одинаковыми ссылками в памяти, .equals()
проверяет, что два экземпляра логически эквивалентны.
Как уже говорили другие, используйте.equals при проверке на равенство между строками.
Кроме того, всякий раз, когда у вас есть константа в проверке равенства, вы должны поставить ее первой. например
"abc".equals(someString);
Это будет только логическое значение. В то время как:
someString.equals("abc");
Это может быть логическое значение или исключение NullPointerException.
Вы не должны использовать == для сравнения строк, если я правильно помню, использовать сравнить, сравнить или равно.
Вы не должны использовать метод "==" для сравнения двух строковых объектов. Вам нужно будет использовать метод.equals().
Ваша измененная часть кода должна выглядеть так:
if(nextMove.equals("d"))
System.out.print("WORRRRDDD d");
else if(nextMove.equals("w"))
System.out.print("WORRRRDDD w ");
Зачем? отсюда
Оператор "==" сравнивает две ссылки на объекты, чтобы определить, ссылаются ли они на один и тот же экземпляр. Он проверяет, являются ли два объекта абсолютно одинаковыми или нет. Две строки могут быть разными объектами, но могут иметь одинаковое значение (иметь одинаковые символы в них). В таком случае "==" вернет false.
Будьте особенно внимательны при сравнении объектов. Если вы хотите увидеть, являются ли два объекта одинаковыми или нет, используйте "==" для или используйте equal(), чтобы увидеть, имеют ли они одинаковое значение.
Также проверьте следующие ссылки:
http://www.zparacha.com/java-string-comparison/
http://www.devdaily.com/java/edu/qanda/pjqa00001.shtml
http://www.javabeginner.com/learn-java/java-string-comparison