我的桌面客户端通过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)
答案 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之前捕获空值。