Вопрос по java, switch-statement, string-comparison – Java: как использовать оператор switch [duplicate]

2

Possible Duplicate:
How do I compare strings in Java?

У меня возникли проблемы с пониманием, как использовать оператор переключения Java. После выполнения метода в одном из операторов case он все равно переходит к оператору по умолчанию и выполняет его тоже. Вот код:

Scanner scanner = new Scanner(System.in);
String option = null;

while (option != "5") {
    ShowMenu();
    option = scanner.nextLine();
    switch (option) {
        case "1": ViewAllProducts(); break;
        case "2": ViewProductDetails(scanner); break;
        case "3": DeleteProduct(scanner); break;
        case "4": AddProduct(scanner); break;
        case "5": break;
        default: System.out.println("Invalid option. Please try again."); break;
    }
}

Приведенный выше код в основном методе. После запуска дела "4" например, он печатает & quot; Неверный параметр. & quot;

Вот это да. спасибо всем ... за то, что я программист на C #, это очень странно ... у нас нет этой проблемы в C #. Вышеупомянутое не будет проблемой вообще. Очень интересный LOL. Matt
Должно бытьwhile(!"5".equals(option)) { } adatapost
Проблема в ссылочном равенстве и значении равенства, и в C # эта проблема тоже есть, но, к счастью, перегрузка строки в C #== оператор. Premraj
Возможно, это связано с тем, что в вашем методе вы используете сканер, переданный для чтения некоторого ввода, предпочтительно используя методscanner.nextInt() или жеscanner.next(), УвидетьScanner.next() а такжеScanner.nextLine() Больше подробностей. Rohit Jain
Согласно документам, если вы используетеscanner.next() или жеscanner.nextInt() методы, то вы читаете ввод до конца строки, ноSkipping последнийNewLine персонаж. Таким образом, если у вас естьscanner.nextLine() незамедлительно послеscanner.next(), ваша nextLine () будет читать следующий символNewLine оставленоscanner.next() и читать его как одну строку (хотя и пустую). И тогда ваш следующийscanner.nextLine() прочтет строку, которую вы ожидали прочитать первым. Так что, похоже, ваш звонокscanner.nextLine() пропустил к следующему звонку .. Rohit Jain

Ваш Ответ

6   ответов
1

Я изменяю ваш код, чтобы повторно инициализировать ссылку на сканер перед чтением новой опции.

    Scanner scanner = new Scanner(System.in);
    String option = null;

    ShowMenu();
    option = scanner.nextLine();

    while (!"5".equals(option)) {
        switch (option) {
            case "1": ViewAllProducts(); break;
            case "2": ViewProductDetails(scanner); break;
            case "3": DeleteProduct(scanner); break;
            case "4": AddProduct(scanner); break;
            case "5": break;
            default: System.out.println("Invalid option. Please try again..."); break;
        }
        ShowMenu();
        scanner = new Scanner(System.in);  // Add this here

        option = scanner.nextLine();    // Use brand new scanner without any problem..
    }

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

@ Matt. Добро пожаловать :)
Спасибо за хорошие объяснения в другом ответе и комментариях. Matt
Осторожно: если вы не понимаетеwhy вам нужно создать новый сканер, это всего лишь «программирование вуду».
0

I stopped passing scanner to each function and created a new one inside each function instead. That fixed the problem. So, I figured out that problem.. but, I want to know why..

Если вы разместили SSCE, мы могли бы ответить на это. К сожалению, описываемое вами поведение включает в себя код, который вы нам не показали.

is this a bug in Java or normal?

этоhighly unlikely что это ошибка Java.Scanner код был в Java в течение нескольких лет, и любые существенные ошибки, вероятно, встречались ранее и были исправлены.

С другой стороны, я не могу думать ни о какой причине,Scanner метод будет иметь значениеper se.

Но суть в том, что без SSCE невозможно выяснить, что на самом деле делает ваш код ... и объяснить причину.

If I can understand why this is a problem then I can avoid it in future with other classes too.. unless this only happens with Scanner?

Без SSCE мы не сможем помочь вам понять.

1

Ваш scanner.nextLine () должен быть вне вашего времени. И вообще do-while используется лучше в сочетании с коммутатором. Итак, вы можете лучше пойти с этим ..

Общее использование do-while с switch-case, когда вы читаете от пользователя, выглядит так:

boolean flag = false;
do {
    String option = scanner.nextLine();
    switch (option) {
        case "1": break;
        case "2": break;
        default : flag = true;
                  break;
    }
} while(! flag);

И одна важная вещь, которую нужно знать:Strings are Immutable на Яве ..

Как правило, для сравнения строк в Java, вы должны использовать функцию equals (), если вы хотите сравнить их значения. А также, я предлагаю вам переопределить методы equals () и hashcode () в вашем классе (в будущем, если вы сделаете таковой) ), чтобы сравнить два экземпляра вашего класса ..

На самом деле, есть большая разница между == и equals (). Это на самом деле зависит от того, как вы создаете свою строку .. Например, предположим, что это ваш код:

String a = "5"; 
String b = new String("5");
String c = "5"; or String c = a;

System.out.println("a == b?" + (a == b));  // Will Print false
System.out.println("a.equals(b)?" + a.equals(b));   // Will Print true..

System.out.println("a == c?" + (a == c));  // Will Print true
System.out.println("a.equals(c)?" + a.equals(c));   // Will Print true..

В приведенном выше коде ваши String ссылаются на 'a'; и "с"; указывают на один и тот же объект, представленный как "5". Принимая во внимание, что ссылка "b" указывает на другой объект "5", потому что используется "новый" оператор для создания строки всегда создает новый объект ..

Сейчас,== operator проверяет, указывает ли сравниваемая ссылка String на один и тот же объект или на другой, тогда какequals() Функция сравнивает фактическое значение, содержащееся в двух строковых объектах.

Итак, вывод в программу теперь будет понятен .. Я только что объяснил это, потому что в то время как вы будете использовать функцию equals (), чтобы проверить, является ли ваш & quot; параметр & quot; ссылка имеет то же значение, что и "5".

Теперь я думаю, что вы можете немного изменить свой код и, желательно, использовать do-while, чтобы получить требуемый вывод ..

Благодарю. Я попробую и посмотрю ваше решение. Matt
1

Я думаю, что проблема в состоянии цикла while. Можете ли вы изменить условие наwhile(!"5".equals(option)) а затем попробуйте запустить проблему.

Надеюсь, это поможет вам.

7
  while (!option.equals("5")){...}

использование.equals() для сравнения строк.

== сравнить строковые ссылки (расположение в памяти) .equals() сравнить строковое значение

6

Вы сравниваете строки с== в вашем состоянии while (которое сравнивает ссылки вместо значений -использованиеequals method for value equality), в то время как цикл должен быть изменен на следующий -

while (!option.equals("5"))

Работает в C # без нареканийперегрузка оператора в то время как перегрузка операторане допускается в Яве (хотя & quot; + & quot; перегружен для строк и чисел)

пожалуйста, смотрите мое редактирование. Это еще не решено. Matt
@Matt - Все в порядке .. Я все еще добавил разъяснение :)
@Matt, пожалуйста, замените ваш println в случае по умолчанию на -System.out.println("Invalid option. Please try again...'"+option+"'") и обновить вопрос с выводом
Спасибо за правильный ответ, но было бы полезно, если бы вы также объяснили, почему. Итак, я буду +1 для вас за то, что вы первый, но Самир помечается как "answer" Matt

Похожие вопросы