2

そう。私はAndroidでいくつかのネットワークをやろうとしています。私の非同期タスク内で、私はやっています:

InputStream streamOfDestiny = null;

try{
    // do some network stuff here...
}
finally{
    if(streamOfDestiny != null){
        streamOfDestiny.close(); // Build error here. Apparently, closing a stream can cause an IOException. Why this is the case, I do not know. But it is. And, since this is Java, I apparently need to care.
    }
}

だから今、私はすべてを汚すこの IOException を手に入れました。私はこのようなことができます:

InputStream streamOfDestiny = null;

try{
    // do some network stuff here...
}
finally{
    if(streamOfDestiny != null){
        try{
            streamOfDestiny.close();
        }
        catch(IOException e){
            // Hey look! I'm inside a catch block, inside a finally block!
        }
    }
}

しかし、それはひどいように見えます。finally ブロック内の try/catch ブロック? なんて醜い!閉じないままにしておくこともできますが、それは私には悪い習慣のように思えますし、間違っていると感じています (私はストリームを開始しましたが、終了したいと思っています)。私はこれを行うことができます:

IOUtils.closeQuietly(streamOfDestiny);

しかし、今は org.apache.commons.io.IOUtils を見つけて、どうにかしてパッケージに含める必要があります。あまりにも多くの作業に加えて、必要な機能が 1 つだけのパッケージ サイズが大きくなります。ラメ。

私はいつでも自分のバージョンの closeQuietly を書くことができました:

public static void closeStreamQuietly(InputStream streamToClose){
    try{
        streamToClose.close();
    }
    catch (IOException e){
        // ignore it....
    }
}

しかし、それは私が車輪を再発明しているように思えます。これはほとんどの場合悪いニュースです.これを行うには、ここで完全に欠けている素敵でエレガントな方法があるはずです.

アイデアはありますか?

4

4 に答える 4

0

謎はありません。close()ほとんどの実装で呼び出しflush()(についてはJavadocを参照FilterOutputStream)、I/Oを実行する可能性があるためflush()スローできます。IOException,他の可能性も考えられます。

于 2012-12-03T09:47:29.213 に答える
0

オプション 2 (最後に内部の try-catch ブロック) またはオプション 4 (小さな util メソッドの作成) を醜いまたは余分な作業と呼んでいる理由がわかりません。これは正常であり、予期されたものです。

内部にコードを記述している場合はfinally、関連する例外処理を行う必要があります。これがこのケースです。

nullチェックを入れることによってすでに(予防的に)行った1つの例外処理。そうしないと、 nullのNullPointerExceptionときにスローされる可能性があります。streamOfDestiny

not open2 番目の例外処理は、Stream が である、unavailableまたはこのit's not able to release the underline resourcesようなシナリオなどの理由で発生する可能性がある、Stream を閉じる例外シナリオを処理するために必要です。

于 2012-12-03T05:03:02.720 に答える
0

Web から IOUtils コードを直接コピーします。

http://grepcode.com/file/repo1.maven.org/maven2/commons-io/commons-io/1.4/org/apache/commons/io/IOUtils.java#IOUtils.closeQuietly%28java.io.InputStream% 29

また、finally ブロック内での例外処理にも慣れてください。あなたがそれを見るのはこれが最後ではありません。

于 2012-12-03T05:25:10.157 に答える