2013-06-24 28 views
0

我正在製作Android應用程序,爲此我必須執行一些XML解析。我遵循了一個可行的例子,但是當我嘗試爲我的用法調整示例時,我得到一個空指針異常,我不明白。這應該包含所有相關的代碼位。問題是在這個snippit的底部附近的線在Log.e("5", "5")和相應的"6"Element docEle = dom.getDocumentElement();在Java中使用DOM解析器時爲空異常

任何想法?

public class Parser { 

//Constructor 
ArrayList<Response> responseList; 
ArrayList<ResourceType> resourceTypeList; 
List myEmpls; 
Document dom; 

public Parser() 
{ 
    responseList = new ArrayList<Response>(); 
    resourceTypeList = new ArrayList<ResourceType>(); 
    myEmpls = new ArrayList(); 
} 

public void addRequest(int reportId) 
{ 
    Request request = new Request(reportId); 
    Response response = new Response(request); 
     //Form XML in LoadReport Request 
     //Send XML 
     //Receive and parse 
    parseReportResponse(); 
     //Input information into response 
     //Form XML in GetRoomData request 
     //Send XML 
     //Receive and parse 
     //Input information into response 
    responseList.add(response); 
    Log.e("5", "5"); 
} 
public void parseReportResponse() 
{ 
    parseReportXML(); 
    parseReportDocument(); 
} 

public void parseReportXML() 
{ 
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    try { 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     dom = db.parse("LoadReportResponse.xml"); 

    }catch(ParserConfigurationException pce) { 
     pce.printStackTrace(); 
    }catch(SAXException se) { 
     se.printStackTrace(); 
    }catch(IOException ioe) { 
     ioe.printStackTrace(); 
    } 
} 
public void parseReportDocument() 
{ 
    Log.e("5", "5"); 
    Element docEle = dom.getDocumentElement(); 
    Log.e("6", "6"); 
    NodeList nl = docEle.getElementsByTagName("Room"); 
    if(nl != null && nl.getLength() > 0) 
    { 
     for(int i=0; i<nl.getLength(); i++) 
     { 
       Element el = (Element)nl.item(i); 
       //Employee e = getEmployee(el); 
       Room room = getNewRoom(el); 
       myEmpls.add(room); 

     } 
    } 
} 

這裏的logcat的

06-24 15:16:08.209: E/AndroidRuntime(6017): FATAL EXCEPTION: main 
06-24 15:16:08.209: E/AndroidRuntime(6017): java.lang.RuntimeException: Unable to start activity ComponentInfo{[Stuff I have to hide].MainActivity}: java.lang.NullPointerException 
06-24 15:16:08.209: E/AndroidRuntime(6017):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 
06-24 15:16:08.209: E/AndroidRuntime(6017):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
06-24 15:16:08.209: E/AndroidRuntime(6017):  at android.app.ActivityThread.access$600(ActivityThread.java:141) 
06-24 15:16:08.209: E/AndroidRuntime(6017):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
06-24 15:16:08.209: E/AndroidRuntime(6017):  at android.os.Handler.dispatchMessage(Handler.java:99) 
06-24 15:16:08.209: E/AndroidRuntime(6017):  at android.os.Looper.loop(Looper.java:137) 
06-24 15:16:08.209: E/AndroidRuntime(6017):  at android.app.ActivityThread.main(ActivityThread.java:5039) 
06-24 15:16:08.209: E/AndroidRuntime(6017):  at java.lang.reflect.Method.invokeNative(Native Method) 
06-24 15:16:08.209: E/AndroidRuntime(6017):  at java.lang.reflect.Method.invoke(Method.java:511) 
06-24 15:16:08.209: E/AndroidRuntime(6017):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
06-24 15:16:08.209: E/AndroidRuntime(6017):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
06-24 15:16:08.209: E/AndroidRuntime(6017):  at dalvik.system.NativeStart.main(Native Method) 
06-24 15:16:08.209: E/AndroidRuntime(6017): Caused by: java.lang.NullPointerException 
06-24 15:16:08.209: E/AndroidRuntime(6017):  at com.example.[I have to hide].Parser.parseReportDocument(Parser.java:81) 
06-24 15:16:08.209: E/AndroidRuntime(6017):  at com.example.[I have to hide].Parser.parseReportResponse(Parser.java:59) 
06-24 15:16:08.209: E/AndroidRuntime(6017):  at com.example.[I have to hide].Parser.addRequest(Parser.java:41) 
06-24 15:16:08.209: E/AndroidRuntime(6017):  at com.example.[I have to hide].MainActivity.onCreate(MainActivity.java:79) 
06-24 15:16:08.209: E/AndroidRuntime(6017):  at android.app.Activity.performCreate(Activity.java:5104) 
06-24 15:16:08.209: E/AndroidRuntime(6017):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
06-24 15:16:08.209: E/AndroidRuntime(6017):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 
06-24 15:16:08.209: E/AndroidRuntime(6017):  ... 11 more 
+2

你可以發佈堆棧跟蹤。 NullPointerException可能有另一個原因。例如。如果在創建dom對象時引發另一個異常。然後它不被初始化並且它是空的。是否有任何先前的異常拋出? – peshkira

+0

代碼中的哪行會導致NPE? –

+0

我無法從logcat直接告訴,但是一旦我評論「元素docEle = dom.getDocumentElement();」 (以及函數中的其餘部分)代碼不再崩潰,所以它應該是該行。 – user2471612

回答

3

的問題是,你永遠不會初始化參數dom,因爲你public void parseReportXML()方法拋出異常。

看看你的堆棧跟蹤,並發現有什麼異常,當你撥打:

dom =db.parse("LoadReportResponse.xml");

我敢打賭,我的手指,該路徑不正確

編輯:堆棧跟蹤你張貼的是告訴你db找不到該文件。所以,是的,路徑是不正確的。檢查一些使用Java加載文件的例子,有時並不那麼容易。

+0

嘿Asier,我不知道如何跟蹤堆棧跟蹤。除了我正在查看NullPointerException外,我對Logcat的任何內容都不瞭解。我使用與示例相同的路徑,因爲我將XML放在項目文件夾中,與我之後遵循的示例中的示例相同。我還需要做些什麼來確保它找到文件?編輯:剛纔看到你的編輯。我會查找它。謝謝。 – user2471612

+0

http://stackoverflow.com/questions/6639/how-should-i-load-files-into-my-java-application看看;) –

+0

試圖跟隨,我添加了「MainActivity.class.getResource(」 LoadReportResponse.xml 「);」在我構建Parser之前的主要Activity中。但它仍然遭受同樣的問題。我不明白這一點,它在項目目錄中,它應該能夠找到它。 – user2471612