2016-06-14 6 views
0

インターフェイスを使用して定数を処理すると、例外をスローする定義済みのメソッドを呼び出すことができません。この未処理例外が表示されるのはなぜですか?

public interface ParametresConstantes { 
    public static final String DB_CONNEXION = ChargementProjetProperties.getInstance().getValueByKey("conn"); 
//a red line under the right part of this instruction. 
    public static final int SIZE_TEXT_FIELD = 20; 
} 



public String getValueByKey (String key) throws Exception 
{ 
    String value = null; 
    load(); 
    if (props.containsKey(key)) 
    { 
     value = props.getProperty(key); 
    } 
    else 
    { 
     throw new Exception ("no key found"); 
    } 
    return value; 
} 

どのように修正するのですか?

EDIT

以下に説明するように、静的ブロックは、インターフェイス上でそれを実装するクラスでは動作できないので、変数が最終であり、割り当てることができないので、私は一時的value=""によってelseブロックに置き換えるとスローを取り除き、残りを守った。

あなたは

+3

正確なエラーとスタックトレースを提供してください。また、インターフェイスが例外をスローできるメソッドを呼び出しているが、インターフェイス内で何も処理していないと考えてください。 –

+1

イニシャライザで例外をキャッチすることはできません。そのコードをメソッドまたは静的ブロックに移動します。 – m0skit0

+1

それ以上の場合、チェックされた例外をスローしないでください。確かにそのメソッドから基底の例外もスローしないでください。代わりにチェックされていないIllegalArgumentExceptionをスローします。 –

答えて

0

getValueByKeyメソッドが例外をスローありがとう、あなたはどこにでもそれをキャッチされていません。そのため、処理されない例外があると言われています。あなたのインターフェイスにDB_CONNEXIONを宣言しなければなりませんが、その例外を扱うことができる下流のどこか(そのインターフェイスを実装したクラス)を定義してください。

1

あなたが言ったように、この問題はここで例外をスローするメソッドを使用できないという事実から来ています。

文法的に、それは静的な初期化ブロックで動作します:

public static URI uri; 

static { 
    try { 
    uri = new URI("http://www.example.com/image.jpg"); 
    } catch(Exception e) { 
    //Eventually throw new IllegalArgumentException(); 
    } 
} 

しかし、私は強くそれをしないためにアドバイス。 IMHO、静的初期化ブロックは、設計に何か問題があることを示す手掛かりです。

私は、メソッドを定義することクリーナーであることを考える:

public String getDBConnection() { 
    return ChargementProjetProperties.getInstance().getValueByKey("conn"); 
} 
+1

*「スタティック初期化ブロックは、設計に何か問題があることを示す手がかりです」*面白いですが、参考にしてください。 – m0skit0

+0

私はこれを試しましたが、 'インタフェースParametresConstantesは初期化子を定義できません'エラー – TiMr

+1

@ m0skit0私はそれが主に意見に基づいていることを認めます。私はクラスの初期化時に潜在的な副作用の考えが好きではありません。 +それは単体テストのために物事を難しくします。このユースケースでは、おそらく依存性注入が最適なオプションです。それが唯一の意見であることを正確にするために答えを編集しました。 –

0

static final String DB_CONNEXION初期化同等の静的コンストラクタ関数と、それに例外がスローさまたは上昇させた場合、例外を処理する機会がありません。より良い方法は、静的コンストラクタを例外なく機能させるか、またはレジスタを登録することです。UncaughtExceptionHandler