我正在学习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;
}
答案 0 :(得分:5)
如果抛出异常,fOut
可以是null
。因此编译器会警告你。
为避免这种情况,请检查它不是null
:
finally {
if(fOut != null) {
fOut.close();
}
}
作为旁注:
close
放入finally块以确保它已执行你也可以使用一个非常安全的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
哈! fOut
为null
,因为前一个块失败了。警告是合理的。
首先,将两个操作包装在同一个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;
}