创建方法,无法在其中返回变量

时间:2011-03-27 16:13:35

标签: java xml variables methods return

在此方法中,将读取XML文件,并将有关它的某些信息放入列表中。我还有其他一切适用于所有代码/其他方法,我只是在返回“list”变量时遇到了麻烦。

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);

    }
}

5 个答案:

答案 0 :(得分:2)

我假设你打算返回你在list函数中声明的returnLists局部变量。您将获得的实际上是类变量,也称为list。这是因为当代码到达return语句时,本地list变量已经脱离了上下文(本地list变量位于您声明的try块的上下文中) 。如果您想从本地list变量返回值,请将returnLists的前几行更改为:

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

然后删除try块中list变量的声明。

答案 1 :(得分:0)

首先,你有一个名为list的局部变量和一个名为list的类变量。在行'list = ArrayList();'中和'List list = new LinkedList();'运行时将无法评估它正在评估哪个List实例。当你回来时,你可能会得到毫无意义的无意义结果。

注意我只看了这段代码总共一分钟,所以这很可能是错的,但这就是我立即跳出来的。

答案 2 :(得分:0)

这是您的问题:您已将list声明为全局变量。在returnList方法中,您再次在try块中声明变量list。您应该删除局部变量或删除全局变量。

答案 3 :(得分:0)

您的问题是您从try块外部返回列表,但是您在try块中声明它。 要么声明

List list = null; 

在try块之外并实例化

list = new LinkedList(); 

在try块内。

return list; 

从try块内部。

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

答案 4 :(得分:0)

返回的列表变量是成员变量列表。因为方法返回列表中的列表变量在try块中声明,一旦控件超出try块,就会结束其范围。所以在try block 之前声明列表变量