2014-11-26 1 views
0

У меня есть программа ниже Java.Тип несоответствия при попытке выхода на ketpress

package Arrays; 

import java.util.Scanner; 

public class Arrays { 
    public static void main(String[] args) { 
     final int size = 5; // Size of the input Array 

     Scanner input = new Scanner(System.in); 
     while (!input.equals("q")) { 
      System.out.println("Enter the 5 number you want to be stored in an array"); 

      // get the input of array from the user 
      int a[] = new int[size]; 
      for (int i = 0; i < a.length; i++) { 
       a[i] = input.nextInt(); 
      } 

      /* Methods */ 
      System.out.println("\n"); 
      displayArray(a); // to display the numbers entered in Array 
      System.out.println("\n"); 
      sumOfArray(a);// To print the sum of Array 
      System.out.println("\n"); 
      productOfArray(a);// to print the product of Array 
      System.out.println("\n"); 
      smallAndLargeOfArray(a);// to print the Max and Min number in Array 
      System.out.println("\n"); 
      averageOfArray(a);// to print the average of Array 
      System.out.println("\n"); 
     } 
     input.close(); 
    } 

    private static void displayArray(int arr[]) { 
     System.out.print("The numbers you have inserted are "); 
     for (int i = 0; i < arr.length; i++) { 
      System.out.print(arr[i]); 
      if (i < arr.length - 1) { 
       System.out.print(", "); 
      } 
     } 

    } 

    private static void sumOfArray(int[] arr) { 
     int sum = 0; 
     for (int i = 0; i < arr.length; i++) { 
      sum += arr[i]; 
     } 
     System.out.print("Sum of array is " + sum); 

    } 

    private static void productOfArray(int[] arr) { 
     int prod = 1; 
     for (int i = 0; i < arr.length; i++) { 
      prod *= arr[i]; 
     } 
     System.out.print("Product of array is " + prod); 
    } 

    private static void smallAndLargeOfArray(int arr[]) { 
     int minimim = Integer.MAX_VALUE; 
     int maximum = Integer.MIN_VALUE; 
     for (int i = 0; i < arr.length; i++) { 
      if (minimim > arr[i]) { 
       minimim = arr[i]; 
      } 
      if (maximum < arr[i]) { 
       maximum = arr[i]; 
      } 
     } 
     System.out.print("Minimum and Maximum numbers in array are " + minimim 
       + " and " + maximum); 

    } 

    private static void averageOfArray(int arr[]) { 
     int sum = 0; 
     for (int i = 0; i < arr.length; i++) { 
      sum += arr[i]; 
     } 
     double avg = sum/5; 
     System.out.print("Average of array is " + avg); 

    } 

} 

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

Exception in thread "main" java.util.InputMismatchException 
at java.util.Scanner.throwFor(Unknown Source) 
at java.util.Scanner.next(Unknown Source) 
at java.util.Scanner.nextInt(Unknown Source) 
at java.util.Scanner.nextInt(Unknown Source) 
at Arrays.Arrays.main(Arrays.java:16) 

, пожалуйста, дайте мне знать, где я иду, и как я могу исправить это.

Благодаря

ответ

1

В настоящее время вы пытаетесь сравнить объект типа String, с объектом сканера типа , Результат всегда неверный, вы вводите цикл while и запрашиваете nextInt(), который вызывает несоответствие типа, поскольку следующий токен равен «q».

Вы должны использовать input.findInLine() с регулярным выражением, чтобы посмотреть на следующий токен, не потребляя его, и проверить, удовлетворяет ли оно вашему условию прорыва.

while(input.hasNextLine() && !input.findInLine("^q$")){ 
    //... 
} 

Read:

EDIT: Eddited использовать findInLine, которые не потребляют маркеры.

+0

, но здесь я предполагаю ввести только 5 номеров, но он дает мне возможность ввести 6-й (первый игнорируется). – user3872094

+0

Вы правы. Я отредактировал свой ответ. Метод 'findInLine' смотрит только на вход и не потребляет его. Прошедшее регулярное выражение представляет букву _q_ как первую и последнюю букву или строку. Ознакомьтесь с [Документация] (https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html) класса Scanner. – Dennis

2

Вы должны сделать это как, потому что вы сравниваете ваш Scanner объект

String inputName="" 
Scanner input = new Scanner(System.in); 
inputName= in.nextLine(); 
     while (!inputName.equals("q")) {..} 

как объект сканера не равно «Q» (который является строкой), пробеги в то время как цикл непрерывно. Затем сканер ждет целое число, но он принимает символ. Таким образом, сканер бросает исключение (о том, что входные данные не могут быть преобразованы в целое значение)

Read:

0

Вы используете nextInt() которые ожидали только значения int. Измените его на следующий() и привести значение к междунар если это не q

1

Исключение брошено по линии:

a[i] = input.nextInt(); 

При вводе «д», следующий маркер может не быть бросить в int, так что получите InputMismatchException. Вы должны проверить, является ли следующий токен int, используя метод hasNextInt().

Кроме того, ваше состояние !input.equals("q") не имеет смысла. Здесь вы проверяете, равен ли объект Scanner строке «q». То, что вы хотите сделать, это проверить, является ли следующая лексема объекта Scanner равно строке «д»:

boolean cont = true; 
while (cont) { 
    System.out.println("Enter the 5 numbers you want to be stored in an array"); 

    // get the input of array from the user 
    int a[] = new int[size]; 
    for (int i = 0; i < a.length; i++) { 
     if (input.hasNextInt()) { 
      a[i] = input.nextInt(); 
     } 
     else { 
      String token = input.next(); 
      if ("q".equals(token)) { 
       cont = false; 
       break; 
      } 
      i--; // move back to the last position 
     } 
    } 

    ... 
} 
1

Используйте Sysout вне цикла while и измените свое состояние во время цикла.

System.out.println("Enter the 5 number you want to be stored in an array"); 
     Scanner input = new Scanner(System.in); 
     while (!input.next().equals("q")) { 
      System.out.println("Enter the 5 number you want to be stored in an array"); 
Смежные вопросы