这是我在下面引用的相关代码中遇到的奇怪异常: 哦,在你问之前,是的,这个应用程序的所有类都在一个文件中。不要问为什么。就是这样。以下是对上述堆栈跟踪的代码引用: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 列表不是最终的,并且稍后从 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() 访问 upperConBound 字段时,问题就消失了: 双高 = getHighestCon(srSource).upperConfBound; 哪里: srSource SR 实例和 的字段 方法 getHighestCon(LinkedList srSource) 在 SR 类型中的实现方式与在 Con 类型中的方式相同,但访问的是参数而不是字段,并且不会抛出异常。 请记住,上面的解决方案不是我所追求的解决方案。我需要在 Con 类型中实现和工作 getHighestCon() 方法。如果您有任何问题或需要更多代码示例,请告诉我。感谢您为我解决这个问题所花费的时间。 最佳答案 Java 类源代码中的初始化顺序非常重要。尝试将 upperConBound 字段声明和静态初始化程序放在 Con 类源代码中的任何其他内容之前。关于java - NPE 在访问实例化和构造函数配置的不可变对象(immutable对象)的原始类型( double )时。 (不涉及自动装箱或反射),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9916791/
10-12 14:17