788

Javaでは、次のようなことをしたいと思います。

try {
    ...     
} catch (/* code to catch IllegalArgumentException, SecurityException, 
            IllegalAccessException, and NoSuchFieldException at the same time */) {
   someCode();
}

...それ以外の:

try {
    ...     
} catch (IllegalArgumentException e) {
    someCode();
} catch (SecurityException e) {
    someCode();
} catch (IllegalAccessException e) {
    someCode();
} catch (NoSuchFieldException e) {
    someCode();
}

これを行う方法はありますか?

4

10 に答える 10

1252

これは、Java7以降で可能になりました。マルチキャッチブロックの構文は次のとおりです。

try { 
  ...
} catch (IllegalArgumentException | SecurityException | IllegalAccessException |
            NoSuchFieldException e) { 
  someCode();
}

ただし、すべての例外が同じクラス階層に属している場合は、その基本例外タイプを簡単にキャッチできることを忘れないでください。

また、から直接または間接的に継承されている場合は、同じブロック内で両方ExceptionAをキャッチすることはできないことに注意してください。コンパイラは文句を言います:ExceptionBExceptionBExceptionA

Alternatives in a multi-catch statement cannot be related by subclassing
  Alternative ExceptionB is a subclass of alternative ExceptionA

これに対する修正は、子孫タイプの例外もキャッチするため、例外リストに祖先例外のみを含めることです。

于 2010-08-16T18:11:12.373 に答える
114

Java 7の直前ではありませんが、次のようにします。

Java6以前

try {
  //.....
} catch (Exception exc) {
  if (exc instanceof IllegalArgumentException || exc instanceof SecurityException || 
     exc instanceof IllegalAccessException || exc instanceof NoSuchFieldException ) {

     someCode();

  } else if (exc instanceof RuntimeException) {
     throw (RuntimeException) exc;     

  } else {
    throw new RuntimeException(exc);
  }

}



Java 7

try {
  //.....
} catch ( IllegalArgumentException | SecurityException |
         IllegalAccessException |NoSuchFieldException exc) {
  someCode();
}
于 2012-08-28T09:15:50.683 に答える
26

Java 7内では、次のような複数のcatch句を定義できます。

catch (IllegalArgumentException | SecurityException e)
{
    ...
}
于 2010-08-16T18:12:44.397 に答える
20

例外の階層がある場合は、基本クラスを使用して、例外のすべてのサブクラスをキャッチできます。縮退した場合、次のようにしてすべてのJava例外をキャッチできます。

try {
   ...
} catch (Exception e) {
   someCode();
}

より一般的なケースでは、RepositoryExceptionが基本クラスであり、PathNotFoundExceptionが派生クラスである場合、次のようになります。

try {
   ...
} catch (RepositoryException re) {
   someCode();
} catch (Exception e) {
   someCode();
}

上記のコードは、ある種類の例外処理に対してRepositoryExceptionとPathNotFoundExceptionをキャッチし、他のすべての例外はひとまとめにされます。上記の@OscarRyzの回答によると、Java 7以降:

try { 
  ...
} catch( IOException | SQLException ex ) { 
  ...
}
于 2010-08-16T18:12:17.497 に答える
19

いいえ、Java7より前の顧客ごとに1つ。

すべての場合に同じアクションを実行する限り、java.lang.Exceptionなどのスーパークラスをキャッチできます。

try {
    // some code
} catch(Exception e) { //All exceptions are caught here as all are inheriting java.lang.Exception
    e.printStackTrace();
}

しかし、それはベストプラクティスではないかもしれません。例外を実際に処理するための戦略がある場合にのみ、例外をキャッチする必要があります。ログと再スローは「処理」ではありません。修正措置がない場合は、それをメソッドシグネチャに追加して、状況を処理できる誰かにバブルアップさせることをお勧めします。

JDK 7以降では、次のことができます。

try {
    ...     
} catch (IllegalArgumentException | SecurityException | IllegalAccessException | NoSuchFieldException e) {
    someCode();
}
于 2010-08-16T18:09:02.247 に答える
11

Java 6(つまり、Android)でのuser454322の回答に代わる、よりクリーンな(ただし、冗長性は低く、おそらくあまり好ましくない)代替手段は、すべてをキャッチしExceptionて再スローすることRuntimeExceptionです。これは、スタックのさらに上位にある他のタイプの例外をキャッチすることを計画している場合は機能しませんが(それらを再スローしない限り)、チェックされたすべての例外を効果的にキャッチします。

例えば:

try {
    // CODE THAT THROWS EXCEPTION
} catch (Exception e) {
    if (e instanceof RuntimeException) {
        // this exception was not expected, so re-throw it
        throw e;
    } else {
        // YOUR CODE FOR ALL CHECKED EXCEPTIONS
    } 
}

とはいえ、冗長性を保つために、ブール値またはその他の変数を設定し、それに基づいてtry-catchブロックの後にコードを実行するのが最適な場合があります。

于 2013-10-18T21:04:32.687 に答える
4

7より前ではどうですか:

  Boolean   caught = true;
  Exception e;
  try {
     ...
     caught = false;
  } catch (TransformerException te) {
     e = te;
  } catch (SocketException se) {
     e = se;
  } catch (IOException ie) {
     e = ie;
  }
  if (caught) {
     someCode(); // You can reference Exception e here.
  }
于 2015-02-16T18:08:04.453 に答える
3

それは非常に簡単です:

try { 
  // Your code here.
} catch (IllegalArgumentException | SecurityException | IllegalAccessException |
            NoSuchFieldException e) { 
  // Handle exception here.
}
于 2021-01-20T12:24:11.507 に答える
1

kotlinの場合、現時点では不可能ですが、追加することを検討しています。ソース
しかし、今のところ、ちょっとしたトリック:

try {
    // code
} catch(ex:Exception) {
    when(ex) {
        is SomeException,
        is AnotherException -> {
            // handle
        }
        else -> throw ex
    }
}
于 2019-09-17T19:48:08.403 に答える
0

例外階層で親クラスである例外をキャッチします。もちろん、これは悪い習慣です。あなたの場合、共通の親例外はたまたまExceptionクラスであり、Exceptionのインスタンスである例外をキャッチすることは、実際には悪い習慣です。NullPointerExceptionのような例外は通常、プログラミングエラーであり、通常はnull値をチェックすることで解決する必要があります。

于 2010-08-16T18:10:05.170 に答える