Ошибка: Исключение в потоке "main" java.lang.NumberFormatException: Для входной строки: "" - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь ввести числа как string, разделить и сохранить их в массиве string, а затем сохранить их как целые числа в массиве int. Я пробовал довольно много вещей, таких как .trim() или scanner.skip(), но не могу решить эту проблему здесь.

Мой вклад:

4 
1 2 2 2

 public static void main(String []args) throws IOException{

    Scanner scanner = new Scanner(System.in);
    int arCount = scanner.nextInt();
    int[] ar = new int[arCount];
    String[] arItems = scanner.nextLine().split(" ");

    for (int i = 0; i < arCount; i++) {
        int arItem = Integer.parseInt(arItems[i].trim());
        ar[i] = arItem;
    }
    scanner.close();
 }

Получена ошибка:

Exception in thread "main" java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:592)
at java.lang.Integer.parseInt(Integer.java:615)
at Hello.main(Hello.java:32)

Ответы [ 3 ]

0 голосов
/ 03 ноября 2018

Вы можете перехватить исключение и пропустить плохие записи.

Я бы также предложил разделить один или несколько пробелов, чтобы пустые строки не начинались с

Scanner scanner = new Scanner(System.in);
int arCount = scanner.nextInt();
scanner.nextLine();
int[] ar = new int[arCount];
String[] arItems = scanner.nextLine().split("\\s+");

for (int i = 0; i < arCount; i++) {
    try {
        ar[i] = Integer.parseInt(arItems[i].trim());
    } catch (NumberFormatException e) {
        System.err.println(arItems[i] + " is not an int");
    }
}
0 голосов
/ 03 ноября 2018

Почему бы вам просто не использовать метод nextInt () снова и снова (полностью обходя использование split), например,

import java.util.*;

public class MyClass {
    public static void main(String []args){

    Scanner scanner = new Scanner(System.in);
    int arCount = scanner.nextInt();

    int[] ar = new int[arCount];
    for(int i=0;i<arCount;i++){
        ar[i] = scanner.nextInt();;
    }
    System.out.println(Arrays.toString(ar));

    scanner.close();
 }
}

UPDATE:

В исходной программе вы сначала используете метод nextInt (), который не использует символ новой строки '\ n'. Таким образом, следующий вызов nextLine () фактически использует символ новой строки в той же строке, а не строку ниже той, которая содержит целые числа для вашего массива. Таким образом, чтобы ваш код работал правильно, вы можете немного изменить его следующим образом:

import java.util.*;

public class MyClass {
    public static void main(String []args){

    Scanner scanner = new Scanner(System.in);
    int arCount = scanner.nextInt(); // doesn't consume \n
    int[] ar = new int[arCount];
    scanner.nextLine(); //consumes \n on same line 
    String line = scanner.nextLine(); // line is the string containing array numbers
    System.out.println(line);
    String[] arItems = line.trim().split(" "); //trim the line first, just in case there are extra spaces somewhere in the input
    System.out.println(Arrays.toString(arItems));
    for (int i = 0; i < arCount; i++) {
        int arItem = Integer.parseInt(arItems[i].trim());
        ar[i] = arItem;
    }
    System.out.println(Arrays.toString(arItems));
 }
}
0 голосов
/ 03 ноября 2018

Возможно, попробуйте использовать .trim () после Scanner.nextLine ().

String[] arItems = scanner.nextLine().trim().split(" ");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...