"아. 왔군. 찾고 있었어."

"무슨 일 있었어?"

"아니, 하지만 우리는 아직 공부 중이야."

"좋아. 듣고 있어."

"예외에 대해 몇 가지 더 말씀드리고 싶습니다."

"Java 7에서는 여러 개의 catch 블록을 추가하여 try-catch 구성이 약간 확장되었습니다 . 다음 예제를 보십시오."

자바 5
try
{
  …
}
 catch (IOException ex)
{
 logger.log(ex);
 throw ex;
}
 catch (SQLException ex)
{
 logger.log(ex);
 throw ex;
}
자바 7
try
{
  …
}
 catch (IOException | SQLException ex)
{
 logger.log(ex);
 throw ex;
}

"이제 OR 연산자로 구분된 여러 예외를 작성할 수 있습니까('|'는 이진 OR임)?"

"맞아. 편리하지 않니?"

"음. 그런데 catch 블록 내부의 예외 개체의 유형은 무엇입니까?"

"결국 IOException에는 메소드가 있고 SQLException에는 메소드가 있습니다."

"예외 유형은 공통 조상 클래스의 예외 유형입니다."

"아. 즉, Exeption 또는 RuntimeException 일 가능성이 큽니다 . 그렇다면 단순히 catch(Exception e)를 작성하지 않는 이유는 무엇입니까?"

"때로는 오류를 개별적으로 처리할 때 오류를 그룹화하고 일부 오류를 로그에 기록하고 다른 오류를 다시 던지고 다른 방법으로 처리하는 것이 편리합니다."

"즉, 이 체계는 서로 다른 오류를 처리하기 위한 중복 catch 블록 문제를 해결하는 것으로 인식됩니다."

"아. 알겠어. 고마워, 엘리."

"그게 다가 아닙니다. finally 블록 에 대해 조금 더 말씀드리고 싶습니다 ."

"이미 알고 계시겠지만 이 블록은 항상 실행됩니다."

"그리고 내가 항상이라고 말하면 절대적으로 항상 ."

"예를 들어:"

finally 사용 예
try
{
 return 1;
}
 finally
{
 return 0;
}

"여기에는 try 블록 에 반환이 있고 finally 블록 에 반환이 있습니다 . 따라서 이 메서드의 반환 값은 숫자 0이 됩니다."

" finally 블록은 무슨 일이 있어도 실행됩니다. 그리고 그 return 문은 다른 반환 값을 자신의 값으로 덮어씁니다."

"알겠어요."

"그러나 메서드는 값을 반환하거나 예외를 던질 수 있습니다. "

"따라서 try 블록에서 값이 반환되지만 finally 블록에서 예외가 발생하면 결과는 예외가 됩니다 . "

" try 블록 에서 예외가 발생했지만 finally 블록에 return 문이 있으면 어떻게 됩니까?"

"그러면 메서드가 제대로 작동하고 return 문에 있는 값이 반환되는 것과 같습니다.

결과
try
{
 return 1;
}
 finally
{
 return 0;
}
0
try
{
 return 1;
}
 finally
{
 throw new RuntimeException();
}
런타임 예외
try
{
 throw new RuntimeException();
}
 finally
{
 return 0;
}
0
try
{
 throw new RuntimeException();
}
 finally
{
 throw new IOException();
}
IO예외

"finally 메소드가 실행되지 않을 수 있는 유일한 이유는 System.exit(); 메소드 에 대한 호출로 프로그램이 즉시 종료되기 때문입니다 ."

try
{
 System.exit(0);
 return 1;
}
 finally
{
 return 0;
}

"알겠어요."

"이러한 주제는 모두 면접에서 주로 물어보는 주제이니 이해하고 기억해두시면 좋을 것 같습니다."