Возникла исключительная ситуация при добавлении элемента в ArrayList - PullRequest
1 голос
/ 11 августа 2011

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

В строке, где я использую метод add, я получаю исключение нулевого указателя, Все вышеперечисленные значения печатаются в консоли)

sid = new ArrayList<String>();
Enumeration e = Global.qtutlist.keys();
int qj=0; 
//iterate through Hashtable keys Enumeration
while(e.hasMoreElements())
{
    System.out.println("sid is key and its value id" );
    System.out.println(Integer.parseInt(e.nextElement().toString()));
    try
    {
        sid.add(e.nextElement().toString());
        System.out.println("lenght is "+ sid.size());
    }

    catch(Exception ex)
    {
        System.out.println("caught exception is"+ex.getMessage());

    }
}

Ответы [ 6 ]

5 голосов
/ 11 августа 2011

Вы вызываете nextElement() дважды в цикле и проверяете один раз

, сделайте это следующим образом

while(e.hasMoreElements())
        {   String item = e.nextElement().toString()
            System.out.println("sid is key and its value id" );
            System.out.println(Integer.parseInt(item));
            try{
            sid.add(item);
            System.out.println("lenght is "+ sid.size());
            }catch(Exception ex){
                System.out.println("caught exception is"+ex.getMessage());
            }
        }

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

2 голосов
/ 11 августа 2011

Вы звоните

e.nextElement()

Дважды. Сохраните его в переменной и используйте вместо него

while(e.hasMoreElements()) {
    Object o = e.nextElement();
    // ...
}
1 голос
/ 11 августа 2011

Вы используете e.nextElement () дважды. Это не может работать. В перечислениях используется шаблон проектирования Iterator, что означает, что вы можете получить доступ к каждому элементу только один раз, прежде чем внутренний счетчик перейдет к следующему объекту. Обратите внимание, что hasMoreElements () не перемещает курсор, а только nextElement ().

Сохраните результат в локальной переменной и повторно используйте это:

System.out.println("sid is key and its value id" );
String str = e.nextElement().toString();
System.out.println(Integer.parseInt(str));
try{
    sid.add(str);
    System.out.println("lenght is "+ sid.size());
}catch(Exception ex){
    System.out.println("caught exception is"+ex.getMessage());
}
0 голосов
/ 11 августа 2011

Вы проверяете e.hasMoreElements() один раз и вызываете e.nextElement() дважды в цикле. Каждый вызов nextElement() увеличивает внутренний маркер, поэтому каждый раз, когда количество элементов в вашем перечислении составляет нечетное , вы получаете NPE.

0 голосов
/ 11 августа 2011

Вы вызываете nextElement дважды, когда проверяете наличие элемента только один раз.

0 голосов
/ 11 августа 2011

e.nextElement () является нулем, что является причиной, и вы выполняете операцию toString () с нулем

...