Object.requireNonNull跳过可以为空的字符串

时间:2016-08-18 14:39:12

标签: java object nullpointerexception hessian

我的桌面客户端通过Hessian与服务器通信。

客户端通过传递字符串teamId调用搜索API方法来查找成员。

public Member findMemberByTeamId(FeedProvider provider, String teamId)
{
    Objects.requireNonNull(provider, "Provider can't be a null");
    Objects.requireNonNull(teamId, "Team id can't be a null");

    long starttime = System.currentTimeMillis();

    logger.debug("Started searching member: provider={}, teamId={}", provider, teamId);

    return dao.findMemberByTeamId(provider, teamdId);
}

但我有例外:

[WEB-68] [Service] ERROR Error occurred while downloading member: provider = Hedgehog, teamId = null org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [SELECT * FROM TEAM WHERE ID = ?]; ORA-01722: invalid number ; nested exception is java.sql.SQLSyntaxErrorException:

在日志中我发现以下行:
[WEB-34] [Service] DEBUG Started searching member: provider=Hedgehog, teamId=null

如果我直接连接到我的服务器并使用teamId = null调用搜索API方法,我会获得NPE:

Exception in thread "main" java.lang.NullPointerException: Team id can't be a null
    at java.util.Objects.requireNonNull(Objects.java:228)

1 个答案:

答案 0 :(得分:0)

像这样的问题通常是由于对你所看到的报道的错误解释造成的:

[WEB-34] [Service] DEBUG Started searching member: provider=Hedgehog, teamId=null

这意味着teamId要么真的为null,要么是包含单词" null"的String对象。不幸的是,输出中没有任何可见的区别。但是,您已经在代码中检查null并且没有捕获它,这意味着您的代码存在问题或者变量被设置为字符串" null"。事实证明,它确实是字符串" null"。 (其他可能的原因可能是您在IDE中看到的代码不是您实际运行的代码,有时可能会因配置问题而发生。)

但是为什么你的方法会传递一个包含" null"的String对象?一个常见原因是调用者正在从Integer转换(例如,它可能是来自JDBC连接的整数列,其中该列中允许空值)。然后它获取Integer对象并在将其传递给您的方法之前使用String.valueOf(Object)进行转换。如果Integer对象包含实际的int,那么将导致该int的字符串表示形式。如果它包含null,则会产生字符串" null"。

所以可能的解决方法是查看findMemberByTeamId的调用者并在它们转换为String之前捕获空值。