2016-07-20 5 views
1

コードでtry-catchブロックを使用するたびに、コードは常にパターンに従います。 最初にリソースを開くためのtry-catchブロックと、それに続くヌルチェックと、最後にtry-catchブロックを使用してリソースを読み取ります。 これは厄介なパターンですか?もしそうなら、良いデザインはどのように見えますか?ここで悪いtryキャッチブロックデザイン?

は私が

public static void main(String[] args) { 
    Process process = null; 
    try { 
     process = Runtime.getRuntime().exec("C:\\program.exe"); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    if (process == null) { 
     return; 
    } 
    try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) { 
     String line; 
     while ((line = reader.readLine()) != null) { 
      System.out.println(line); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
+0

私はメソッドを介してreturn文ミッドウェイが好きではありません。 – BevynQ

+0

@BevynQはまったく別の議論です。http://stackoverflow.com/questions/4838828/why-should-a-function-have-only-one-exit-point –

+0

プロセスの作成中に例外が発生した場合は、 catchブロックから、後で 'process'でnullをチェックする理由は? –

答えて

4

あなたの問題は、あなたがnullのチェックを必要とする理由であるあなたのコード内の例外を抑制していることであることを意味するものの一例です。特に、これはあなただけ例外が伝播してみましょうことができmain()方法であることから:

​​

問題があるとき(Javaはmain()からスローされた例外のスタックトレースを出力するので)これはまだ、スタックトレースを出力しますしかし、processは決してnullになることはありません。一般的には、あまりにも熱心に例外をキャッチするのを避ける必要があります。の場合は、を実行することができます。そうでない場合は、呼び出し側にそれらを渡します(おそらく新しい例外型でそれらをラップする)。

例外について気にしないで、実際にそれらを期待していない場合は、RuntimeExceptionを代わりに使用できます。これはまだあなたが不要なヌルチェックを避けることができますが、またthrowsであなたのメソッドに注釈を付ける必要はありません:

public static void main(String[] args) { 
    try { 
    Process process = Runtime.getRuntime().exec("C:\\program.exe"); 
    try (BufferedReader reader = 
     new BufferedReader(new InputStreamReader(process.getInputStream()))) { 
     String line; 
     while ((line = reader.readLine()) != null) { 
     System.out.println(line); 
     } 
    } 
    } catch (IOException e) { 
    throw new IllegalStateException(
     "Unexpected exception while executing a subprocess", e); 
    } 
} 
+0

ああ、すべての例外をキャッチしてログに記録するのは良い習慣だと思った。 – user2997204

+1

確かに、ロギングの例外は、あなたが何をしたいのか*するのに合理的なことです*。確かにあなたがデフォルトでやるべきことではありません。デフォルトではフェール・ファーストで、意図した場合にのみ例外を抑制/ログします。 – dimo414

+0

この問題を解決してくれてありがとう! – user2997204

関連する問題