Что означает этот код ошибки? Исключение в потоке main java.util.InputMismatchException

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

Exception in thread "main" java.util.InputMismatchException
    at java.base/java.util.Scanner.throwFor(Scanner.java:939)
    at java.base/java.util.Scanner.next(Scanner.java:1594)
    at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
    at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
    at PhoneBill3.main(PhoneBill3.java:17)

import java.util.Scanner;
public class PhoneBill3
{
   public static void main (String [] args)
   {
      double acctNum;
      int svcType=0;
      int dtmin=0;
      int ntmin=0;
      int dtFree=50;
      int ntFree=100;
      int minUsed=0;
      Scanner scan= new Scanner (System.in);
      System.out.print ("Please enter your account number: ");
      acctNum=scan.nextDouble();
      System.out.println ("Service type (R/P): ");
      svcType = scan.nextInt ();
      System.out.print("You entered " +svcType);

      //using switch to decide what to do with user input
      switch (svcType)
      {
         case 'R': 
         //if case R is entered, this should prompt the user to enter          
total minutes used and determin the cost of the Regular bill
            System.out.println ("Total minutes used: ");
            minUsed=scan.nextInt ();
            if (minUsed<50){
               System.out.println ("Account number: " + acctNum);
               System.out.println ("Account type: Regular");
               System.out.println ("Total minutes: " + minUsed);
               System.out.println ("Amount due: $15.00");}
            else{
               System.out.println ("Account number: " + acctNum);
               System.out.println ("Account type: Regular");
               System.out.println ("Total minutes: " + minUsed);
               System.out.println ("Amount due: $"+ 15 + (minUsed-    
50)*.2);}
            break;
         case 'P':
         //if case P is entered, this should prompt the user to enter     
day time and night time minutes used
            System.out.println ("Number of daytime minutes used: ");
            dtmin=scan.nextInt ();
            double dtTtlDue=0.00;
            System.out.println ("Number of nighttime minutes used: ");
            ntmin=scan.nextInt ();
            double ntTtlDue=0.00;
            dtTtlDue= (dtmin-dtFree)*.2;
            ntTtlDue= ((ntmin-ntFree)*.1);
            System.out.println ("Account number: " + acctNum);
            System.out.println ("Account type: Premium");
            System.out.println ("Daytime Min: "+ dtmin);
            System.out.println ("Nighttime Minutes: " + ntmin);
            System.out.println ("Amount due: $" + 25.00+ dtTtlDue + 
ntTtlDue);
            break;
       default:
            System.out.println ("That is not a valid service type. 
Enter R for regular or P for premium.");
            break;

       }

    }
}

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


person Jessi Kruger    schedule 09.02.2019    source источник
comment
На какую строку кода указывает сообщение об ошибке? Обычно InputMismatchExceptions являются проблемой с вашим сканером, возможно, см. этот другой вопрос для подсказки! stackoverflow.com/questions/21143028 /   -  person IanGabes    schedule 09.02.2019
comment
svcType = scan.nextChar();   -  person Jessi Kruger    schedule 09.02.2019
comment
@ian есть идеи?   -  person Jessi Kruger    schedule 09.02.2019


Ответы (2)


Это происходит потому, что вы читаете ввод R & P как int. Вы должны читать его как String Пожалуйста, измените

System.out.println ("Service type (R/P): ");
svcType = scan.nextInt ();

to

System.out.println ("Service type (R/P): ");
svcType = scan.next ().charAt(0);
person Ratish Bansal    schedule 09.02.2019
comment
по какой-то причине, если я это сделаю, я получаю эти сообщения об ошибках, ---- jGRASP exec: javac -g PhoneBill3.java PhoneBill3.java: 21: ошибка: несовместимые типы: char не может быть преобразован в строку, если (svcType = 'R' ) ^ PhoneBill3.java:21: ошибка: несовместимые типы: строка не может быть преобразована в логическое значение, если (svcType='R') - person Jessi Kruger; 09.02.2019
comment
и если я сделаю это символом, я получу это: PhoneBill3.java: 17: ошибка: не удается найти символ svcType = scan.nextChar (); ^ символ: метод nextChar() расположение: переменная scan типа Scanner - person Jessi Kruger; 09.02.2019
comment
Вы должны вводить только R, а не «R» или R - person Ratish Bansal; 09.02.2019
comment
Когда я это делаю, он говорит, что не может найти символ - person Jessi Kruger; 09.02.2019
comment
вы должны ввести char как svcType = scan.next ().charAt(0); - person Ratish Bansal; 09.02.2019
comment
Если я объявляю R и P как строковую переменную, он говорит, что String не может преобразоваться в логическое значение. - person Jessi Kruger; 09.02.2019
comment
Ничего не делайте, просто измените его на svcType = scan.next ().charAt(0); - person Ratish Bansal; 09.02.2019
comment
Итак, я сделал то, что вы сказали, и теперь это дает мне это: PhoneBill3.java: 20: ошибка: несовместимые типы: логическое значение не может быть преобразовано в char, если (svcType = R) ^ PhoneBill3.java: 20: ошибка: несовместимые типы: char не может быть преобразовано в логическое значение, если (svcType=R) ^ PhoneBill3.java:35: ошибка: несовместимые типы: логическое значение не может быть преобразовано в char, если (svcType=P); ^ PhoneBill3.java:35: ошибка: несовместимые типы: char нельзя преобразовать в логическое значение, если (svcType=P); - person Jessi Kruger; 09.02.2019
comment
его работающее свойство на моей машине. Что вы изменили? Просто замените svcType=scan.nextInt() на svcType = scan.next().charAt(0); - person Ratish Bansal; 09.02.2019
comment
пожалуйста, проголосуйте и отметьте ответ как проверенный, если это сработало для вас - person Ratish Bansal; 09.02.2019

Вы просите пользователя ввести значение String (длиной 1) и пытаетесь присвоить его переменной int (svcType). Вам нужно внести 2 изменения:

1) Измените тип переменной svcType на тип char:

char svcType = '?';

2) Извлеките только первый символ ввода из пользовательского ввода:

scan.next().charAt(0);

Вы также можете toUpperCase() ввести строчные буквы 'r' или s':

scan.next().toUpperCase().charAt(0);
person pczeus    schedule 09.02.2019