2013-04-07 3 views
1

Я не могу понять, почему я получаю исключение нулевого указателя. Я пытаюсь преобразовать номера строк, которые пользователь вводит после подсказки, и я хочу разграничить это либо пробел «запятая», либо запятая и пробел »,«.Преобразование строкового массива в int с разделителем

Вот мой код, я получаю исключение нулевого указателя в nums [i] = Integer.parseInt (holder [i]); линия. Я просто не могу понять, почему.

String again="n"; 
    int[] nums = null; 

    do { 
     Scanner scan = new Scanner (System.in); 

     System.out.println("Enter a sequence of integers separated by a combination of commas or spaces: "); 
     String in=scan.nextLine(); 
     String[] holder=in.split(",| |, "); 

      for (int i=0; i<holder.length; i++) { 

       nums[i]=Integer.parseInt(holder[i]); 
       System.out.print(nums[i]); 
      } 


    } 
    while (again=="y"); 

Ok Спасибо всем, я получил это работает инициализация длины массива Nums к длине массива держателя, как предложено в принятом ответе. Как это:

int[] nums = new int[holder.length]; 

У меня есть второй вопрос, хотя, как мое регулярное выражение кажется, терпит неудачу, я могу заставить его читать, если очерчены «» или „“, но не «» какие-либо идеи?

Вот моя ошибка:

Enter a sequence of integers separated by a combination of commas or spaces: 
    1, 2, 3 
    Exception in thread "main" 1java.lang.NumberFormatException: For input string: "" 
    at java.lang.NumberFormatException.forInputString(Unknown Source) 
    at java.lang.Integer.parseInt(Unknown Source) 
    at java.lang.Integer.parseInt(Unknown Source) 
    at SortComparison.main(SortComparison.java:20) 
+1

Вы не указали размер массива? –

+0

Как вы думаете, если я использую список, он будет работать без объявления размера? – salty

+1

Да, попробуйте использовать список. –

ответ

2

Ваше исключение нулевого указателя вызвано тем, что вы инициализировали массив nums равным null, а затем попробуйте «указать» его в цикле for. Вы можете потерять int[] nums = null и добавить:

int[] nums = new int[holder.length]; 

непосредственно перед циклом (после того, как вы создали массив держателя, очевидно).

+1

Я закончил это, потому что это простая программа, и это легче управлять, чем список. – salty

+1

Действительно. В целом, однако, списки очень полезны. Я использую их много раз чаще, чем сейчас использую массивы. – drewmoore

+0

Я могу закончить смену, я не использовал их очень часто, но мне, в конце концов, придется поместить это в сорт, и на более крупных входах будет легче справиться – salty

0

Лучше напечатать ваш holder[i] перед разбором его в Integer, чтобы увидеть, что в нем. Я предполагаю, что holder[i] не имеет допустимого значения для целого.

+0

Может ли это привести к исключению NullPointerException? –

+0

Я не уверен, но я вижу, что 'i' меньше, чем' length', и он утверждает, что строка, которая генерирует исключение, есть. Таким образом, это может вызвать исключение; а не 'NullPointerException'. –

1

Вы установили

int[] nums = null; 

, а затем попытаться получить доступ к

num[i] 

, который дает вам NullPointerException. Сначала вам нужно сконструировать массив для хранения необходимого количества элементов:

int[] nums = new int[holder.length] 
Смежные вопросы