2017-12-31 125 views
-1

조건 (err == false)은 i1i2이 사용되기 전에 초기화되었는지 확인합니다. 그러나 일식은 i1, i2이 초기화되지 않았을 수도 있음을 보여줍니다. 확실히 i1i2을 0으로 초기화하고 문제를 해결하십시오. 그러나 처음부터 왜해야만하는지 궁금합니다.설명되지 않은 로컬 변수가 초기화되지 않았을 수 있음

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으로 초기화됩니다. –

답변

0

e1 유효한 IntegerInteger.parseInt()이 실패하지 않은 경우, 그리고 i1가 초기화되지 않았을 것입니다.

같은 이야기는 i2입니다.

0

try- 블록이 실패하면 해당 i1, i2이 초기화되지 않습니다. 두 번째가 실패하면 - i2이 설정되지 않은 경우 print 서술문에서 0으로 나누어집니다. 그러면 런타임에 ArithmeticException이됩니다.

당신은 단지 "행복한 경로"를 코딩하여 해당 문제를 방지 및 서라운드 수
1

try/catch 블록 다음 우유 공급이 throwed 경우 INT가 초기화되기 전에 때문에

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

, 당신은 지능 초기화되지 않았습니다.

0

try {} 중 하나 또는 둘 다 실패하면 문제가 발생합니다.

i1 또는 i2 (또는 둘 다)는 할당 라인에서 실패하고 catch 절에 값이 주어지지 않았기 때문에 값을 가지지 않습니다.

이전 값을 주거나 가능한 모든 경로 (이 경우 "try"와 "catch"모두)가 값을 제공해야합니다.