2017-12-31 174 views
-1

Die Bedingung (err == false) stellt sicher, dass i1 und i2 initialisiert werden, bevor sie verwendet werden. Die Eclipse zeigt jedoch an, dass i1, i2 möglicherweise nicht initialisiert wurde. Sicher, i1 initialisieren und i2 zu Null und das Problem zu lösen, aber ich frage mich, warum ich an erster Stelle muss.ungeklärte lokale Variable wurde möglicherweise nicht initialisiert

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

nur denken, was ist, wenn sie nicht initialisiert wurden? – Ravi

+0

Es ist Teil der Spezifikation, Java möchte Variablen nicht automatisch auf "0" initialisieren und zwingt den Benutzer sicherzustellen, dass die Variablen initialisiert werden. Dies ist wahrscheinlich, um undefiniertes Verhalten zu vermeiden. –

+0

@Ravi Einige Sprachen würden sie automatisch auf Null initialisieren. –

Antwort

0

Wenn e1 keine gültige Integer ist, Integer.parseInt() wird scheitern, und i1 nicht initialisiert wurden.

Die gleiche Geschichte für i2.

0

Wenn die try-Blöcke fehlschlagen, werden diese i1, i2 nicht initialisiert. Wenn die zweite fehlschlägt - i2 ist nicht festgelegt, dann haben Sie in Ihrer Druckanweisung eine Division durch Null. Dies führt zur Laufzeit ArithmeticException.

1

Sie dieses Problem, indem nur die Kodierung der „glücklichen Weg“ und umgeben vermeiden könnte, dass mit dem Block try/catch:

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

In diesem Fall ist 'err' wahrscheinlich unnötig und Sie können die Variablen auch innerhalb des try-Blocks initialisieren. – Pace

+0

@Place of cause ... repariert es –

0

denn wenn die eception throwed wird, bevor der int initialisiert wird, haben Sie ein int nicht initialisiert

0

Ihr Problem ist, was passiert, wenn einer oder beide Versuche {} fehlschlagen.

In diesem Fall haben i1 oder i2 (oder beide) keinen Wert, da sie in der Zuweisungszeile fehlgeschlagen sein könnten und in der catch-Klausel kein Wert angegeben ist.

Sie müssen entweder einen vorherigen Wert angeben oder sicherstellen, dass alle möglichen Pfade (in diesem Fall sowohl "try" als auch "catch") einen Wert ergeben.

Verwandte Themen