Java 访问实例化的和构造函数配置的不可变对象的基元类型(双精度)时的NPE。(不涉及自动装箱或反射)
下面是我在下面引用的相关代码中遇到的一个奇怪的例外: 23:51:39在java.lang.Thread.run(未知源代码)Java 访问实例化的和构造函数配置的不可变对象的基元类型(双精度)时的NPE。(不涉及自动装箱或反射),java,nullpointerexception,Java,Nullpointerexception,下面是我在下面引用的相关代码中遇到的一个奇怪的例外: 23:51:39在java.lang.Thread.run(未知源代码) 23:51:39在java.util.concurrent.ThreadPoolExecutor$Worker.run(未知源) 23:51:39在java.util.concurrent.ThreadPoolExecutor$Worker.runTask(未知源) 23:51:39在com.dk.actions.c.run(未知来源) 23:51:39在com.dk.
23:51:39在java.util.concurrent.ThreadPoolExecutor$Worker.run(未知源)
23:51:39在java.util.concurrent.ThreadPoolExecutor$Worker.runTask(未知源)
23:51:39在com.dk.actions.c.run(未知来源)
23:51:39在com.dk.actions.TesterAction.yw(未知来源)
23:51:39在com.dk.actions.TesterAction.yX(未知来源)
23:51:39在com.dk.agent.tester.b.Bc(未知来源)
23:51:39在com.dk.agent.tester.r.run(未知来源)
23:51:39在com.dk.agent.tester.b.a(未知来源)
23:51:39在scal.scal.onBar(scal.java:241)
23:51:39在scal.supris.evalSupres(scal.java:2678)
23:51:39在scal.SR.supp(scal.java:2187)
23:51:39在scal.SR.evaluatesrf(scal.java:2361)
23:51:39在scal.SR.isAtSR(scal.java:2385)
23:51:39在scal.SR$Con.access$5(scal.java:1741)
23:51:39 java.lang.NullPointerException
哦,在你问之前,是的,这个应用程序的所有类都在一个文件中。不要问为什么。事情就是这样。以下是对上述堆栈跟踪的代码引用:
ref. scal.Scal.onBar(Scal.java:241):
try{
for(Ins instr : supresSourceMap.keySet())
for(Per p : supresSourceMap.get(instr).keySet())
241: supresSourceMap.get(instr).get(p).evalSupres(currTime);
} catch (Exception e){
e.printStackTrace(console.getErr());
}
ref. scal.Supres.evalSupres(Scal.java:2678):
public void evalSupres(long time) throws Exception{
...
2678: sup.supp(Con.of(getIns(), getPer(), center, time, conRange, true), null);
...
}
ref. scal.SR.supp(Scal.java:2187):
void supp(Con nHt, Con remove){
...
2187 evaluateSRfor(nHt);
...
}
ref. scal.SR.evaluateSRfor(Scal.java:2361):
private void evaluateSRfor(Con nHt) {
if(!hits.get(nHt.per).isEmpty()){
Con lastHt = getLastHt(nHt.per);
if(lastHt != null){
if(lastHt.srSource == null){
if(isNewSR(nHt)){
addNewSR(nHt);
}
}else{
2361: if(isAtSR(nHt)){
addConToLastSR(nHt);
}
}
}
}
}
ref. scal.SR.isAtSR(Scal.java:2385):
private boolean isAtSR(Con nHt) {
...
2385: double high = nHt.getHighestCon().upperConBound;
...
}
ref. nHt.getHighestCon() :
Con getHighestCon(){
Con highCon = null;
boolean contains = false;
if(this.srSource != null){
highCon = srSource.getFirst();
for(Con con : srSource){
if(!contains)
contains = this.equals(con);
if (con.compareTo(highCon) > 0) {
highCon = con;
}
}
if(!contains) throw new IllegalStateException("getHighestCon(): " + this.toString() + " does not belong to its srSource list: " + srSource.toString());
}
return highCon;
}
ref. scal.SR$Con.access$5(Scal.java:1741):
1741: private final double upperConBound;
重要提示:- srSource是LinkedList类型的Con类中的字段。
- 方法getHighestCon()在Con类型中定义。
- Con类型是SR类型中的静态内部类。
- Con类型是不可变的,尽管srSource list不是final,并且稍后从setter方法实例化和填充
- 每个Con实例在srSource列表中都有一个对自身的引用
- 我用hashCode()、equals()、toString()和Comparable(compareTo(Conf c))实现了Con类型。它们中没有一个在计算中使用srSource字段
- 字段“private final double upperConBound”通过静态方法从Con的构造函数初始化:
- this.upperConBound=value+Utils.pValue(ins,conRange)
- this.upperConBound=value+Utils.pValue(ins,conRange)
- 如果我通过方法而不是直接访问字段,则问题不会消失。
- 但是,当我像这样从isAtSR()访问上限字段时,问题就消失了:
- 双高=getHighestCon(srSource)。上限
- 双高=getHighestCon(srSource)。上限
- 其中:
- srSource SR实例的一个字段和
- 方法getHighestCon(LinkedList srSource)在SR类型中的实现方式与在Con类型中的实现方式相同,但是访问参数而不是字段,并且不引发异常
- 请记住,上面的解决方案不是我想要的解决方案。我需要实现getHighestCon()方法,并在Con类型中工作。 如果您有任何问题或需要更多的代码示例,请务必让我知道。我感谢你花时间帮我解决这个问题李>
尝试将上限字段声明和静态初始值设定项放在Con类源代码中的任何内容之前。aaaaah,代码太多了。请把这个问题归结为一个问题。你能用更小的代码重现这个异常吗?你能把它归结为10-15行来演示这个问题吗?JVM是什么?它是Sun还是像JRocket这样的定制版本?java-version提供了以下内容:java版本“1.6.0_21”java(TM)SE运行时环境(build 1.6.0_21-b07)java热点(TM)64位服务器VM(build 17.0-b17,混合模式)抱歉,但这段代码会引起gag反射。