java解除引用可能的空指针

时间:2015-08-12 13:41:42

标签: java null

在我的代码中,我收到了上述警告。这是我得到它的代码的一部分,

try {
        fileFile = new File(Main.class.getProtectionDomain().getCodeSource().getLocation().toURI());
    } catch (URISyntaxException | NullPointerException e) {
    }
    finally {
        if (fileFile.getPath()!= null){
            strPathName = fileFile.getPath();
        }
        if (fileFile.getName() != null){
            strFileName = fileFile.getName();
        }
    }  

if (fileFile.getPath()!= null){是带警告的行。 此代码不是Main类的一部分。它位于同一个包中另一个类文件的另一个类中。

我对编程不是很有经验,但我相信我做了几乎所有事情来阻止或捕获空指针异常。为什么我仍然得到它,我该怎么做才能摆脱它?谢谢你的帮助。

阅读完所有提示后,我解决了它。这是完整的代码:

public static ArrayList<String> getCurrentPath() {

    File fileFile;
    String strPathName, strFileName;
    ArrayList<String> arrPathFileName;

    strFileName = null;
    strPathName = null;

    try {
        fileFile = new File(Main.class.getProtectionDomain().getCodeSource().getLocation().toURI());
        if (fileFile.getPath()!= null){
            strPathName = fileFile.getPath();
        }
        if (fileFile.getName() != null){
            strFileName = fileFile.getName();
        }
    } catch (URISyntaxException use) {
    }     
    arrPathFileName = new ArrayList<>(); 
    arrPathFileName.add(strPathName);
    arrPathFileName.add(strFileName);

    return arrPathFileName;
}

如前所述,我只是将if语句放入try块并删除了finally块。

BTW也尝试将两个块组合成一个方式:

if (fileFile != null){
            strPathName = fileFile.getPath();
            strFileName = fileFile.getName();
        }

但是这产生了一个警告,即fileFile永远不会变为null。 (从一开始我的观点是什么,因此警告“取消引用可能的空指针”真的让我感到困惑。)

2 个答案:

答案 0 :(得分:10)

因此,如果您在第一行引发异常,则您的变量不会分配给File,并且会保留其之前的值(null,如果之前未分配的话)。您的异常被捕获,然后继续使用该未分配的变量。因此警告。请参阅下面的注释代码。

try {
        fileFile = // exception thrown. Variable not assigned
} catch (URISyntaxException | NullPointerException e) {
        // exception caught
    }
    finally {
       // unassigned variable used here...
        if (fileFile.getPath()!= null){
            strPathName = fileFile.getPath();
        }
        if (fileFile.getName() != null){
            strFileName = fileFile.getName();
        }
    }  

如果可行的话,我宁愿在try块中范围和使用变量。在你的finally块中,你需要尽可能小心,因为你可以从try块中的大多数地方来到它。

顺便说一下,这个:

Main.class.getProtectionDomain().getCodeSource().getLocation().toURI();
如果你得到NPE,

会给你带来很多问题。上面哪个解决了null?我可能会更明确,这样您就可以检查每次调用的空值,并明确地确定哪个调用给了您一个null。 Tiresome?不幸的是。

答案 1 :(得分:2)

“空指针取消引用”是计算机发言,试图在空值上调用方法。它有点复杂,但你说你是一个新手,所以我想保持简单。

让我们看一个例子:

String s = null;
s = s.toUpperCase();

这是空指针取消引用的简单示例。 s是一个空引用(它的值为null),当我们在null上调用toUpperCase()时,我们有null degrarence(得到它的值),事情发生了可怕的错误,因为null完全没有任何方法! Java抛出一个NullPointerException来具体。

现在,回到你的代码,因为在try-block中分配了fileFile我假设它在它之前设置为null,以避免Java对未初始化的变量大喊大叫。 (这一切都很好和正确。)在这个try-block中,如果你的catch-block出现任何异常,它将停止try-block(意味着fileFile将不会得到一个新值,这意味着它将仍然是空的。)

现在您将注意到警告是可能的空指针取消引用。这意味着它不一定是null,但可能是! (在上面的例子中,总是一个用于比较的空指针引用。)具体来说,如果catch捕获异常,它将为null。

要明确,问题是: fileFile.getPath()。这就像说它可能是null.getPath(),粗略。看起来你试图避免空指针问题,你应该做的是if (fileFile != null) {而不是。然后在if里面做你想要的。

另外,因为您似乎将其包含在内以避免此警告,所以我认真地从catch块中删除NullPointerException。这并没有帮助你避免警告。如果你想让我解释更多为什么它不好你可以留下评论我会,否则只是接受我的话,它没有帮助你。