1

すべての例で、誰もが次のようなコードを見つけることができます:

DataInputStream inputStream = null;
try {
    inputStream = new DataInputStream( new FileInputStream("file.data"));
    int i = inputStream.readInt();
    inputStream.close();
} catch (FileNotFoundException e) { 
    //print message File not found
} catch (IOException e) { e.printStackTrace() }

このコードがFileNotFound例外に遭遇したとき、inputStream開いていなかったので、閉じる必要はありません。

しかし、なぜIOExceptionその catch ブロックで mets が表示されないのですかinputStream.close()。この操作は、入力データの例外がスローされたときに自動的に実行されましたか? プログラムが入力に問題がある場合、これはストリームがすでに開いていることを意味するためです。

4

3 に答える 3

2
DataInputStream inputStream = null;
try {
    inputStream = new DataInputStream( new FileInputStream("file.data"));
    int i = inputStream.readInt();
} catch (FileNotFoundException e) { 
  //print message File not found
} catch (IOException e) { 
  e.printStackTrace();
} finally{
  if(null!=inputStream)
    inputStream.close();
}
于 2013-01-16T20:11:42.207 に答える
2

いいえ、閉じる操作は自動的に呼び出されません。この目的のために、Java7でtry-with-resources導入された使用法:

try (DataInputStream inputStream = new DataInputStream( new FileInputStream("file.data"))) {
    int i = inputStream.readInt();
} catch (Exception e) { e.printStackTrace() }      

UPD:説明:インターフェースをDataInputStream実装しAutoCloseableます。つまり、構築時にtry-with-resourcesJavaは自動的にinhiddenfinallyブロックclose()のメソッドを呼び出します。inputStream

于 2013-01-16T20:12:50.770 に答える
2

ファイルが見つからない例外が発生した場合でも、スチームが開いている場合でも、もう一度閉じる必要があります。

try catch に finally ブロックを常に追加して、ストリームを閉じる必要があります。最後に、例外がある場合は常に実行されます

 finally {
            if(reader != null){
                try {
                    reader.close();
                } catch (IOException e) {
                    //do something clever with the exception
                }
            }
            System.out.println("--- File End ---");
        }
于 2013-01-16T20:14:13.493 に答える