Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.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 返回新值时的NullPointerException[]_Java_Nullpointerexception - Fatal编程技术网

Java 返回新值时的NullPointerException[]

Java 返回新值时的NullPointerException[],java,nullpointerexception,Java,Nullpointerexception,我对NullPointerException有一个非常奇怪的问题。代码示例如下所示: ... ... public String[] getParams(...) { ... ... ... ... 143 return new String[] { 144 getUserFullName(), 145 StringUtil.formatDate(sent), . tiltu, . StringUtil.initCap(user.getNam

我对NullPointerException有一个非常奇怪的问题。代码示例如下所示:

...
... public String[] getParams(...) {
...   ...
...   ... 
143   return new String[] {
144     getUserFullName(),
145     StringUtil.formatDate(sent),
 .      tiltu,
 .      StringUtil.initCap(user.getName()),
 .      vuosi.toString(),
 .      asiatyyppi[0] + " " + lisatiedot[0],
 .      asiatyyppi[1] + " " + lisatiedot[1],
 .      alaviitteet[0],
152     alaviitteet[1]};
153  }
现在,我在生产中遇到了一个堆栈跟踪问题:

java.lang.NullPointerException
    at package.EmailService.getParams(EmailService.java:143)
...
我自己无法生成那种堆栈跟踪。这可能是由于某些原因导致行号不匹配的环境问题。如果我在任何变量堆栈上有空引用,则跟踪点指向该特定行,但从不指向第143行


但我想问的是:是否有可能在第143行产生NullPointerException?

考虑一下您的原始代码,它定义了一个新的
字符串
数组:

return new String[] {
    getUserFullName(),
    StringUtil.formatDate(sent),
    tiltu,
    StringUtil.initCap(user.getName()),
    vuosi.toString(),
    asiatyyppi[0] + " " + lisatiedot[0],
    asiatyyppi[1] + " " + lisatiedot[1],
    alaviitteet[0],
    alaviitteet[1]};
}
如果内联数组的任何元素触发
NullPointerException
,JVM将解释异常发生在定义开始的行上。换句话说,JVM将上述代码视为与以下代码相同:

return new String[] { getUserFullName(), StringUtil.formatDate(sent), tiltu, StringUtil.initCap user.getName()), vuosi.toString(), asiatyyppi[0] + " " + lisatiedot[0], asiatyyppi[1] + " " + lisatiedot[1], alaviitteet[0], alaviitteet[1]}; }
一切都在一条线上


如果确实要在此处处理
NullPointerException
s,则应在实例化之外定义变量。

堆栈跟踪中的行号来自类文件中的LineNumberTable属性。()

为子表达式输出正确的行号是没有问题的——编译器所要做的就是说,从字节码索引x到y,与源代码行z有对应关系

但在Java 1.7之前(包括Java 1.7),编译器中存在一个bug,该bug在1.8中修复:

问题说明:linenumbertable仅在编译代码中可用 具有语句开头的行号。当语句正在使用时 方法链接或其他“流畅接口”样式API的单一 语句可以跨越数十行,并在方法上包含数百行 调用

当前,任何这些方法中的异常抛出都将 具有包含以下内容的封闭语句的第一行的行号: 使调试哪个方法调用有问题变得非常困难

对于每个方法,linnumbertable都应该有正确的行号 调用

--

BT2:评估

解决这一问题似乎很简单,但最终还是有点冒险 jdk7开发周期,以jdk8为目标

因此,在1.7中,这些类型的子表达式的报告行号可能是错误的(如果它们发生在同一个方法中-如果在子表达式中调用了另一个方法,而另一个方法导致了NullPointerException,您会在那里看到报告-这可能就是为什么该错误并不总是一个大问题的原因)


解决这个问题的一种方法是使用Java8编译器编译源代码,并使用标志
javac-source 1.7-target 1.7
。但将prod环境升级到1.8会更好、更安全。

检查以下各项是否为空:
tiltu
vuosi
asiatyyppi
lisatiedot
alavittet
尝试打印以下单个元素:;用户、vuosi、asiatyyppi……其中许多可能具有
null
值。使用调试器。如果无法复制,则执行
null
检查返回行之前的所有内容,并记录这些值。如果您再次遇到异常,那么您将知道更多OP不是要求解决他的空指针问题,而是询问是否可能在第143行(表示
new String[]
)出现异常,因为我们假设如果任何变量为
null
,行号为144到152,“不是143,”詹斯说,“这显然不是这个问题的翻版;OP有一个非常具体和不同的问题。这不完全正确,实际上它在行中抛出nullpointer异常,而在抛出行中抛出nullpointer异常。这听起来是一个有趣的命题,但是你有什么可以支持的吗?我有一个简单的反例——只要尝试
objectx=null;字符串[]y=新字符串[]{x.toString()}并将其分散到多行上。您将看到在调用
x.toString()
的行中报告了NullPointerException。所以我认为你的推理是不正确的。你使用的是什么编译器?@TimBiegeleisen你使用的是哪个Java版本(jvm版本)?我收回我之前陈述的最后一部分-这似乎正是javac编译器中的一个错误,已在1.8中修复。我相信这就是答案。我根本无法用其他方式来解释。