web-dev-qa-db-ja.com

Javaの例外を無視する方法

私は次のコードを持っています:

_TestClass test=new TestClass();
test.setSomething1(0);  //could, but probably won't throw Exception
test.setSomething2(0);  //could, but probably won't throw Exception
_

test.setSomething2(0);(上の行)が例外をスローしても、test.setSomething(0)を実行したいと思います。これ以外に行う方法はありますか?

_try{
   test.setSomething1(0);
}catch(Exception e){
   //ignore
}
try{
   test.setSomething2(0);
}catch(Exception e){
   //ignore
}
_

私はたくさんのtest.setSomethingが連続していて、それらはすべて例外を投げることができました。もしそうなら、その行をスキップして次の行に移動したいだけです。

明確にするために、例外がスローされるかどうかは関係なく、この例外をスローするコードのソースコードを編集することはできません。

このIS例外について気にしない場合(「例外を無視してはならない」などの普遍的に定量化されたステートメントは使用しないでください)。オブジェクトの値を設定しています。ユーザーに値を提示するときは、とにかくnullチェックを行うので、実際にコード行が実行されるかどうかは問題ではありません。

14
Nick

私は、テストされたコードからスローされた例外を無視するテストコードの正気性を深刻に疑います。とはいえ、自分が何をしているかを知っていると仮定すると...スローされた例外を根本的に無視する方法はありません。できる最善のことは、例外をスローするコードをラップするために必要な定型文を最小限にすることです。

Java 8を使用している場合、これを使用できます。

public static void ignoringExc(RunnableExc r) {
  try { r.run(); } catch (Exception e) { }
}

@FunctionalInterface public interface RunnableExc { void run() throws Exception; }

次に、静的インポートを暗示して、コードは

ignoringExc(() -> test.setSomething1(0));
ignoringExc(() -> test.setSomething2(0));
19
Marko Topolnik
try {
 // Your code...
} catch (Exception ignore) { }

ignoreキーワードの後に​​Word Exceptionを使用します。

14
Joe Almore

Javaでは例外を無視できません。メソッドが何かをスローできると宣言した場合、これは重要なことができないためであり、エラーはメソッドデザイナによって修正できないためです。あなたが本当にあなたの人生を単純化したくない場合、このような他のメソッドでメソッド呼び出しをカプセル化します:

class MyExceptionFreeClass {
  public static void setSomething1(TestClass t,int v) {
    try {
      t.setSomething1(v);
    } catch (Exception e) {}
  public static void setSomething2(TestClass t,int v) {
    try {
      t.setSomething2(v);
    } catch (Exception e) {}
}

必要なときに呼び出します:

TestClass test=new TestClass();
MyExceptionFreeClass.setSomething1(test,0);
MyExceptionFreeClass.setSomething2(test,0);

残念ながら、ありません。これは意図的なものです。正しく使用された場合、例外は無視されてはなりません。例外は何かが機能しなかったこと、通常の実行パスをたどらないことを示しているためです。例外を完全に無視することは、「敷物の下に掃く」アンチパターンの例です。そのため、この言語は、そうするのを簡単にサポートしていません。

おそらく、TestClass.setSomethingが例外をスローしている理由を調べる必要があります。多数のセッターメソッドが正しく機能しなかった場合、「テスト」しようとしているものは何でも本当に有効になりますか?

1
Dogs

例外を無視しないでください。それらを処理する必要があります。テストコードをシンプルにしたい場合は、try-catchブロックを関数に追加します。例外を無視する最大の方法は、適切なコーディングによってそれらを防ぐことです。

0
Lajos Arpad

IntelliJ Idea IDEは、変数の名前をignoredに変更することを提案します

使用されないとき。

これは私のサンプルコードです。

try {
    messageText = rs.getString("msg");
    errorCode = rs.getInt("error_code");
} catch (SQLException ignored) { }
0
ivanoklid

これは古いことは知っていますが、例外を無視したい場合があると思います。解析するパーツの区切りセットを含む文字列があると考えてください。ただし、この文字列には、たとえば6、7、または8つの部分が含まれることがあります。配列に要素が存在することを確認するために毎回lenをチェックすることは、単に例外をキャッチして続行するのと同じくらい簡単だとは思いません。たとえば、「/」文字で区切られた文字列を分割したいのです。

public String processLine(String inLine) {
    partsArray = inLine.split("/");

    //For brevity, imagine lines here that initialize
    //String elems[0-7] = "";

    //Now, parts array may contains 6, 7, or 8 elements
    //But if less than 8, will throw the exception
    try {
        elem0 = partsArray[0];
        elem1 = partsArray[1];
        elem2 = partsArray[2];
        elem3 = partsArray[3];
        elem4 = partsArray[4];
        elem5 = partsArray[5];
        elem6 = partsArray[6];
        elem7 = partsArray[7];
    catch (ArrayIndexOutOfBoundsException ignored) { }

    //Just to complete the example, we'll append all the values
    //and any values that didn't have parts will still be
    //the value we initialized it to, in this case a space.
    sb.append(elem0).append(elem1).append(elem2)...append(elem7);

    //and return our string of 6, 7, or 8 parts
    //And YES, obviously, this is returning pretty much
    //the same string, minus the delimiter.
    //You would likely do things to those elem values
    //and then return the string in a more formatted way.
    //But was just to put out an example where
    //you really might want to ignore the exception
    return sb.toString();
}
0
user25839