2017-06-13 19 views
1

が動作していないスローは、私は2番目の部分は赤下線が引かれ未処理の例外 - テストケースで

ZahlPasstNicht zahlPasstNicht = new ZahlPasstNicht(min, max, ist); 

ラインを持っており、それは言う:未処理の例外:ZahlPasstNichtを

私がしようとし使用することができます/キャッチしたり、私は後者を実行しようとしました、コンストラクタはエラーをスローしてみましょう:

public class ZahlPasstNicht extends IndexOutOfBoundsException { 
    int a; 
    int b; 
    int c; 

    public ZahlPasstNicht(int a, int b, int c) throws ZahlPasstNicht { 
     this.a = a; 
     this.b = b; 
     this.c = c; 
    } 

を私が間違っているのか?

+1

これは奇妙な使用例です。例外がスローされる可能性はゼロです。例外クラスは例外をスローしません。 –

+0

'ZahlPasstNicht'を構築しているときに' ZahlPasstNicht'型の例外を発生させた場合、無限ループが発生することが予測されます...エラーを記録している間にエラーを投げているシステムを見て、エラーを記録しました。ログファイルは50Gbに展開されました。 – Persixty

+0

さらに、 'IndexOutOfBoundsException'が' RuntimeException'である 'RunsException'を投げるのは悪い習慣です。未チェックの例外は 'スロー 'を必要としません。チェック例外に対してのみ 'throws'を指定してください。 –

答えて

0

提供されているコードで間違っては何もありません。技術的には正しいですが、論理的にはありません。それは正常に動作していることがわかります。 You can see working code here

注:ideoneで以来、私は、唯一の単一のファイルにコードさせたので、ZahlPasstNichtクラスは、ここで公開されていません。

コードはで論理的に間違って理由:

  • コンストラクタZahlPasstNichtZahlPasstNichtを投げているが、ZahlPasstNichtのコンストラクタでタイプZahlPasstNichtの例外をスローするコードがないことを宣言しています。
  • ZahlPasstNichtの例外をコンストラクタZahlPasstNichtにスローすると、無限ループに陥ります。

問題はコードの他の部分にあるようです。コンストラクタZahlPasstNichtの引数が互換であること、つまり変数min,maxistintであることを確認してください。

1
public ZahlPasstNicht(int a, int b, int c) throws ZahlPasstNicht 

あなたのコンストラクタは、それがthrowがいますが、そのため例外が未処理になりtryブロックの外にそれを呼び出すことができることを指定します。

この場合、throw部分は必要ありません。

3

throws節を例外クラスのコンストラクタに配置することは意味がありません。なぜなら、例外クラスはインスタンス化されたときに別の例外(特にそれ自身ではない)を投げてはならないからです。

だけ

public ZahlPasstNicht(int a, int b, int c) { 
    this.a = a; 
    this.b = b; 
    this.c = c; 
} 

を書いて、あなたはそれをスローするつもりはない場合は、通常、あなたは例外クラスをインスタンス化しません。

これはあまり意味がありません。

ZahlPasstNicht zahlPasstNicht = new ZahlPasstNicht(min, max, ist); 

これが行います。

throw new ZahlPasstNicht(min, max, ist);