public String generateURLSafeToken(String username, char[] password) throws CredentialTokenException {
this.tokenValid = false;
String token = null;
if ((username.length() < 1) || (username == null)) {
throw new CredentialTokenException("Username cannot be an empty string or null.");
}
if ((password.length < 1) || (password == null)) {
throw new CredentialTokenException("Password cannot be an empty or null.");
}
我在第 4 行和第 7 行遇到此错误(用户名 == 空,密码 == 空(
我的代码中需要这部分。我正在尝试 isEmpty(( 而不是 null,但也面临问题.修复此SONAR错误的替代方法或解决方案是什么
总是计算结果为false
的条件是username == null
和password == null
。
让我们以username
为例。操作员||
短路,这意味着如果左侧true
,它不会评估右侧。基本上,有两种情况:
- 给出的
username
不是null
.评估username.length() < 1
的条件- 如果结果是
true
,我们直接返回并进入if
分支 - 如果结果是
false
,我们尝试评估username == null
。但是由于给出的username
不是null
,这总是计算为false
。
- 如果结果是
- 给出
username
是null
.评估条件username.length() < 1
。这实际上就到此为止:它会抛出一个NullPointerException
并且不会评估右侧。
因此,您可以看到,无论何时实际评估username == null
条件,结果总是false
。这就是SonarQube警告告诉你的。
这里的解决方案是扭转您的 2 个条件。考虑拥有
if (username == null || username.length() < 1)
相反。如果您重新开始并浏览每种情况,您会注意到没有一个表达式将始终具有相同的结果:
- 给出的
username
不是null
.第一个条件清楚地计算为false
,第二个条件被评估,这可能会返回true
或false
。 - 给出的
username
是null
.第一个条件清楚地评估为true
和短路。