본문 바로가기

Programing

Try-catch-finally-return 설명

반응형

Try-catch-finally-return 설명


이 질문에 이미 답변이 있습니다.

위의 주제 (제목 참조)와 관련하여이 포럼에서 이미 질문 한 모든 질문을 읽음으로써 finally항상 호출 되는 것을 완전히 이해합니다 . (from System.exit및 무한 루프 제외 ). 그러나 나는 returncatch 블록에서 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 returntry블록에 도달 할 때, 그것은에 제어를 전송 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

...의 코드 fooArrayIndexOutOfBoundsException. 그러나 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

반응형