2016-06-24 21 views
0

私はJavaには比較的新しいので、私は回避方法を考え出すことができませんでした。私はキャッチ/ Ex2の処理を削除した場合、それは文句を言うしません一方Java例外処理:戻り値のタイプがありません

// Ex2 is a child of Ex1 
public T method(someType someArg) throws Ex1{ 
    try{ 
    someFunc() // Throws both Ex1 and Ex2 
    T ret = someOtherFunc() //Throws Ex1, cannot declare/initialize ret outside 
    return ret 
    } catch(Ex2){ 
    //do something 
    } catch(Ex1){ 
    //do something 
    } 

} 

Javaは戻り値の型が見つからないとエラーが出る:

は、ここに私のコードです。

+0

例外は、実行時に起こる何かです。あなたが持っているものは、*エラーをコンパイルすることです。 – Andreas

答えて

2

お客様のメソッドはTを返さなければなりません。return null;を最後のステートメントとして追加することができます。それとも、あなたは単に例外をキャッチし、それらをログに記録/取り扱い後は例外をスローしていない場合は、この方法が正しくエラーを処理するが、何も返していない

public T method(someType someArg) throws Ex1{ 
    T ret = null; 
    try{ 
    someFunc(); // Throws both Ex1 and Ex2 
    ret = someOtherFunc(); 
    } catch(Ex2){ 
    //do something 
    } catch(Ex1){ 
    //do something 
    } 
    return ret; 
} 
+0

しかし、Ex2のcatchブロックを削除するとコードがコンパイルされ、Ex1だけが処理されます。私はこの行動を理解したい。 –

+0

@FayazAhmedその後、これらのキャッチブロック内のコードを非表示にすることをお勧めしました。しかし、一般的に言えば、 'return'ステートメントが必要です。例外を投げてメソッドを中止することもできます。 'catch Ex2'は後者ではないので、' return'が必要です。 'catch Ex1'は例外を再スローするか、新しい例外をスローします。 – Tom

1

ようret(のデフォルト値)の可視性を変更(ブーム、コンパイルエラー)。

例外を自分で処理する場合は、null(または他の妥当な無効な値)を戻すか、キャッチされた例外を再度スローする必要があります。

あなたは(EX1以外の)例外を再スローする場合は、必ずたとえば、メソッドシグネチャ

に追加します

// Ex2 is a child of Ex1 
public T method(someType someArg) throws Ex1{ 
    try{ 
    someFunc() // Throws both Ex1 and Ex2 
    T ret = someOtherFunc() //Throws Ex1, cannot declare/initialize ret outside 
    return ret; 

    } catch(Ex2 ex2){   
    // either re-throw the exception (or return null instead) 
    throw ex2; 

    } catch(Ex1 ex1){   
    // or return a null value (you can re-throw the exception instead) 
    return null; 
    } 
    // you can also return null here if you want to catch/handle both exceptions separately but want to return null in either case 
    // return null; 
} 
関連する問題