2011-09-29 16 views
5

私はJavaのtry catchについてn00b /基本的な問題があります。 try catch文のスコープの問題

Ini myIni; 
try { 
    myIni = new Ini(new FileReader(myFile)); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

myIni.get("toto"); 

と、次のエラーメッセージ:のみトライエリアに限定してみてくださいの範囲は myIniが初期化されていない可能性があります変数

ですか? 次のコードでmyIniの結果を取得するにはどうすればよいですか?

+0

'e.printStackTrace()'をしないでください。ちょうど 'スローe'。 – BalusC

答えて

6

メッセージを避けるには、try文の前にデフォルト値を設定する必要があります。
または、tryステートメントのget()メソッドへの呼び出しを行う必要があります。

+0

hoho、それは本当にn00bの質問だった:)それからやっぱり。 – Cornelius

+1

@Cornelius - n00bの質問でも便利です) –

+0

質問はありません。 – Simeon

0

try catchブロックの中にmyIni.get( "toto")を挿入するか、Ini myIni = nullを書きます。最初の行に2番目のバリアントを実行すると、ファイルが見つからないか、他の理由で読み込めない場合にNullPointerExceptionが発生する可能性があります。

歓声! P

0

書き込みIni myIni = null;、それは

1

ことだが試すだけ試し面積に制限の範囲ですか?答えは「はい」です。問題は、オブジェクトを初期化するのを忘れてしまったことです。

これを試してみてください:

Ini myIni=null; 
try { 
    myIni = new Ini(new FileReader(myFile)); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

は、tryブロック内で呼び出されることを確認するためのチェックを行って、NullPointerExceptionが供給からプログラムを避けるためには、いくつかのデータを構築して、オブジェクトになりました。

if(myIni !=null) 
{ 
    myIni.get("toto"); 
} 

代替例外が発生した場合、オブジェクトが有効にnullになりますので、あなたがtry/catchブロックの外myIniを呼び出すにしたくない場合は、次のように、あなたが行うことができます。

try { 
    Ini myIni= new Ini(new FileReader(myFile)); 
    myIni.get("toto"); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
0

catchステートメントでは、変数の値を定義しません。したがって、myIni.get("toto");を実行してキャッチした場合、変数には値はありません。 get()の実行時にNPEを得るでしょう、そうであっても

Ini myIni = null; 
try { 
    myIni = new Ini(new FileReader(myFile)); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

myIni.get("toto"); 

:あなたはこのような何かをしたいと思います。あなたが欲しいものを行うには、あなたの正しい方法で

2

tryブロック内myIni.get("toto");を置くことです:

try { 
    Ini myIni = new Ini(new FileReader(myFile)); 
    myIni.get("toto"); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

いくつかの答えが提案されているようIni myIni = null;をしないでください。この場合、myIniの初期化時にIOExceptionがスローされた場合、コードはNullPointerExceptionをスローします。

+0

'myIni.get(" toto ");'行の前にnullをチェックすると、 – Simeon

4

はい、tryの範囲はそれに制限されています。実際にはスコープで始まる{で終わる}、したがってこれはまた、あなたの問題を解決するには、サブスコープ

void foo() { 
    { 
    Ini myIni = new Ini(new FileReader(myFile)); 
    } 

    myIni.get("toto"); //error here, since myIni is out of scope 
} 

を作成し、ヌルでmyIniを初期化し、試してみるが失敗した場合、myIni.get("toto");がもたらすことを承知しているであろうNullPointerExceptionで

だから、それを考慮に入れるか、catchブロックから別の例外をスローする必要があります。ヌルのため

チェック:

Ini myIni = null; 
try { 
    myIni = new Ini(new FileReader(myFile)); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

if(myIni != null) { 
    myIni.get("toto"); 
    //access the rest of myIni 
} else { 
    //handle initialization error 
} 

スロー例外:

Ini myIni = null; 
try { 
    myIni = new Ini(new FileReader(myFile)); 
} catch (IOException e) { 
    e.printStackTrace(); 
    throw new MyCustomInitFailedException(); //throw any exception that might be appropriate, possibly wrapping e 
} 

myIni.get("toto"); 

は、すでに述べたようにそれが可能かつ適切だ場合にもmyIniのあなたの全体の使用量の周りにtryブロックを置くことができ@khachikによって提案されました。どのソリューションを選択するかは、他の要件とデザインによって異なります。

1

これは、myIniの初期化が失敗する可能性があるとコンパイラが判断する方法です。 myIni = new Ini(new FileReader(myFile));行が例外をスローする可能性があるためです。

myIni.get("toto");myIniという行が表示されても失敗した場合、初期化されませんでした。

あなたは2つの選択肢があります。

  1. tryブロック内myIni.get("toto");を置きます。
  2. 最初にnullの値をmyIniに割り当て、それを定義してブロックの外側にあるnullをチェックします。
0

例外が発生した場合、変数myIniをインスタンス化できませんでした。そのため、コンパイラがそのような警告を発生させます。

あなたはそれを変更することができます。@khachikが指摘したように、それはtryブロック自体の内部変数を宣言して初期化することが最良である

Ini myIni = null; 
try { 
    myIni = new Ini(new FileReader(myFile)); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
if(myIni!=null){ 
myIni.get("toto"); 
} 
0

。傲慢と区別がつかないと確信している場合に限り、以下のようにtry bockの外側で初期化してください。

Ini myIni = null;