Проблемы с 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

Другие вопросы по тегам