如何取消引用可能的空指针?

时间:2014-11-05 17:45:09

标签: java netbeans

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中打印出信息。

3 个答案:

答案 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。