Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java取消引用可能的空指针_Java_Null - Fatal编程技术网

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