在我的代码中,我收到了上述警告。这是我得到它的代码的一部分,
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。 (从一开始我的观点是什么,因此警告“取消引用可能的空指针”真的让我感到困惑。)
答案 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
。这并没有帮助你避免警告。如果你想让我解释更多为什么它不好你可以留下评论我会,否则只是接受我的话,它没有帮助你。