简化为我有以下代码的要点:
public class C_Test extends A_Test {
C_Test() {
super( null );
}
}
public abstract class A_Test {
private final String m_test;
public A_Test( String test ) {
m_test = C_ObjectUtil.defaultIfNull( test, "" );
if( m_test == null ) {
throw new RuntimeException( "it happened again!" );
}
}
}
public class C_ObjectUtil {
public static <T> T defaultIfNull( T object, T defaultObject ) {
return ( object == null ) ? defaultObject : object;
}
}
在使用 JDBC 从 DB2 数据库中读取大约 70 MB 的数据后,调用 new C_Test()
将引发不可能的异常。到那时构造函数被调用超过 100000 次。
将方法 defaultIfNull
内联到构造函数 A_Test
之后(这会删除泛型),一切正常,没有任何错误!
环境:Sun JDK 1.7.0_25 64 位,Linux
知道这里发生了什么吗?
这里是堆栈跟踪。它与我上面显示的缩小版本不匹配。在A_Test
构造函数中调用m_test.equals( "null")
时会抛出这里的异常。
java.lang.NullPointerException
at com.src.db.attribvisitors.A_AttribVisitorAssignFromResultSet.<init>(A_AttribVisitorAssignFromResultSet.java:54)
at com.src.db.attribvisitors.C_AttribVisitorAssignFromSelectStatement.<init>(C_AttribVisitorAssignFromSelectStatement.java:37)
at com.src.db.attribvisitors.C_AttribVisitorAssignFromSelectStatement.<init>(C_AttribVisitorAssignFromSelectStatement.java:43)
at com.src.framework.db.migration.A_DbTableRow.initFromResultset(A_DbTableRow.java:96)
at com.src.framework.db.migration.helper.C_DbTableProcessor$1.process(C_DbTableProcessor.java:66)
at com.src.db.C_TxSql.query(C_TxSql.java:144)
at com.src.db.C_SqlExecuter$3.execute(C_SqlExecuter.java:142)
at com.src.db.C_SqlExecuter.execute(C_SqlExecuter.java:80)
at com.src.db.C_SqlExecuter.query(C_SqlExecuter.java:138)
at com.src.framework.db.migration.helper.C_DbTableProcessor.processTable(C_DbTableProcessor.java:58)
at com.src.framework.db.migration.helper.C_DbTableProcessor.processTable(C_DbTableProcessor.java:39)
at com.src.tools.C_DbExporter.exportTable(C_DbExporter.java:93)
at com.src.tools.C_DbExporter.exportTables(C_DbExporter.java:77)
at com.src.tools.C_DbExporter.exportTables(C_DbExporter.java:61)
at com.src.tools.C_DbExporterAndImporter.exportTables(C_DbExporterAndImporter.java:95)
at com.src.tools.C_DbExporterAndImporter.doMain(C_DbExporterAndImporter.java:83)
at com.src.common.C_MainUtil.runMain(C_MainUtil.java:150)
at com.src.tools.C_DbExporterAndImporter.main(C_DbExporterAndImporter.java:57)
最佳答案
如果没有您未向我们展示的任何外部干预,这是不可能的。
这次调用
m_test = C_ObjectUtil.defaultIfNull( test, "" );
将 test
保存的值和对 String
文字 ""
的引用值压入堆栈。调用该方法,使用这两个引用。然后调用它
public static <T> T defaultIfNull( T object, T defaultObject ) {
return ( object == null ) ? defaultObject : object;
}
来自 test
的值,即。 null
,绑定(bind)到 object
,String
的引用值绑定(bind)到 defaultObject
。执行条件运算符并返回 defaultObject
,即。非空 String
。在调用代码中分配给 m_test
。没有什么可以拦截您代码中的这些步骤。不是另一个线程,不是任何代理机制(它是直接调用的 static
方法),不是我能想到的任何东西。
你的错误在别处。
(如果您发布有助于确定真正问题的新详细信息,我将删除或编辑此答案。)
关于java抛出不可能的NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23300276/