2013-09-23 3 views
1

Я хотел превратить строку целых чисел с одной цифрой в ArrayList Integer, и я получаю очень странное исключение. Вот пример кода:NumberFormatException: для строки ввода: "" при разборе

Scanner test = new Scanner(System.in); 
    String[] temp = null; 
    String line = null; 
    ArrayList<Integer> artemp = new ArrayList<>(); 

    while(test.hasNext()) { 
     line = test.next(); 
     temp = line.split(""); 
     for(int i = 0; i < temp.length; i++) 
     artemp.add(Integer.parseInt(temp[i])); 
     for(int i : artemp) System.out.println(i); 

    } 

Это в основном предполагается прочитать строку Интс из стандартного ввода, поместите их в ArrayList в качестве примитивов, а затем распечатать их. Конечно, это всего лишь небольшой тестовый пример, на который я сузил мою большую ошибку.

Исключение здесь возникает следующая:

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:504) 
    at java.lang.Integer.parseInt(Integer.java:527) 

Насколько я могу видеть, следующее должно иметь место:

  1. line принимает стандартный ввод
  2. temp наполняется каждый от отдельных однозначных значений (разделение («») делится после каждого символа)
  3. Каждая цифра (хранится как String) анализируется как int и добавляется к artemp
  4. Распечатывайте каждую цифру.

Что именно здесь происходит? Если я распечатать temp со следующим кодом:

for(String s : temp) System.out.println(s); 

Затем цифры получить успешно печатается (в виде строк), и я нет никаких дополнительных символов. Как точно можно было бы применить parseInt(temp[i]) к строке ""?

+0

Вы хотите преобразовать строку say - '1234', в отдельные цифры? –

ответ

0

Прежде всего я заподозрить свой раскол,

temp = line.split(""); 

Если вы хотите разделить с пространством, он должен быть

temp = line.split(" "); 

И если вы хотите с "" только, то здесь причина.

Обращение никогда не имеет отношения.

В вас есть пустые строки array.

Такое исключение при преобразовании пустой строки в целое.

здесь

artemp.add(Integer.parseInt(temp[i])); 

Что вы можете сделать, это проверить данные перед разбором.

if(temp[i]!=null && !temp[i].isEmpty()){ 
      artemp.add(Integer.parseInt(temp[i])); 
} 
+0

Иногда это самый простой из вещей. Спасибо за ваш быстрый ответ! Для полноты моей стратегии синтаксического анализа было бы более эффективным, чем использование 'line.substring (...)'? Или прибыль незначительна? Поскольку ваш ответ был первым, я буду принимать его в 5 м. – user991710

+0

Да. Я не думаю, что это слишком важно для моего текущего кода, но я не могу найти хороших сравнений между 'split' и' substring'. – user991710

+0

Рад, это помогло. Вы спрашиваете об использовании подстроки вместо разделения? Если это так, я скажу, что идут с помощью метода split.substring не нужно, в этом случае производительность может быть незначительной разницей/микро оптимизацией . Идите для чистого и читаемого кода. Сделайте код как можно меньше с помощью встроенных методов. Эта подстрока требует еще нескольких проверок снова .. как длина и т. Д. –

0

С Документах parseInt

Throws: 
    NumberFormatException - if the string does not contain a parsable integer. 

Так что ваш код artemp.add(Integer.parseInt(temp[i])); некоторые где encoutering с неразборчивым String.

0

вашего раскол («») имеет нулевое значение, вы должны написать раскол (»«) (двойные кавычки с пробелом)

0

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

Scanner test = new Scanner(System.in); 
String[] temp = null; 
String line = null; 
ArrayList<Integer> artemp = new ArrayList<>(); 

while(test.hasNext()) { 
    line = test.next(); 
    for(int i = 0; i < line.length; i++) 
     artemp.add(Integer.parseInt(""+line.charAt(i)); 
    for(int i : artemp) System.out.println(i); 
} 
Смежные вопросы