3

큰 문제를 일으키는 문제가 있습니다. 나는 더 작은 것을 원해. 그렇다면 루프에서 과제에 액세스하는 방법은 무엇입니까?자바 : try-catch에서 할당에 액세스하는 방법 -loop?

$ javac TestInit2.java 
TestInit2.java:13: variable unknown might not have been initialized 
    System.out.println(unknown); 
        ^
1 error 

코드 당신은 (이 경우 내가 null을 사용했지만 응용 프로그램에 대한 의미가 어떤 값을 할당 주시기 바랍니다) unknown에 초기 값을 할당해야

import java.util.*; 
import java.io.*; 

public class TestInit2 { 

public static void main(String[] args){ 
    String unknown; 
    try{ 
    unknown="cannot see me, why?"; 
    }catch(Exception e){ 
    e.printStackTrace(); 
    } 
    System.out.println(unknown); 
} 
} 
+1

미래에 코드를 게시하는 대신 직접 질문 할 수 있습니까? 나는 당신이 거기에 질문을 넣었다는 것을 알고 있지만, 포스트의 상단이나 하단에있는 문장보다보기가 더 어렵습니다. 감사! – Pops

+0

예. 그러나 몇 가지 설명 텍스트를 제공하는 것이 여기에 표준으로 간주됩니다. "한마디"는 일반적으로 말하면 낙담합니다. – Pops

답변

4

컴파일러가 try-catch 블록 이후에 변수가 초기화되었다고 생각할 가능성이 높으므로 실수로 가장 가능성이있는 작업을 중지하고 있습니다. 그러나 예외가 발생하면 초기화되지 않습니다.

변수를 사용하기 전에 할당해야합니다. 그러나 할당에 실패하면 null이되도록하려면 null에 할당하는 것이 가능합니다. 당신이 할당이 실패 할 경우는 null로 변수를 원하는 경우

그래서,이 시도 :

String unknown = null; 
    try{ 
     unknown="cannot see me, why?"; 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
    System.out.println(unknown); 

당신이 예외가 잡힌 경우 뭔가 다른 변수를 설정하려면,이 시도 :

또한 할당이 실패한 경우 메서드 실행을 계속 진행하는 것이 타당하지 않은 경우 catch 블록에서 돌아가거나 호출자가 포착 할 수있는 다른 예외를 throw하는 것이 좋습니다. . 예를 들어 :

String unknown; 
    try{ 
     unknown="cannot see me, why?"; 
    }catch(Exception e){ 
     e.printStackTrace(); 
     //return; // if you just want to give up with this method, but not bother breaking the flow of the caller 
     throw new Exception("Uh-oh...", e); // if you want to be sure the caller knows something went wrong 
    } 
    System.out.println(unknown); 
+0

언제 try-loop 안에 Exception을 던지겠습니까? – hhh

+0

일반적으로 해당 catch 블록에 의해 catch 된 try 블록 내부에서 직접 예외를 throw하지 않습니다. 일반적으로 try 블록 내에서 호출하면 예외가 발생할 수 있습니다. catch 블록에서 예외를 다시 throw하는 것이 유용 할 수 있습니다. 그러나 메서드를 호출 한 사람이 성공하지 못했다는 것을 알고 싶다면 그 블록을 사용하는 것이 좋습니다. 로그를 남기는 것과 같은 예외를 먼저 처리 한 다음 직접적으로 다시 throw하거나 새로운 예외로 감싸서 그 중 하나를 throw 할 수 있습니다. – pkaeding

9

:

import java.util.*; 
import java.io.*; 

public class TestInit2 { 

    public static void main(String[] args){ 
     String unknown = null; 
     try{ 
      unknown="cannot see me, why?"; 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
     System.out.println(unknown); 
    } 
} 

할당이 try 안에 발생하므로 컴파일러는 v unknown에 값이 할당되도록 가능 할당 된 값없이 변수를 사용할 수 있습니다.

+1

나는 "(오류가 발생했습니다)"또는 이와 비슷한 것을 기본값으로 시작할 것이라고 생각합니다. – extraneon

+2

catch 내에서 예외를 throw하는 경우 (예외가 복구 할 수없는 경우) 또는 catch 절에서 변수 값을 설정하면 해결됩니다. – aperkins

2

신고시 unknown 값을주지 말고, 심지어 null이 아닙니다. 컴파일러는 try 블록에서 어떤 일이 발생하는지 알지 못하므로 내부에서 일어나는 일을 보장 할 수 없습니다. 그래서, 알고있는 한, unknown은 귀하의 println() 조회수가 될 때까지 아무것도 참조하지 않습니다.

편집 : 모든 컴파일러는 try 블록 중에 예외가 발생할 수 있다는 것을 알고 있으므로 거기에 넣은 것이 성공할 것이라고 가정 할 수 없습니다.

+0

주요 포인트 : try-catch 외부에서 값을 초기화해야합니까? – hhh

+1

그렇다면 null과 같은 더미 값을 사용하는 경우에도 try-catch 블록 외부에서 값을 초기화해야합니다. 하지만 실제로, 여기서 벗어나는 것은 시도에서 무엇인가에 절대적으로 의존하거나 일어날 수 없다는 것입니다. – Pops

3

초기화하지 않은 해당 변수의 값을 "설정"하려고합니다. 즉, 해당 할당을 시도 할 때 예외가 잡히면 할당이 수행되지 않고 변수가 초기화되지 않은 상태로 유지됩니다. 최소한,에 println 뭔가를 해결할 수있을 것입니다, 그 방법

String unknown = null; 

: 오류를 제거하려면, 같은 변수를 선언합니다.

1

컴파일러 메시지의 핵심 단어는 입니다.println 호출에서 변수에 액세스 할 때 변수를 초기화 할 수 없다는 것을 의미하지는 않습니다. 따라서 컴파일러가 불평 할 가능성이 있습니다.