public void printSomething (Doggy console, Catty dialog) {
if (console == null && dialog == null) {
throw new RuntimeException ("Both console and dialog were null.");
}
else if (console != null && dialog != null) {
throw new RuntimeException ("Both console and dialog were created.");
}
else {
if (console != null) {
console.getInfo ("some String");
}
else {
dialog.getInfo ("Some String");
}
}
我不明白为什么这会取消引用一个可能的空指针警告,因为可以说我通过控制台或对话框为空的两个前提条件证明了这一点。还有,有更好的方法来写这个吗?我唯一真正的解决方案是在else语句中执行此操作。
if (console != null) {
console.getInfo ("some String");
}
else if (dialog != null) {
dialog.getInfo ("some String");
}
else {
throw new RuntimeException ("Couldn't grab info.");
}
在旁注中我应该指出,控制台对话框或实现接口的所有UI的两个不同版本以及所有getInfo都会抓取一个字符串,然后在相应的UI中打印出信息。
答案 0 :(得分:0)
Netbeans或任何其他静态代码分析工具无法100%预测您的控制流量,因此总会出现一些“误报”。
话虽如此,以下内容应该足够简单,以便netbeans正确分析。
if (console != null && dialog != null){
throw new RuntimeException ("Both console and dialog were created.");
}
else if (console != null){
console.getInfo ("some String");
}
else if (dialog != null){
dialog.getInfo ("some String");
}
else {
throw new RuntimeException ("Both console and dialog were null.");
}
答案 1 :(得分:0)
我怀疑它是最后一个条件检查,它是一个嵌套的else语句,然后使用对话框变量来调用getInfo,导致你可能的空指针。当然,你的程序在那时实际上永远不会为null,但是嵌套结构显然是在为一个循环抛出Netbeans。我喜欢@ greyfairer对此的回答,但这个小改动也可能解决你的问题:
public void printSomething (Doggy console, Catty dialog) {
if (console == null && dialog == null) {
throw new RuntimeException ("Both console and dialog were null.");
}
else if (console != null && dialog != null) {
throw new RuntimeException ("Both console and dialog were created.");
}
else {
if (console != null) {
console.getInfo ("some String");
}
else if (dialog != null) {
dialog.getInfo ("Some String");
}
}
}
答案 2 :(得分:0)
发布的代码中没有引入NPE。
其余部分分为几个部分,每个部分处理一个if块。部分是为了清楚,因为我的答案似乎一起运行......
首先阻止
if (console == null && dialog == null) {
真值表:
> console dialog result > valid valid if body skipped > valid null if body skipped > null valid if body skipped > null null if body entered; function exited
秒阻止
else if (console != null && dialog != null) {
仅在两者都为非null时触发。
console dialog result valid valid if body entered; exception thrown valid null if body skipped valid null if body skipped null null impossible; would have been caught ny first if statement
第三个阻止
if (console != null) {
dialog console result valid valid impossible, woukd be caught by second block valid null skips if body null valid enters if body null null impossible, caught by first if
else,仅在所有其他块都失败时触发。捕捉无效条件。
else {
dialog.getInfo ("Some String");
唯一的条件是如果对话框有效且控制台为空。不会抛出NPE。