2017-12-31 13 views
-1

条件(err == false)は、使用する前にi1およびi2が初期化されていることを確認します。しかし、日食はi1i2が初期化されていない可能性があります。 確かに、i1i2をゼロに初期化して問題を解決してください。しかし、なぜ私は最初にする必要があるのだろうかと思います。説明できないローカル変数が初期化されていない可能性があります。

String e1 = request.getParameter("e1"); 
String e2 = request.getParameter("e2"); 
if (e1 != null && e2 != null) { 
    int i1, i2; 
    boolean err = false; 

    try { 
     i1 = Integer.parseInt(e1); 
     if (i1 < 0) { 
      err = true; 
     } 
    } catch (Exception e) { 
     err = true; 
    } 

    try { 
     i2 = Integer.parseInt(e2); 
     if (i2 == 0) { 
      err = true; 
     } 
    } catch (Exception e) { 
     err = true; 
    } 

    if (err == false) { 
     out.println("Result = " + (i1/i2)); 
    } 
} 
+0

ちょっと考えておけば、初期化されていないのはどうでしょうか? – Ravi

+0

これは仕様の一部ですが、Javaは変数を自動的に '0'に初期化したくないため、変数を初期化するように強制します。おそらく未定義の動作を避けるためです。 –

+0

@Ravi言語によっては、自動的にゼロに初期化される言語もあります。 –

答えて

0

e1が有効Integerでない場合は、Integer.parseInt()は失敗し、i1は初期化されていません。

同義語i2です。

0

ブロックが失敗すると、i1,i2は初期化されません。秒が失敗した場合 - i2が設定されていない場合、printステートメントでゼロ除算が行われます。これにより、実行時にArithmeticExceptionになります。

1

あなただけの「ハッピーパス」を符号化することにより、その問題を回避しtry/catchブロックしていることを囲むことができます。intが初期化される前にeceptionがthrowedされている場合

String e1 = request.getParameter("e1"); 
String e2 = request.getParameter("e1"); 
if (e1 != null && e2 != null) { 
    try { 
     int i1 = Integer.parseInt(e1); 
     int i2 = Integer.parseInt(e2); 
     if (!(i1 < 0 && i2 == 0)) { 
      out.println("Result = " + (i1/i2)); 
     } 
    } catch (Exception e) { 
     Syste.err.println(e); 
    } 
} 
+0

この場合、 'err'は不要である可能性が高く、tryブロック内の変数も初期化できます。 – Pace

+0

@Pace of cause ...それを修正しました –

0

、あなたはint型を持っているので、初期化されていません

0

try {}のいずれかまたは両方が失敗した場合には何が起こりますか。

この場合、i1またはi2(またはその両方)は、割り当て行で失敗し、catch句に値が指定されていない可能性があるため、値を持ちません。

以前の値を与えるか、すべての可能なパス(この場合は "試行"と "キャッチ"の両方)が値を与えるようにする必要があります。