Создан метод, возникла проблема с возвратом в него переменной - PullRequest
0 голосов
/ 27 марта 2011

В этом методе файл 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 ]

2 голосов
/ 27 марта 2011

Я предполагаю, что вы хотели вернуть локальную переменную list, которую вы объявили в функции returnLists. На самом деле вы получите обратно переменную класса, также называемую list. Это связано с тем, что локальная переменная list выходит из контекста к тому времени, когда код достигает вашего оператора возврата (локальная переменная list находится в контексте объявленного вами блока try). Если вы хотите вернуть значение из локальной переменной list, замените первую пару строк returnLists на эту:

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

и затем удалите объявление переменной list внутри блока try.

0 голосов
/ 27 марта 2011

переменная списка, которую вы возвращаете , является списком переменных-членов . потому что переменная списка в списке возврата метода объявлена ​​в блоке try , который заканчивает свою область действия , когда элемент управления выходит из блока try. поэтому объявите переменную списка перед тем, как попробовать блок .

0 голосов
/ 27 марта 2011

Ваша проблема в том, что вы возвращаете список извне блока try, но объявляете его в блоке try.Либо объявите

List list = null; 

вне блока try и создайте экземпляр

list = new LinkedList(); 

внутри блока try.

или

return list; 

из блока try.

Надеюсь, это имеет смысл ...

0 голосов
/ 27 марта 2011

Это ваша проблема: вы объявили list в качестве глобальной переменной. В методе returnList вы снова объявляете переменную list в блоке try. Вы должны либо удалить локальную переменную, либо удалить глобальную переменную.

0 голосов
/ 27 марта 2011

Во-первых, у вас есть локальная переменная с именем list и переменная класса с именем list.В строках 'list = ArrayList ();'и строка «Список списка = новый LinkedList ();»во время выполнения возникнут проблемы с оценкой экземпляра List, который он оценивает.Когда вы вернетесь, вы можете получить совершенно бессмысленные бессмысленные результаты.

Заметьте, я смотрел на этот код всего минуту, так что, скорее всего, это неправильно, но это то, что сразу бросилось в глаза.

...