"아. 왔군. 찾고 있었어."
"무슨 일 있었어?"
"아니, 하지만 우리는 아직 공부 중이야."
"좋아. 듣고 있어."
"예외에 대해 몇 가지 더 말씀드리고 싶습니다."
"Java 7에서는 여러 개의 catch 블록을 추가하여 try-catch 구성이 약간 확장되었습니다 . 다음 예제를 보십시오."
try
{
…
}
catch (IOException ex)
{
logger.log(ex);
throw ex;
}
catch (SQLException ex)
{
logger.log(ex);
throw ex;
}
try
{
…
}
catch (IOException | SQLException ex)
{
logger.log(ex);
throw ex;
}
"이제 OR 연산자로 구분된 여러 예외를 작성할 수 있습니까('|'는 이진 OR임)?"
"맞아. 편리하지 않니?"
"음. 그런데 catch 블록 내부의 예외 개체의 유형은 무엇입니까?"
"결국 IOException에는 메소드가 있고 SQLException에는 메소드가 있습니다."
"예외 유형은 공통 조상 클래스의 예외 유형입니다."
"아. 즉, Exeption 또는 RuntimeException 일 가능성이 큽니다 . 그렇다면 단순히 catch(Exception e)를 작성하지 않는 이유는 무엇입니까?"
"때로는 오류를 개별적으로 처리할 때 오류를 그룹화하고 일부 오류를 로그에 기록하고 다른 오류를 다시 던지고 다른 방법으로 처리하는 것이 편리합니다."
"즉, 이 체계는 서로 다른 오류를 처리하기 위한 중복 catch 블록 문제를 해결하는 것으로 인식됩니다."
"아. 알겠어. 고마워, 엘리."
"그게 다가 아닙니다. finally 블록 에 대해 조금 더 말씀드리고 싶습니다 ."
"이미 알고 계시겠지만 이 블록은 항상 실행됩니다."
"그리고 내가 항상이라고 말하면 절대적으로 항상 ."
"예를 들어:"
try
{
return 1;
}
finally
{
return 0;
}
"여기에는 try 블록 에 반환이 있고 finally 블록 에 반환이 있습니다 . 따라서 이 메서드의 반환 값은 숫자 0이 됩니다."
" finally 블록은 무슨 일이 있어도 실행됩니다. 그리고 그 return 문은 다른 반환 값을 자신의 값으로 덮어씁니다."
"알겠어요."
"그러나 메서드는 값을 반환하거나 예외를 던질 수 있습니다. "
"따라서 try 블록에서 값이 반환되지만 finally 블록에서 예외가 발생하면 결과는 예외가 됩니다 . "
" try 블록 에서 예외가 발생했지만 finally 블록에 return 문이 있으면 어떻게 됩니까?"
"그러면 메서드가 제대로 작동하고 return 문에 있는 값이 반환되는 것과 같습니다.
예 | 결과 |
---|---|
|
0 |
|
런타임 예외 |
|
0 |
|
IO예외 |
"finally 메소드가 실행되지 않을 수 있는 유일한 이유는 System.exit(); 메소드 에 대한 호출로 프로그램이 즉시 종료되기 때문입니다 ."
try
{
System.exit(0);
return 1;
}
finally
{
return 0;
}
"알겠어요."
"이러한 주제는 모두 면접에서 주로 물어보는 주제이니 이해하고 기억해두시면 좋을 것 같습니다."
GO TO FULL VERSION