JAVA警告 - 去除可能的空指针。我该如何正确摆脱这个警告?

时间:2014-11-16 17:19:02

标签: java null dereference

我正在学习JAVA。

我似乎找不到办法摆脱这种可能的无效反应'警告。我已经在适当的范围内创建了fOut为null,否则我可能没有初始化'错误。

我无法找到一个简单的例子来帮助我解决这个问题。我知道这可能是一个简单的答案。

谢谢。

public static int waveToFile (String filename, byte[] byteWave)
{
    FileOutputStream fOut = null;


    File file = new File (filename);
    try
    {
        fOut = new FileOutputStream(file);
    }
    catch (IOException e)
    {

    }
    try{
        fOut.write(byteWave); //THIS IS WARNING of POSSIBLE DE-REFERENCE 
        fOut.close();                                  //OF NULL POINTER
       }
         catch (IOException e)
             {

             }


    return mErr;
}

3 个答案:

答案 0 :(得分:5)

如果抛出异常,fOut可以是null。因此编译器会警告你。

为避免这种情况,请检查它不是null

finally {
    if(fOut != null) {
        fOut.close();
    }
}

作为旁注:

  • 不要只是吞下异常(抓住他们无所事事)
  • close放入finally块以确保它已执行
  • 如果发生异常,请勿在{{1​​}}中写入

你也可以使用一个非常安全的try-with-resources statement并为你工作:

fOut

答案 1 :(得分:2)

事实是,您正在构建文件对象并在两个不同的try-catch块中使用它。所以如果失败了:

fOut = new FileOutputStream(file);

不会为fOut分配任何值,第一个catch将处理异常,执行将继续:

fOut.write(byteWave); //THIS IS WARNING of POSSIBLE DE-REFERENCE 
fOut.close();                                  //OF NULL POINTER

哈! fOutnull,因为前一个块失败了。警告是合理的。

首先,将两个操作包装在同一个try-catch块中:

FileOutputStream fOut = null;
File file = new File (filename);

try {
    fOut = new FileOutputStream(file);
    fOut.write(byteWave);
    fOut.close();
}
catch (IOException e) {
    // Do something
}

这段代码仍然存在问题:如果write失败并抛出异常,close 永远不会被召唤。您可以使用finally块来确保文件被关闭,无论是什么,或者更好的是关闭上下文:

File file = new File (filename);

try (FileOutputStream fOut = new FileOutputStream(file)){
    fOut.write(byteWave);
}
catch (IOException e) {
    // Do something
}

答案 2 :(得分:0)

你需要两次尝试阻止。

public static int waveToFile (String filename, byte[] byteWave)
{
    FileOutputStream fOut = null;


    File file = new File (filename);
    try
    {
        fOut = new FileOutputStream(file);
        fOut.write(byteWave); 
        if(fOut !=null){
          fOut.close();  
        }

    }
    catch (IOException e)
    {

    }
    return mErr;
}