【发布时间】:2014-05-05 14:14:41
【问题描述】:
精简到要领我有以下代码:
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 64Bit, 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)
【问题讨论】:
-
这类“不可能的事情”的问题在于,当您“将代码简化为必需品”时,您就摆脱了实际的错误。当然,这可能是 JIT 中的一个错误,但我们不要妄下结论。您可以尝试使用不同的 JVM 吗?
-
在您发布“简化为基本要素”的代码之前,您应该测试您发布的示例是否有效...如果有效,则错误在其他地方,您应该继续搜索.
-
真正的代码要大到贴出来。但我已将其降低到可能很重要的最低环境。
-
@tangens 此应用程序中是否有多个线程?你有可能从你的构造函数中泄露这个吗?
-
@tangens 我的建议是,以这个“基本”示例为例,然后开始构建您当前拥有的内容。在这里和那里之间的某个地方,将引入一个错误。如果那个时候你不明白这个bug,那么你可以来发帖
标签: java generics jdbc nullpointerexception