Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAVA—将方法返回类型从void更改为String立即创建';死亡';密码?_Java_Variables_Types_Return_Global - Fatal编程技术网

JAVA—将方法返回类型从void更改为String立即创建';死亡';密码?

JAVA—将方法返回类型从void更改为String立即创建';死亡';密码?,java,variables,types,return,global,Java,Variables,Types,Return,Global,不久前我编写了一个类a,它从特定的XML文件中获取一组特定的值。然后,它可以在控制台中打印结果,并且工作正常。 但我当然没有创建一个类来打印到控制台 我需要把这些值输入数据库。有一个单独的类处理db输入 但是,从循环返回/传递到数据库类的XML文件的方法中获取局部变量时遇到了很大的困难 我无法从从从XML文件读取值的主方法内部获取这些值(来自节点列表“nodes”的值)。我试着使用一堆全局变量,但它们没有得到更新。我读到使用“全局变量”是一种方法,但我也读到(在编码时发现),JAVA从对象中的实

不久前我编写了一个类a,它从特定的XML文件中获取一组特定的值。然后,它可以在控制台中打印结果,并且工作正常。 但我当然没有创建一个类来打印到控制台

我需要把这些值输入数据库。有一个单独的类处理db输入

但是,从循环返回/传递到数据库类的XML文件的方法中获取局部变量时遇到了很大的困难


我无法从从从XML文件读取值的主方法内部获取这些值(来自节点列表“nodes”的值)。我试着使用一堆全局变量,但它们没有得到更新。我读到使用“全局变量”是一种方法,但我也读到(在编码时发现),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;        
    //  }
}

IDE抛出错误:名称无法解析或不是字段

当编译器检查死代码时,它会对带有签名的主方法进行例外

public static void main(String[] args)
因为main方法的要点是它是一个入口点,您可以从命令行、脚本或其他地方调用它并启动它

当您更改返回类型时,它与该签名不匹配,它不再是有效的主方法,只是程序中其他地方调用的某个方法:死代码


此外,当主方法停止运行时,程序也会消失。要将xml解析的结果保存到数据库,您可以从xml解析代码调用数据访问类(也可以将结果写入stdout并通过管道将其传输到单独的java程序,该程序从stdin读取数据并将其保存到数据库)。

当编译器检查死代码时,它对带有签名的main方法做了一个例外

public static void main(String[] args)
因为main方法的要点是它是一个入口点,您可以从命令行、脚本或其他地方调用它并启动它

当您更改返回类型时,它与该签名不匹配,它不再是有效的主方法,只是程序中其他地方调用的某个方法:死代码


此外,当主方法停止运行时,程序也会消失。要将xml解析的结果保存到数据库中,您可以从xml解析代码调用数据访问类(也可以将结果写入stdout并通过管道将其传输到单独的java程序,该程序从stdin读取数据并将其保存到数据库)。

在这一行中,您使用1而不是i:

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

这可能解释了编译器警告以及为什么打印到控制台工作,但检索节点却不行。

在这一行中,您使用1而不是i:

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

这可能解释了编译器警告以及为什么打印到控制台可以工作,但检索节点却不能

JAVA从对象中的实际位复制一个副本,并在方法中使用它。因此,当方法结束时,对变量所做的所有更改都将被忽略,并且对象的值与方法运行之前的值相同。“你在哪里读到的?如果我明白你在说什么,那应该是相反的。通常,在方法返回后,对方法中的对象所做的更改会一直保留。@Menno:这个问题实际上证实了我的怀疑(请参见投票结果顶部的第二个示例)。我相信您误解了第一个示例。Java不会复制对象中的位,它只是将每个
对象的引用值
参数复制到方法中。如果更改新引用(通过为参数指定不同的
对象
),而不影响调用者,调用者仍在引用原始对象。但是,改变对象的内部状态确实会发生这种情况。@Menno:您能发布导致“死代码”错误的代码的确切版本吗?JAVA从对象中的实际位复制一个副本,并在方法中使用它。因此,当方法结束时,对变量所做的所有更改都将被忽略,并且对象的值与方法运行之前的值相同。“你在哪里读到的?如果我明白你在说什么,那应该是相反的。通常,在方法返回后,对方法中的对象所做的更改会一直保留。@Menno:这个问题实际上证实了我的怀疑(请参见投票结果顶部的第二个示例)。我相信您误解了第一个示例。Java不会复制对象中的位,它只是将每个
对象的引用值
参数复制到方法中。如果更改新引用(通过为参数指定不同的
对象
),而不影响调用者,调用者仍在引用原始对象。但是,改变一个对象的内部状态是可以的。@Menno:你能发布导致“死代码”错误的代码的确切版本吗?谢谢,Nathan。所以警告总是存在,但如果是针对特定方法的,则默认情况下会隐藏?@Nathan:但是为什么
i++
首先会被视为死代码?我本以为编译器会抱怨缺少返回语句。@Adam:我不知道为什么它会抱怨这个确切的语句。我有一个在进行中的版本,在main方法中包含NAME的return语句,但它仍然为第二个类提供了“StartNaam”的初始值(@Nathan:你能编写一个Java类,它的main方法立即以
return;
语句开头,然后是其他一些无法访问的语句(例如