2014-04-08 4 views
0

마지막으로 케이스를 사용하는 시도 캐치를 시도 반환 -자바 시도 캐치 마침내 -

public class Finallyy { 
    public static void main(String[] args) { 
     int result = method1(); 
     System.out.println(result); 
    } 

    private static int method1() { 
     int a = 2; 
     try { 
      int b = 0; 
      a = a/a; 
      System.out.println("try"); 
      return a; 
     } catch (Exception e) { 
      System.out.println("caught"); 
      a = 5; 
      return a; 
     } 
     finally { 
      System.out.println("finally"); 
      a = 10; 
      return a; 
     } 
    } 
} 

출력 : 코드가

에 수정 된 경우

try 

finally 

10 

finally { System.out.println("finally"); a = 10; //return a; } 

출력 :

try 

finally 

1 

질문은 - try 블록의 'return a이'저장되어있는 스택의 일부 개념 [예제가 변경되는 경우, 다음이 시도하거나 catch 블록에 적용이 있는가]이고 finally 블록에 'return'이없는 경우에만 제어가 method1()을 벗어날 때 갑자기 나타 납니까?

업데이트 : 솔루션 결론 :

리턴 문이 실행될 때 반환되는 값이 저장됩니다. finally 블록이 완료되면 해당 값이 반환됩니다.

finally 블록은 항상 마지막으로 실행됩니다. 따라서 finally 블록의 반환 값은 try/catch 블록의 다른 반환 값을 오버런합니다. 이러한 이유로 finally 블록에서 예외를 반환하거나 throw하는 것은 매우 나쁜 습관입니다.

원래 질문에 - finally 블록에 'return'이없는 경우입니까? 아니. 그건 중요하지 않아.

편집 :이 질문 사월 8 요청하고 이미 대한 답변

. 현재 중복으로 표시된이 질문은 나중에 [8 월 15 일]에 요청됩니다. 그러므로 새로운 질문은이 질문이 아니라 중복으로 표시되어야합니다. 그러나 참고 문헌을 공유하면 비슷한 질문이 좋습니다.

+0

예. 귀하의 "스택 개념"이 스택입니다. –

+0

@DavidWallace, a의 값이 스택에 저장되는 것을 의미합니까? 나는 값이 함수 내의 다른 값이 저장되는 것처럼 스택 메모리에 저장된다는 것을 의미합니까? – spiderman

+1

예. 호출 한 메서드는 반환 값을 스택에 저장합니다. 호출하는 메서드는 그것을 팝 아웃합니다. –

답변

2

try 블록은 블록 finally 전에 실행된다.

return 문을 실행하면 반환 할 값이 저장됩니다. finally 블록이 완료되면 해당 값이 반환됩니다.

a은 값이 아닙니다. a은 값을 저장하는 변수입니다. a을 변경하면 a이 변경되고 return에 저장된 값은 변경되지 않습니다. try 블록의 실행은 다른 이유로 R을 위해 갑작스럽게 완료되면 기술적 인 이유로

, 우리는 Java Language Specification on the try-finally block

로 이동 한 다음 finally 블록은 실행 한 다음 선택이있다 :

  • finally 블록이 정상적으로 완료되면, 다음 try 문은 이유 R.

  • 최종적으로 BL 만약을 위해 갑작스럽게 완료 ock가 이유 S로 인해 갑자기 완료되면 try 문은 이유 S (및 이유 R이 폐기 됨)로 인해 갑자기 완료됩니다.

A return statement completes abruptly

하므로 finallytryreturn을 가지며 finallyreturn 상기 finally S의 returntry 대체 '가있는 경우.

+0

나는 이것을 내 머리 속에 넣으려고합니다! 감사! 그 모든 세부 사항 +1. – spiderman

+0

모든 return 문이 완료되었다고 간주되거나 finally 블록의 return 문만 완료로 간주됩니다. – spiderman

+0

@prash 모든'return','break','throw' 및'continue' 문장은 정상적으로 완료되지 않습니다. 그들은 갑작스럽게 끝납니다. –

1

finally 블록은 항상 마지막으로 실행됩니다. 따라서 finally 블록의 반환 값은 try/catch 블록의 다른 반환 값을 오버런합니다. finally 블록에서 예외를 반환하거나 throw하는 것은 매우 나쁜 습관입니다.

스택과 관련이 없습니다. finally 블록이 항상 마지막 블록으로 실행되므로 finally 블록에서 반환되거나 throw되는 것은 이전 종료 값을 지우고 덮어 씁니다 (반환 된 객체 또는 예외가 throw 됨).).

이 시도 :

try { 
    throw new NullPointerException(); 
} 
finally { 
    return 0; 
} 

return을 최종적으로 블록 (삼키기)에 NullPointerException이 덮어 ...

+0

감사합니다. 나는 마침내 뭔가를 반환하는 것이 나쁜 습관임을 이해하고 컴파일러조차도 "마침내 블록이 정상적으로 완료되지 않습니다"라는 경고를줍니다. 결국 마침내 아무것도 반환하지 않는 것이 좋습니다. 그것은 예를 들어 내 질문을 표현하는 것이었다 – spiderman

+0

NPE 예를 들어 주셔서 감사합니다 :) +1 – spiderman

+0

내 질문의 여러 측면에 대답 대답으로 다른 하나를 선택하십시오. 고마워요. – spiderman

0

try..catch..finally는 실제로 try..catch ("any") 내에서 중첩 된 try..catch (지정한 예외)로 컴파일되고 "finally"블록이 잘립니다. &은 각 코드 경로의 "끝"에 컴파일러에 의해 붙여 넣어집니다. ("try"또는 "catch"블록에서 여러 개의 exit를 처리하는 방법을 기억하지 못하기 때문에 "end"를 따옴표로 묶습니다.) javap 명령 (dis-assembler)을 사용하여 실험 해보십시오 서로 다른 try..catch..finally 조합에 해당하도록 Java 버전에서 생성되는 바이트 코드.