Изменение типа возврата метода с void на String мгновенно создает «мертвый» код? - PullRequest
0 голосов
/ 10 ноября 2010

Некоторое время назад я написал класс, который получает определенный набор значений из определенных файлов XML.Затем он может распечатать результаты в консоли, и он работает просто отлично.Но, конечно, я не создал класс для печати на консоль

Мне нужно получить значения в базу данных.Существует отдельный класс, который обрабатывает ввод db.

Но у меня большие проблемы с получением локальных переменных из метода, который зацикливает файлы XML, возвращенные / переданные в класс базы данных.

Iне может получить значения из основного метода, который читает их из файлов XML (значения из «узлов» Nodelist).Я пытался использовать кучу глобальных переменных, но они не обновляются.Я прочитал, что использование «глобальных переменных» было правильным способом, но я также прочитал (и обнаружил при кодировании), что JAVA делает копию из реальных битов внутри объекта и работает с этим внутри метода.Поэтому, когда метод завершается, все изменения, вносимые в переменные, игнорируются, и значение объекта остается таким же, каким оно было до запуска метода.

Вот код, который дает проблему:

import org.w3c.dom.*;
import javax.xml.xpath.*;
import javax.xml.parsers.*;
import java.io.IOException;
import org.xml.sax.SAXException;

public class xmlGrabber {
public static String NAME = "StartNaam"; // declare the global variable


  public String main(String[] args) 
   throws ParserConfigurationException, SAXException, 
          IOException, XPathExpressionException {

    DocumentBuilderFactory domFactory = 
    DocumentBuilderFactory.newInstance();
          domFactory.setNamespaceAware(true); 
    DocumentBuilder builder = domFactory.newDocumentBuilder();
    String docuInvoer = "C:/temp/document.xml";
    Document doc = builder.parse(docuInvoer);
    XPath xpath = XPathFactory.newInstance().newXPath();
       // XPath Query for showing all nodes value
    XPathExpression expr = xpath.compile("//@fieldvalue");

    Object result = expr.evaluate(doc, XPathConstants.NODESET);
    NodeList nodes = (NodeList) result;
    for (int i = 1; i < 24; i++) {
    // System.out.println(nodes.item(i).getNodeValue()); 
     //String bla = nodes.item(1).getNodeValue(); 
    String NAME = nodes.item(1).getNodeValue(); //Modify value of NAME

    } return NAME;
  }
//  public static String NAME(){
    //  System.out.println(NAME+"test");
    //  return NAME;        
    //  }
}

При попытке прочитать переменную в другом классе, например, так:

public class Debug {
 public static void main(String[] args) {
     xmlGrabber.main(null);
     String name = xmlGrabber.NAME;
     System.out.println(name); 
 }
}

Среда IDE выдает ошибку: NAME не может быть разрешена или не является полем

Ответы [ 2 ]

4 голосов
/ 10 ноября 2010

Когда компилятор проверяет наличие мертвого кода, он делает исключение для основного метода с подписью

public static void main(String[] args)

потому что основной метод заключается в том, что это точка входа, то, что вы можете вызвать из командной строки или из скрипта, или что-то в этом роде.

Когда вы изменяете тип возвращаемого значения, он не соответствует этой сигнатуре, он больше не является допустимым основным методом, просто какой-то метод, который больше нигде в программе не вызывает: мертвый код.

Кроме того, когда ваш основной метод останавливается, программа исчезает. Чтобы сохранить результаты вашего разбора xml в базе данных, вы также должны сделать вызовы из кода разбора xml в класс доступа к данным (в качестве альтернативы вы можете записать результаты в стандартный вывод и направить их в отдельную Java-программу, которая считывает данные из стандартного ввода и сохраняет его в базе данных).

0 голосов
/ 10 ноября 2010

В этой строке вы используете 1 вместо i:

xmlGrabber.NAME = nodes.item(1).getNodeValue();

Это, вероятно, объясняет предупреждение компилятора и почему печать на консоль работает, а получение узлов - нет.

...