2013-05-15 6 views
2

У меня есть фрагмент кода, который иногда вызывает NullPointerException. Пока что не очень интересно. Но исключение происходит в строке, которая не ссылается ни на какой объект.NullPointerException без ссылки на какой-либо объект

try 
    { 
     parser.parse(input);/*line 186*/ 
    } 
    catch(Exception e) 
    { 
     //NPE happens in the next line? 
     throw new SAXException("Error parsing document", e);/*line 190*/ 
    } 

Здесь StackTrace

java.lang.NullPointerException 
    at com.tejoe.MyXMLParser.parse(MyXMLParser.java:190) 
    at com.tejoe.MyXMLParser.parse(MyXMLParser.java:168) 
    .... 

Это произошло только два раза в течение последних трех месяцев и код работать по крайней мере в сто тысяч раз.

Я уже декомпилировал свой код, чтобы убедиться, что информация о линии верна и да.

Дополнительные испытания

Там, кажется, что-то особенное с SAXException. Я сделал следующий тест:

import org.xml.sax.SAXException; 

public class Test 
{ 
    public static void main(String[] args) throws Exception 
    { 
    new SAXException("Error", new NullPointerException()).printStackTrace(); 
    } 
} 

я получил следующий вывод

java.lang.NullPointerException 
    at Test.main(Test.java:7) 
Caused by: java.lang.NullPointerException 
    ... 1 more 

Решение: SAXException переопределяет метод ToString, чтобы вернуть Название причины Exception.

Теперь я только удивляюсь, что я не получил вызвано выходом в производственной среде (AIX JAVA)

+0

parser.parse (вход); - парсер Null? вводит Null? – madhairsilence

+2

Вы уверены, код, который вы показываете, из файла FwXMLParser.java, а не там, где вы используете этот класс? –

+0

Я не уверен, что декомпиляция ничего не докажет в отношении номеров строк, если только она не сохраняет пустое пространство (что я сомневаюсь). –

ответ

1

Я написал следующий код и сгенерировал исключение нулевого указателя. Он пришел по строке 45 следующим образом:

Exception in thread "main" java.lang.NullPointerException 
    at inheritance.parent.Child.main(Child.java:45) 

import org.xml.sax.SAXException; 

public class Child { 

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

     try{ 
     Child c1 = null; 
     c1.i=0; 

     } catch(Exception e){ 
      throw new SAXException("Error", e); //Line : 45 
     } 
    } 
} 

Ошибка для вашего кода. Вам нужно найти, какой объект вы получаете null.

+0

Так что изменение броска для e.printStackTrace() покажет правильную ошибку линии –

+0

Я думаю, что это решение. Кажется, что-то особенное с SAXException. Я получаю исключение NullPointerException в строке 45, вызванное NullPointerException in Line (c1.i = 0;). Когда я заменяю исключение SAXException любым другим Исключением. Другое исключение бросается с NPE в качестве причины. Просто замените SAXException RuntimeException и получите его. Я предполагаю, что в моем коде что-то внутри метода parse терпит неудачу. – tejoe

1

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

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

+0

У меня была такая же идея, поэтому я уже проверил. Нет, это не изменилось. Код тот же, что и с 2005 года. Я также подумал, что кто-то может создать выпуск с измененными источниками uncommit, поэтому я декомпилировал выпущенный выпуск. – tejoe

+1

@tejoe Вы, должно быть, ошибаетесь. Эти вещи не лгут! Или вы смотрите на неправильный файл, как [предлагается в комментариях] (http://stackoverflow.com/questions/16564290/nullpointerexception-without-referencing-any-object/16564324#comment23798472_16564290). –

+0

Ошибка SAXException, потому что реализация toString() принимает имя причины для себя. В строке 190 не было NPE. – tejoe

0

Заменить строку:

throw new SAXException("Error parsing document", e); 

с

e.printStackTrace(); 

вы найдете правильную линию ошибки.

Смежные вопросы