2011-09-29 5 views
5

Java에서 try catch에 대한 n00b/기본 문제가 있습니다. try catch 문에서 범위 문제

Ini myIni; 
try { 
    myIni = new Ini(new FileReader(myFile)); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

myIni.get("toto"); 

다음과 오류 메시지 :에만 시도 지역에 제한 시도의 범위가 myIni가 초기화되지 않았 변수

인가? 다음 코드에서 myIni의 결과를 가져올 수 있습니까?

+0

'e.printStackTrace()'하지 마십시오. 그냥 '던져'. – BalusC

답변

6

메시지를 피하려면 try 문 앞에 기본값을 설정해야합니다.
또는 try 문에서 get() 메서드에 대한 호출을해야합니다.

+0

hoho, 그때는 정말로 n00b 질문이었습니다 :) 고맙습니다. – Cornelius

+1

@ 코넬리우스 - n00b 질문도 유용합니다.) –

+0

멍청한 질문이 없습니다. – Simeon

0

try catch 블록 안에 myIni.get ("toto")을 삽입하거나 Ini myIni = null;을 작성하십시오. 첫 번째 행에 두 번째 변형을 수행하면 파일을 찾을 수 없거나 다른 이유로 읽을 수없는 경우 NullPointerException이 발생할 수 있습니다 ...

건배! P

0

쓰기 Ini myIni = null;은 그게

1

는에만 시도 지역에 제한 시도의 범위가요? 대답은 '예'입니다. 문제는 개체를 초기화하는 것을 잊어 버린 것입니다.

이 시도 :

Ini myIni=null; 
try { 
    myIni = new Ini(new FileReader(myFile)); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

이 try 블록 내에서 호출 있는지 확인하기 위해 검사를 수행, NullPointerException를 잡에서 프로그램을 방지하기 위해 일부 데이터로 구축 된 개체의 결과. 당신은 당신이 다음과 같이 할 수있는 예외가 발생했을 경우, 객체가 유효 null 될 것입니다 때문에 try/catch 블록 외부 myIni를 호출하지 않으려면

if(myIni !=null) 
{ 
    myIni.get("toto"); 
} 

은 대체.

try { 
    Ini myIni= new Ini(new FileReader(myFile)); 
    myIni.get("toto"); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
0

catch 문에서 변수 값을 정의하지 않습니다. 따라서 myIni.get("toto");을 실행하면 변수에 값이 없습니다. 당신이 뭔가를 할 싶어 : get()을 실행할 때

Ini myIni = null; 
try { 
    myIni = new Ini(new FileReader(myFile)); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

myIni.get("toto"); 

그럼에도 불구하고, 당신은 NPE를 얻을 수 있습니다. 당신이 원하는 것을 할 수있는 당신의 올바른 방법에

2

try 블록 내부 myIni.get("toto");을 넣어하는 것입니다 몇 가지 답변을 제안

try { 
    Ini myIni = new Ini(new FileReader(myFile)); 
    myIni.get("toto"); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

Ini myIni = null;하지 마십시오. 이 경우 myIni 초기화시 IOException이 발생하면 코드가 NullPointerException이됩니다.

+0

'myIni.get ("toto"); – Simeon

4

예, 시도 범위가 제한되어 있습니다.사실 범위는 시작 {와 함께 종료}, 따라서이 또한 문제를 해결하려면 하위 범위

void foo() { 
    { 
    Ini myIni = new Ini(new FileReader(myFile)); 
    } 

    myIni.get("toto"); //error here, since myIni is out of scope 
} 

을 만들 null를 myIni를 초기화하고, 시도가 실패 할 경우, myIni.get("toto");이 될 것이라고 인식 될 것이다 NullPointerException.

그래서 계정을 잡거나 catch 블록에서 다른 예외를 throw해야합니다. 널 (null)에 대한

확인 :

Ini myIni = null; 
try { 
    myIni = new Ini(new FileReader(myFile)); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

if(myIni != null) { 
    myIni.get("toto"); 
    //access the rest of myIni 
} else { 
    //handle initialization error 
} 

던져 예외 :

Ini myIni = null; 
try { 
    myIni = new Ini(new FileReader(myFile)); 
} catch (IOException e) { 
    e.printStackTrace(); 
    throw new MyCustomInitFailedException(); //throw any exception that might be appropriate, possibly wrapping e 
} 

myIni.get("toto"); 

은 이미 그것이 가능하고 적절하다면 당신은 또한 myIni의 전체 사용의 주위에 try 블록을 넣을 수 @khachik에 의해 제안했다. 선택한 솔루션은 다른 요구 사항과 디자인에 따라 다릅니다.

1

이것은 컴파일러가 myIni의 초기화가 실패 할 수 있다고 말하는 방식입니다. myIni = new Ini(new FileReader(myFile)); 행이 예외를 throw 할 수 있습니다.

myIni.get("toto");myIni 행에 도달하면 오류가 초기화되지 않았을 것입니다.

  1. try 블록 내부의 myIni.get("toto");을 넣어 :

    당신은이 선택 사항이 있습니다.
  2. null 값을 정의 할 때 myIni 값을 지정하고 try 블록 외부의 null을 확인하십시오. 예외가 발생하는 경우 코드에서
0

는 변수 myIni 컴파일러는 경고를 상승 이유입니다, 인스턴스화 할 수 없습니다. @khachik는 지적

, 그것은 선언하고 try 블록 자체 내부의 변수를 초기화하는 것이 가장 좋습니다
Ini myIni = null; 
try { 
    myIni = new Ini(new FileReader(myFile)); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
if(myIni!=null){ 
myIni.get("toto"); 
} 
0

:

당신은 그것을 변경할 수 있습니다. 오만함과 구별 할 수없는 자신감을 느끼는 경우에만 try bock 외부에서 아래와 같이 초기화하십시오.

Ini myIni = null; 
관련 문제