Java 如果我得到FileNotFoundException,是否应该关闭输出流?还有例外?
我有以下代码:Java 如果我得到FileNotFoundException,是否应该关闭输出流?还有例外?,java,android,memory-leaks,Java,Android,Memory Leaks,我有以下代码: private void save(Bitmap bitmap) { try { FileOutputStream fos = new FileOutputStream(path); bitmap.compress(Bitmap.CompressFormat.JPEG, COMPRESSION_QUALITY, fos); fos.close(); } catch (Fi
private void save(Bitmap bitmap) {
try {
FileOutputStream fos = new FileOutputStream(path);
bitmap.compress(Bitmap.CompressFormat.JPEG, COMPRESSION_QUALITY, fos);
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
是否需要关闭FileNotFoundException
catch块中的FileOutputStream
若抛出该异常,则意味着无法打开该文件,所以我认为并没有必要这样做。然而,我认为在IOException
catch块中执行它会很好
如果我不这样做,会不会导致内存泄漏错误或类似的情况
谢谢。如果您使用的是Java 7或更高版本,您应该使用资源试用,并由系统决定
private void save(Bitmap bitmap) {
try (FileOutputStream fos = new FileOutputStream(path)) {
bitmap.compress(Bitmap.CompressFormat.JPEG, COMPRESSION_QUALITY, fos);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
如果不是,那么首先确保流不是null
,最后在中执行
private void save(Bitmap bitmap) {
FileOutputStream fos = null;
try {
fos = new FileOutputStream(path);
bitmap.compress(Bitmap.CompressFormat.JPEG, COMPRESSION_QUALITY, fos);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null) {
fos.close();
}
}
}
完成读取或写入后,应始终关闭文件。否则,您将使资源处于繁忙状态,通常可能会出现问题。
如果您以这种方式修改代码,就不必关心关闭文件,java会考虑它
private void save(Bitmap bitmap) {
try(FileOutputStream fos = new FileOutputStream(path)) {
bitmap.compress(Bitmap.CompressFormat.JPEG, COMPRESSION_QUALITY, fos);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
没有什么可关闭的。FileOutputStream
构造函数引发异常;这条小河从未建造过;从未分配过fos
变量;在catch
块中,它超出范围。在这种情况下,fos未打开,fos将为空。所以没有什么可关闭的。请重试。@greenapps非空,只是从未分配,并且超出了catch
块的范围。您应该以FileOutputStream fos=null开始代码>当然在捕捉区之外..哦。。。那是你EJP。今天会是美好的一天。不要回答这个问题。如果出现FileNotFoundException
,或任何关闭,则无法进行任何读写操作。