2010-12-30 3 views
9

내가자바 : 잡기 특정 예외

try{ 
//something 
}catch(Exception generic){ 
//catch all 
}catch(SpecificException se){ 
//catch specific exception only 
} 

이 SpecificException 건너 오면 어떻게 될까 다음이 있다고? 그것은 일반적인 예외로 먼저 catch하고 specificeception을 잡을 수 있습니까?

아니면 일반 예외를 무시하는 동안 SpecificException 만 catch합니다.

일반 및 specificexception을 모두 잡는 것을 원하지 않습니다.

+0

질문에 컴파일 타임 오류가 발생합니다. 일반적인 예외는 특정 예외 이후에 있어야합니다. –

답변

10

아니요. 모든 예외는 첫 번째 블록에서 발견 할 수 있습니다. 두 번째는 절대로 도달하지 않습니다 (컴파일러가 인식하여 도달 할 수없는 코드로 인해 오류가 발생 함). 특별히 SpecificException을 치료하려는 경우, 당신은 라운드 그것을 다른 방법으로 할 필요가 : 두 번째로

다음 SpecificException가 첫 번째 블록에 의해 잡힐 것
}catch(SpecificException se){ 
//catch specific exception only 
}catch(Exception generic){ 
//catch all 
} 

, 모든 다른 사람을.

+2

이것이 왜 이것이 대답인지 이해할 수 없습니다. 원래 질문에 표시된 순서대로 예외를 catch하려고하면 컴파일 오류가 발생하므로 "모든 예외가 첫 번째 블록에 포착됩니다."라는 문구는 적용 할 수 없습니다. –

+0

javac로 확인하셨습니까? 이클립스에서는 실패하지만 javac에서 경고를 발행 할 수 있습니다. – Bozho

+0

나는 Michael이 그가 올린 코드를 언급하고 있다고 생각했다. – duffymo

21

이것은 컴파일되지 않습니다. 특정 예외 블록에 도달 할 수 없다는 메시지가 표시됩니다.

더 구체적인 예외 catch 블록이 있어야하며 그 다음에는 일반적인 예외 블록이 있어야합니다.

try 
{ 
    //something 
} 
catch(SpecificException se) 
{ 
    //catch specific exception only 
} 
catch(Exception generic) 
{ 
    //catch all 
} 
+0

컴파일러가 어떤 순서로든 예외를 작성할 수 있다고 상상해보십시오. 그것이 무슨 차이가 있을까요? 나는 어떤 차이도 보이지 않는다. 그렇다면 왜 명령을 집행합니까? –

+0

내가 20 년 더 젊은 부자라고 상상해보십시오. 그것이 무슨 차이가 있을까요? 원하는 모든 것을 상상해보십시오. 그러나 이것이 JDK가 작동하는 방법입니다. – duffymo

+0

그 논리로, 왜 아무 것도 이유를 찾느라고 귀찮게합니까? 자바가 다중 상속을 허용하지 않는 이유는 무엇입니까? 누가 신경 쓰겠 니? 그것은 단지 그렇게 작동합니다. 내가하려고하는 점을 보시오. 예,이 질문은 중요하거나 중요하지 않습니다. 그러나 답을 아는 것이 좋을 것입니다. Chenqui. –

6

이 이클립스 컴파일러로 컴파일되지 않습니다 : IOException이에 대한

연결할 catch 블록을. 예외에 대한 catch 블록에 의해 이미 처리되었습니다.

이렇게 다른 방법으로 정의하십시오. 특정한 것만 잡힐 것입니다.

1

두 가지 catch 블록을 호출하는 유일한 방법은 중첩 예외를 사용하는 것입니다.

try { 
    try{ 
    //something 
    }catch(SpecificException se){ 
    //catch specific exception only 
    throw se; 
    } 
}catch(Exception generic){ 
//catch all 
} 
3

catch 블록은 순서대로 시도되고 예외 유형과 일치하는 첫 번째 블록이 실행됩니다. Exception은 모든 예외 유형의 수퍼 클래스이므로이 인스턴스에서 항상 실행되며 특정 사례는 절대로 실행되지 않습니다. 실제로 컴파일러는 이것을 인식하고 컴파일 오류를 발생시킬 정도로 똑똑합니다.

catch 절의 순서를 바꾸면됩니다.