2017-05-09 1 views
0

私はユーザーからの入力を受け取り、それらを表示する単純なアプレットプログラムを作成していました。 `初期化が大丈夫であることなく、他の文字列変数S1を宣言しながら、strの変数はnullに宣言する必要がありますされていることを理由paint()メソッドで 文字列変数を初期化する必要があり、javaで宣言する際に初期化を必要としないことがあるのはなぜですか?

public void init(){ 
    text1=new TextField(8); 

    add(text1); 

    text1.setText("0"); 

} 
public void paint(Graphics g){ 
    int x=0; 
    String s1,str = null; 
    g.drawString("input in the box",10,50); 
    try{ 
     s1=text1.getText(); 
     str=String.valueOf(s1); 


    } 
    catch(Exception e){} 
    g.drawString(str,75,75); 
} 
public boolean action (Event event,Object object){ 
    repaint(); 
    return true; 
} 

`

? ITはstr変数を初期化せずにコンパイルしません。

+0

)の初期化を必要とせず、(関数やコンストラクタの内側にある)のみのローカル変数が初期化される必要がある* *「なぜstrの変数はnullに宣言されなければならないということです」FWIW、 '= null'ビットは*宣言*ではなく、*初期化*です。 –

+0

これは両方の変数をstrだけでなくnullに初期化しています。さまざまな方法で変数を宣言できます。これを参照してください:http://www.learnjavaonline.org/en/Variables_and_Types – Phobos

+1

@Phobosこれは最後の変数にのみ適用されます。両方を初期化するには 'String s1 = null、str = null;'が必要です。 –

答えて

3

あなたは、価値を持つことが保証だ場所にs1の値を使用しますが、あなたはそれが価値を持つことが保証ない場所(catchハンドラ)でstrを使用しているためであれば、あなたドン結局のところ、strに代入する前に、tryに例外がスローされる可能性があります。

あなたはtryg.drawString(str,75,75);への呼び出しを移動した場合、あなたは= null初期化は必要ありません。


サイドノート:s1すでに文字列であるので、str = String.valueOf(s1)を行う必要はありません。 g.drawString(str,75,75);行にs1を使用してください。

0

Javaコンパイラは、何かのために使用されている時間までに値を持つことが保証されている限り、初期化されていない変数を許可します。

String s1,str = null; // s1 is not set 
g.drawString("input in the box",10,50); 
try{ 
    s1=text1.getText(); // s1 is set 
    str=String.valueOf(s1); // s1 is used 
} 
catch(Exception e){} 
g.drawString(str,75,75); 

前の行がs1を初期化しているので、それが安全にString.valueOfに渡すことができます。

strの問題は、try-catchブロックの後で使用されているため、設定されている行をスキップする可能性があります。

String s1,str; // str is not set 
g.drawString("input in the box",10,50); 
try{ 
    s1=text1.getText(); // if this throws an exception... 
    str=String.valueOf(s1); // ...this is never reached 
} 
catch(Exception e){} // the exception is caught and ignored, so we continue 
g.drawString(str,75,75); // str is still not set - error! 

初期化前に変数が使用されている可能性がある限り、コンパイラはそれを拒否します。この場合、キャッチブロックでstrをデフォルト値に設定するか、キャッチブロックからreturnまたはthrowを設定して、tryブロックが例外なく完了した場合にのみg.drawString行に到達するようにできます。

0

インスタンス変数は

関連する問題