Включите flush()
в свой основной блок и имейте только close()
в улове. Затем проверьте на ноль перед закрытием:
finally {
if(fw!=null) { fw.close(); }
}
С помощью сброса в главном блоке вы также можете попробовать / перехватить close
и записать или игнорировать любую ошибку:
finally {
if(fw!=null) {
try { fw.close(); } catch(Throwable thr) { log.printError("Close failed: "+thr); thr.printStackTrace(); }
}
}
или (обычно не рекомендуется):
finally {
try { fw.close(); } catch(Throwable thr) {;}
}
EDIT
Общая лучшая *1019* общая идиома Java для обработки ввода-вывода, IMO:
FileWriter fw=null;
try {
fw=new FileWriter(string);
fw.write(new String());
fw.close();
fw=null;
}
catch(IOException ie) {
// do something real here to handle the exception, or don't catch it at all.
}
finally {
if(fw!=null) {
try { fw.close(); } catch(Throwable thr) { thr.printStackTrace(); } // now we're really out of options
}
}
Это имеет важный эффект, позволяя catch
перехватывать и обрабатывать исключение, выданное самим close()
. (Предложение catch
должно присутствовать только в том случае, если вы можете обрабатывать исключение каким-либо образом; NOT ловить и игнорировать, а обычно Вы не должны просто ловить и отслеживать.)