Try-catch-finally-return 설명
이 질문에 이미 답변이 있습니다.
위의 주제 (제목 참조)와 관련하여이 포럼에서 이미 질문 한 모든 질문을 읽음으로써 finally
항상 호출 되는 것을 완전히 이해합니다 . (from System.exit
및 무한 루프 제외 ). 그러나 나는 return
catch 블록에서 a return
가 호출되고 finally 블록에서 다른 하나 가 호출 되는지 알고 싶습니다 .
예를 들면 :
public static void main(String[]args) {
int a = new TestClass().absorbeTheValue();
}
int absorbeTheValue() {
try {
int a = 10/0;
if (a > 0) return 4;
} catch(Exception e) {
return 45;
} finally {
return 34;
}
}
따라서 여기서 출력 (메서드가 호출 될 때)은 어떤 경우에도 34가 될 것입니다. 그것은 마침내 항상 실행된다는 것을 의미합니다. 다른 "반품"은 전혀 실행되지 않는다고 생각합니다. 많은 게시물에서 마침내 catch 절 return에 의해 이미 작성된 내용 위에 내용을 작성했다는 사실을 발견했습니다. 내 이해는 catch 절의 반환 값이 평가 되 자마자 제어 흐름이 finally 절로 전달되어 다시 다른 반환이 발생하고 이번에는 반환이 catch 절로 다시 전달되지 않고 평가된다는 것입니다. . 이런 식으로 return
런타임에 호출 되는 유일한 것은 finally 반환입니다. 동의하십니까?
return
에서이 finally
프로그램에 컨트롤을 다시 전달하지만, 값을 반환하고 방법을 종료하지 않습니다. 그렇게 말할 수 있습니까?
는 IF return
의 try
블록에 도달 할 때, 그것은에 제어를 전송 finally
블록과 기능은 결국 (안 던져) 일반적으로 반환합니다.
예외가 발생했지만 코드가 블록 return
에서 a에 도달하면 catch
제어가 블록으로 전달되고 finally
함수는 결국 정상적으로 반환됩니다 (스로우가 아님).
당신의 예에서, 당신은이 return
에를 finally
, 그래서 관계없이 어떤 일이 일어나는지,이 함수는 반환 34
하기 때문에, finally
단어 (당신이 경우) 최종 있습니다.
귀하의 예에 포함되지 않지만 당신이를 가지고 있지 않은 경우에도이 사실 일 것입니다 catch
예외가 던져 있다면 try
블록 되지 붙 잡았다. 블록 return
에서 를 수행 finally
하면 예외를 완전히 억제 할 수 있습니다. 중히 여기다:
public class FinallyReturn {
public static final void main(String[] args) {
System.out.println(foo(args));
}
private static int foo(String[] args) {
try {
int n = Integer.parseInt(args[0]);
return n;
}
finally {
return 42;
}
}
}
인수를 제공하지 않고 실행하는 경우 :
$ java finallyReturn
...의 코드 foo
는 ArrayIndexOutOfBoundsException
. 그러나 finally
블록이를 수행 하기 때문에 return
해당 예외가 억제됩니다.
이것이 return
에서 사용하지 않는 것이 가장 좋은 이유 중 하나 입니다 finally
.
다음은 작동 방식을 보여주는 코드입니다.
class Test
{
public static void main(String args[])
{
System.out.println(Test.test());
}
public static String test()
{
try {
System.out.println("try");
throw new Exception();
} catch(Exception e) {
System.out.println("catch");
return "return";
} finally {
System.out.println("finally");
return "return in finally";
}
}
}
결과는 다음과 같습니다.
try
catch
finally
return in finally
참고 URL : https://stackoverflow.com/questions/15225819/try-catch-finally-return-clarification
'Programing' 카테고리의 다른 글
Mountain Lion RVM 설치 1.8.7 x11 오류 (0) | 2020.12.03 |
---|---|
세로 스크롤을 기반으로 jquery로 클래스를 추가 / 제거 하시겠습니까? (0) | 2020.12.03 |
C에서 포인터를 캐스팅하는 규칙은 무엇입니까? (0) | 2020.12.03 |
Android에서 올바른 크기로 비트 맵 디코딩 (0) | 2020.12.02 |
Ruby on Rails 복수 (컨트롤러) 및 단수 (모델) 규칙-설명 (0) | 2020.12.02 |