java取消引用可能的空指针
在我的代码中,我得到了上述警告。这是我得到的代码部分java取消引用可能的空指针,java,null,Java,Null,在我的代码中,我得到了上述警告。这是我得到的代码部分 try { fileFile = new File(Main.class.getProtectionDomain().getCodeSource().getLocation().toURI()); } catch (URISyntaxException | NullPointerException e) { } finally { if (fileFile.getPath()!= nul
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();
}
}
如果(fileFile.getPath()!=null){是带有警告的那一行,。
此代码不是主类的一部分。它位于同一包中另一个类文件的另一个类中
我对编程不是很有经验,但我相信我几乎做了所有事情来防止或捕获空指针异常。为什么我仍然得到它,我可以做些什么来消除它?谢谢你的帮助
在阅读了所有提示后,我解决了它。以下是完整的代码:
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;
}
但这产生了一个警告,即fileFile永远不会变为null。(我从一开始的观点是什么,因此“取消引用可能的null指针”的警告确实让我困惑。)因此,如果您在第一行抛出异常,您的变量将不会被分配给文件,并且将保留它以前的值(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,并明确地确定哪个调用给了你一个null。讨厌?不幸的是这样。所以如果你在第一行抛出一个异常,你的变量将未分配给文件
,并将保留其以前的值(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值,并明确地确定哪个调用给了你null值。令人厌烦?不幸的是。一个“null指针取消引用”是计算机在试图调用空值的方法。这有点复杂,但你说你是新手,所以我想保持简单
让我们看一个例子:
String s = null;
s = s.toUpperCase();
这是空指针解引用的一个简单示例。s
是空引用(其值为空),当我们解引用为(获取其值)时,调用toUpperCase()时,我们有null
在null
上,出现了可怕的错误,因为null
根本没有任何方法!Java抛出了一个NullPointerException
现在,回到您的代码,因为在try块中分配了fileFile
,所以我假定它在它之前被设置为null
,以避免Java对未初始化的变量大喊大叫。(这一切都是正确的。)在这个try块中,如果catch块出现任何异常,它将停止try块(这意味着fileFile
将不会获得新值,这意味着它仍然为空)
现在您会注意到警告可能是空指针取消引用。这意味着它不一定是null
,但可能是!(在我上面的示例中,它始终是空指针取消引用以进行比较。)特别是,如果catch
捕获异常,它将是空的
要清楚,问题是:fileFile.getPath()
。这就像说它可能是null.getPath()
,gross。看起来你在试图避免空指针问题,你应该做的是if(fileFile!=null){
。然后在if内部做你想做的事
另外,因为您似乎是为了避免此警告而包含它,所以我会从catch块中删除NullPointerException
。这无助于您避免此警告。如果您想让我进一步解释为什么它不好,您可以留下一条评论,我会的,否则我相信我的话,这对您没有帮助。a“空指针解引用”是指试图对空值调用方法的计算机语言。它有点复杂,但你说你是新手,所以我想保持简单
让我们看一个例子:
String s = null;
s = s.toUpperCase();
这是空指针解引用的一个简单示例。s
是空引用(其值为空),当我们解引用为(获取其值)时,调用toUpperCase()时,我们有null
在null
上,出现了可怕的错误,因为null
根本没有任何方法!Java抛出了一个NullPointerException
现在,回到您的代码,因为在try块中分配了fileFile
,所以我假定它在它之前被设置为null
,以避免Java对未初始化的变量大喊大叫。(这一切都是正确的。)在这个try块中,如果catch块出现任何异常,它将停止try块(这意味着fileFile
将不会获得新值,这意味着它仍然为空)
现在您会注意到警告可能是空指针取消引用。这意味着它不一定是null
,但可能是!(在我上面的示例中,它始终是空指针取消引用以进行比较。)特别是,如果catch
捕获异常,它将是空的
需要澄清的是,问题是:fileFi