Java 访问实例化的和构造函数配置的不可变对象的基元类型(双精度)时的NPE。(不涉及自动装箱或反射)

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.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.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)
  • 如果我通过方法而不是直接访问字段,则问题不会消失。
  • 但是,当我像这样从isAtSR()访问上限字段时,问题就消失了:
    • 双高=getHighestCon(srSource)。上限
  • 其中:
    • srSource SR实例的一个字段和
    • 方法getHighestCon(LinkedList srSource)在SR类型中的实现方式与在Con类型中的实现方式相同,但是访问参数而不是字段,并且不引发异常
    • 请记住,上面的解决方案不是我想要的解决方案。我需要实现getHighestCon()方法,并在Con类型中工作。 如果您有任何问题或需要更多的代码示例,请务必让我知道。我感谢你花时间帮我解决这个问题
字段“private final double upperConBound”通过静态方法从Con的构造函数初始化

Java初始值设定项在类源代码中的顺序非常重要。
尝试将上限字段声明和静态初始值设定项放在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反射。