java 取消引用可能的空指针
java dereferencing possible null pointer
在我的代码中,我收到了上述警告。这是我得到的代码部分,
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 class 的一部分。它在同一包中另一个 class 文件的另一个 class 中。
我在编程方面不是很有经验,但我相信我几乎做了所有事情来防止或捕获空指针异常。为什么我仍然得到它,我该怎么做才能摆脱它?感谢您的帮助。
在阅读了您的所有提示后,我解决了它。这是完整的代码:
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 块。
顺便说一句,我们还尝试将两个 if 块合并为一个:
if (fileFile != null){
strPathName = fileFile.getPath();
strFileName = fileFile.getName();
}
但这会产生一个警告,即 fileFile 永远不会变为 null。 (从一开始我的观点是什么,所以警告 "dereferencing possible null pointer" 真的让我很困惑。)
因此,如果您在第一行抛出异常,您的变量将不会分配给 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 ?我可能会更明确,这样您就可以检查每次调用的空值并明确确定哪个调用给了您空值。累吗?很遗憾。
A "null pointer dereference" 是计算机语言,表示尝试对空值调用方法。有点复杂,不过你说你是新手,所以我想简单点。
让我们看一个例子:
String s = null;
s = s.toUpperCase();
这是空指针解除引用的一个简单示例。 s
是一个空引用(它的值为空),当我们解引用(获取它的值)时我们有 null
,当我们在 null
上调用 toUpperCase()
时,由于 null
根本没有任何方法,所以出现了严重错误! Java 抛出一个 NullPointerException
具体来说。
现在,回到你的代码,因为 fileFile
是在 try 块中分配的,我假设它在它之前被设置为 null
以避免 Java 对未初始化的变量大喊大叫. (这一切都很好而且正确。)在这个 try 块中,如果您的 catch 块发生任何异常,它将停止 try 块(意味着 fileFile
不会获得新值,这意味着它将仍然为空)。
现在您会注意到警告是可能空指针取消引用。这意味着它不一定是 null
,但可能是! (在我上面的例子中,它总是 一个空指针取消引用以进行比较。)具体来说,如果 catch
捕获到一个异常,它将是空的。
说清楚,问题是这样的: fileFile.getPath()
。这就像说它可能 null.getPath()
,恶心。看起来您是在尝试避免空指针问题,您应该做的是 if (fileFile != null) {
。 然后在 if 内部执行您想要的操作。
另外,因为看起来你包含它是为了避免这个警告,我会 认真地 从 catch 块中删除 NullPointerException
。那并不能帮助您避免警告。如果你想让我解释更多为什么不好,你可以发表评论,我会的,否则请相信我的话,这对你没有帮助。
在我的代码中,我收到了上述警告。这是我得到的代码部分,
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 class 的一部分。它在同一包中另一个 class 文件的另一个 class 中。
我在编程方面不是很有经验,但我相信我几乎做了所有事情来防止或捕获空指针异常。为什么我仍然得到它,我该怎么做才能摆脱它?感谢您的帮助。
在阅读了您的所有提示后,我解决了它。这是完整的代码:
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 块。
顺便说一句,我们还尝试将两个 if 块合并为一个:
if (fileFile != null){
strPathName = fileFile.getPath();
strFileName = fileFile.getName();
}
但这会产生一个警告,即 fileFile 永远不会变为 null。 (从一开始我的观点是什么,所以警告 "dereferencing possible null pointer" 真的让我很困惑。)
因此,如果您在第一行抛出异常,您的变量将不会分配给 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 ?我可能会更明确,这样您就可以检查每次调用的空值并明确确定哪个调用给了您空值。累吗?很遗憾。
A "null pointer dereference" 是计算机语言,表示尝试对空值调用方法。有点复杂,不过你说你是新手,所以我想简单点。
让我们看一个例子:
String s = null;
s = s.toUpperCase();
这是空指针解除引用的一个简单示例。 s
是一个空引用(它的值为空),当我们解引用(获取它的值)时我们有 null
,当我们在 null
上调用 toUpperCase()
时,由于 null
根本没有任何方法,所以出现了严重错误! Java 抛出一个 NullPointerException
具体来说。
现在,回到你的代码,因为 fileFile
是在 try 块中分配的,我假设它在它之前被设置为 null
以避免 Java 对未初始化的变量大喊大叫. (这一切都很好而且正确。)在这个 try 块中,如果您的 catch 块发生任何异常,它将停止 try 块(意味着 fileFile
不会获得新值,这意味着它将仍然为空)。
现在您会注意到警告是可能空指针取消引用。这意味着它不一定是 null
,但可能是! (在我上面的例子中,它总是 一个空指针取消引用以进行比较。)具体来说,如果 catch
捕获到一个异常,它将是空的。
说清楚,问题是这样的: fileFile.getPath()
。这就像说它可能 null.getPath()
,恶心。看起来您是在尝试避免空指针问题,您应该做的是 if (fileFile != null) {
。 然后在 if 内部执行您想要的操作。
另外,因为看起来你包含它是为了避免这个警告,我会 认真地 从 catch 块中删除 NullPointerException
。那并不能帮助您避免警告。如果你想让我解释更多为什么不好,你可以发表评论,我会的,否则请相信我的话,这对你没有帮助。