java抛出不可能的NullPointerException

标签 java generics jdbc nullpointerexception

简化为我有以下代码的要点:

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)到 objectString 的引用值绑定(bind)到 defaultObject。执行条件运算符并返回 defaultObject,即。非空 String。在调用代码中分配给 m_test。没有什么可以拦截您代码中的这些步骤。不是另一个线程,不是任何代理机制(它是直接调用的 static 方法),不是我能想到的任何东西。

你的错误在别处。

(如果您发布有助于确定真正问题的新详细信息,我将删除或编辑此答案。)

关于java抛出不可能的NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23300276/

相关文章:

java - 尝试将 java 类路径放入 jar list 中,不确定使用哪个字符串

java - 创建名为“entityManagerFactory”的 bean

java在for循环内提交

java - 运行时的泛型

mysql - 尝试在 SnapLogic 中创建 derby 帐户时出现错误

java - Spring in Practice 书第 1 章中关于单例 bean 不维护状态所需的揭秘

c# - 使用 Wrapped<B> 类填充 Wrapped<A> 的集合,其中 B 实现 A

java - Hibernate 查询 API 和 Java 1.5/泛型

java - 程序在Java中抛出java.lang.UnsupportedOperationException

java - 具有 2 个不同数据库名称的 MySQL JDBC URL 故障转移