2011-03-27 38 views
0

在此方法中,讀取XML文件並將其中的某些信息放入列表中。我有其他所有的代碼/其他方法工作,我只是無法返回「列表」變量。創建方法,無法返回其中的變量

package ca3; 

import java.io.File; 
import java.util.ArrayList; 
import java.util.LinkedList; 
import java.util.List; 
import org.w3c.dom.Document; 
import org.w3c.dom.*; 

import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.DocumentBuilder; 
import org.xml.sax.SAXException; 
import org.xml.sax.SAXParseException; 

public class xmlReader{ 

    public String fileName; 
    public xmlReader (String fileLoca){ 
     fileName=fileLoca; 
    } 

    public List list; 

    public List returnLists(String fileN) 
    { 
     mp3Lister woww = null; 
     String fName; 
     String lName; 
     mp3Lister qwewq; 
    try { 
      DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); 
      DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); 
      Document doc = docBuilder.parse (new File(fileN)); 

      // normalize text representation 
      doc.getDocumentElement().normalize(); 
      System.out.println ("Root element of the doc is " + 
       doc.getDocumentElement().getNodeName()); 

      NodeList listOfPersons = doc.getElementsByTagName("person"); 
      int totalPersons = listOfPersons.getLength(); 
      System.out.println("Total no of people : " + totalPersons); 
      List list = new LinkedList(); // Doubly-linked list 

      for(int s=0; s<listOfPersons.getLength() ; s++){ 
       Node firstPersonNode = listOfPersons.item(s); 
       if(firstPersonNode.getNodeType() == Node.ELEMENT_NODE){ 
        Element firstPersonElement = (Element)firstPersonNode; 

        //------- 
        NodeList firstNameList = firstPersonElement.getElementsByTagName("first"); 
        Element firstNameElement = (Element)firstNameList.item(0); 

        NodeList textFNList = firstNameElement.getChildNodes(); 
//     System.out.println("First Name : " + 
//       ((Node)textFNList.item(0)).getNodeValue().trim()); 

//        
        //------- 
        NodeList lastNameList = firstPersonElement.getElementsByTagName("last"); 
        Element lastNameElement = (Element)lastNameList.item(0); 

        NodeList textLNList = lastNameElement.getChildNodes(); 
//     System.out.println("Last Name : " + 
//       ((Node)textLNList.item(0)).getNodeValue().trim()); 

        lName = textLNList.item(0).getNodeValue().trim().toString(); 
        fName = textFNList.item(0).getNodeValue().trim().toString(); 
        mp3Lister[] wowow = null; 

        woww = new mp3Lister(fName,lName); 

        list.add(woww); 
        //---- 

        //------ 

       }//end of if clause 

//    qwewq = (mp3Lister) list.get(0); 
//    System.out.println(qwewq.getTitle() + " wakakakakaka"); 

      }//end of for loop with s var 
      //end of for loop with s var 

     }catch (SAXParseException err) { 
     System.out.println ("** Parsing error" + ", line " 
      + err.getLineNumber() + ", uri " + err.getSystemId()); 
     System.out.println(" " + err.getMessage()); 

     }catch (SAXException e) { 
     Exception x = e.getException(); 
     ((x == null) ? e : x).printStackTrace(); 

     }catch (Throwable t) { 
     t.printStackTrace(); 
     } 

return list; 
     //System.exit (0); 

    } 
} 
+0

你面臨的'麻煩'究竟是什麼? – Nishan 2011-03-27 16:18:05

+0

你打電話什麼方法,你期望什麼 – smas 2011-03-27 16:19:15

回答

2

我假設你的意思是返回在returnLists函數中聲明的list局部變量。實際上你會得到的是類變量,也叫list。這是因爲在代碼到達返回語句時(本地list變量位於您聲明的try塊的上下文內),本地list變量已超出上下文。如果你想從本地list變量變化的第一對夫婦的returnLists線的返回值這樣:

public List returnLists(String fileN) 
    { 
     mp3Lister woww = null; 
     String fName; 
     String lName; 
     mp3Lister qwewq; 
     List list = new LinkedList(); 
    try { 

,然後刪除try塊內的list變量的聲明。

+0

這固定它...謝謝! – willkara 2011-03-27 16:34:58

0

一方面你有一個名爲list的局部變量和一個名爲list的類變量。在行'list = ArrayList();'和'List list = new LinkedList();'運行時將無法評估它正在評估哪個List實例。當你回來時,你可能會得到完全毫無意義的無稽之談結果。

注意我只看了一下這段代碼總共一分鐘,所以這很可能是錯誤的,但這是我立即跳出來的。

+0

呃,對不起我的錯誤。我忘了從代碼中刪除那部分。那是來自一些測試。 – willkara 2011-03-27 16:22:16

0

這就是你的問題:你已經聲明list作爲一個全局變量。在returnList方法中,您再次在try塊中聲明變量list。您應該刪除本地變量或刪除全局變量。

+0

當我擺脫全局變量時,它給了我一個「找不到符號」的錯誤。 另外,當我嘗試並運行該方法的任何方式。它給了我一個「空指針異常錯誤 – willkara 2011-03-27 16:24:29

+0

總是給堆棧跟蹤或行號發生錯誤,如果你想幫助修復它 – katsharp 2011-03-27 16:31:42

+0

@willkara刪除全局聲明並將你的本地變量聲明移動到try塊之外 – Nishan 2011-03-27 16:41:57

0

你的問題是你從try塊外部返回列表,但是你在try塊中聲明它。 要麼宣佈

List list = null; 

try塊外面和實例

list = new LinkedList(); 

try塊內。

return list; 

從try塊內。

我希望是有道理的......

0

列表變量,你返回成員變量列表。因爲方法返回列表中的列表變量是在try塊中聲明的,一旦控件超出try塊,它將結束其作用域。所以在嘗試塊之前聲明變量列表變量