Остановить сканер от чтения пользовательского ввода java?

Я пытаюсь написать этот метод, который продолжает читать от пользователя, пока не будет введено слово «выход». Я пробовал с перерывом и циклом for; это не сработало. Я пытался с помощью while, но он не останавливается, даже когда вводится слово «выход». Любые идеи, как это исправить? Спасибо.

public void read(Scanner scanner){

while(3<4){
String in = scanner.nextLine();
Scanner scanner_2 = new Scanner(in);

String name = null;

if(scanner_2.hasNext()){
  //create and add the user to the user container class
  name = scanner_2.next();
  System.out.println(name);
}

if(name == exit)
//stop or break the while loop
}
}

person FranXh    schedule 12.05.2012    source источник
comment
Вместо while(3<4) почему бы просто не использовать while(true)?   -  person Jeffrey    schedule 12.05.2012
comment
Спасибо за предложение. Я не знал, что могу это сделать   -  person FranXh    schedule 12.05.2012


Ответы (4)


name == exit неправильно.

Ты хочешь

name.equals(exit)

or

name.equals("exit")

в зависимости от того, является ли выход переменной или строковым литералом соответственно. В Java == означает равенство ссылок (например, эти две ссылки указывают на один и тот же адрес в памяти), тогда как .equals означает эквивалентность объектов, которая обычно overriden в классе разработчиком.

person Amir Afghani    schedule 12.05.2012
comment
Я думаю, что это была проблема, часть равных. Теперь это работает. Большое спасибо :D - person FranXh; 12.05.2012

if(name == exit)

неправильно это правда.

Но убедитесь, что при сравнении двух строк, когда одна строка является постоянной, например. "exit" затем убедитесь, что он стоит первым при сравнении.

то есть его следует сравнивать как

if ("exit".equals(name))

Не так, как показано ниже

if (name.equals("exit"))

Основная причина создания «exit» в качестве первого значения заключается в том, что если имя равно null, то оно не сработает NullPointerException, но если мы поместим name в качестве первого объекта для сравнения, тогда, если имя равно null, тогда будет сгенерировано исключение NullPointerException, поэтому убедитесь, что это вещь в любое время в будущем.

person Bhavik Ambani    schedule 12.05.2012

Ответ Амира на 100% правильный. Кроме того, используйте true внутри цикла while, и я думаю, что в этом случае лучше использовать оператор else... if. Читабельнее, вот почему :)

person JustCause    schedule 12.05.2012

Предполагая, что String exit = "exit"; объявлен где-то на уровне класса:

name == exit 

проверяет, являются ли объект, на который ссылается name, и объект, на который ссылается exit, одинаковыми. Что вы хотите, независимо от того, совпадают ли значение объекта, на который ссылается name, и значение объекта, на который ссылается exit.

Вы делаете это по

if(name.equals(exit))

Тем не менее, есть много вещей, которые можно улучшить в коде. Я понимаю, что вы, вероятно, пишете этот код для изучения Java, но все же некоторые небольшие изменения могут сделать код более читабельным.

Кроме того, второй сканер, который вы используете, вообще не нужен.

Следующий код будет делать то же самое, что и ваш код, но он меньше и читабельнее.

    String name = "";
    while(!name.equals("exit")) {
        if(scanner.hasNext()) {
            //create and add the user to the user container class
            name = scanner.next();
            System.out.println(name);
        }

    }

На самом деле код можно улучшить следующим образом:

String name = null;
while(scanner.hasNext() && !(name = scanner.next()).equals("exit")) {
    System.out.println(name);
}

Но я думаю, что вы учитесь, и это может быть слишком много, когда вы учитесь.

person Nivas    schedule 12.05.2012