programing

예외는 catch and finally 절에 던져집니다.

bestcode 2022. 8. 30. 22:17
반응형

예외는 catch and finally 절에 던져집니다.

대학의 Java에 관한 질문에는 다음과 같은 코드 조각이 있었습니다.

class MyExc1 extends Exception {}
class MyExc2 extends Exception {}
class MyExc3 extends MyExc2 {}

public class C1 {
    public static void main(String[] args) throws Exception {
        try {
            System.out.print(1);
            q();
        }
        catch (Exception i) {
            throw new MyExc2();
        }
        finally {
            System.out.print(2);
            throw new MyExc1();
        }
    }

    static void q() throws Exception {
        try {
            throw new MyExc1();
        }
        catch (Exception y) {
        }
        finally {
            System.out.print(3);
            throw new Exception();
        }
    }
}

나는 그것의 산출물을 내놓으라고 요구받았다.라고 대답했습니다.13Exception in thread main MyExc2, 은 '정답'입니다132Exception in thread main MyExc1왜 그럴까?도대체 어디서 그런 짓을 하는 건지 이해가 안 돼MyExc2가세요.

당신의 답변을 읽고 어떻게 생각해냈는지 살펴본 결과, '예외 진행 중'에는 '우선'이 있다고 생각하시는 것 같습니다.주의:

새로운 예외가 캐치블록 또는 최종적으로 그 블록 밖으로 전파되는 블록에 느려지면 새로운 예외가 외부로 전파됨에 따라 현재 예외가 중단(잊혀짐)됩니다.새로운 예외는 다른 예외와 마찬가지로 스택을 풀기 시작하고 현재 블록(캐치 또는 최종 블록)에서 중단되며 적용 가능한 모든 캐치가 적용되거나 최종적으로 블록이 실행됩니다.

적용 가능한 캐치 또는 최종 블록에는 다음이 포함됩니다.

새로운 예외가 캐치블록에 던져진 경우에도 새로운 예외는 해당 캐치의 최종 블록(있는 경우)의 영향을 받습니다.

실행을 .「 」 「 」 「 」 「 」를 때마다, 「 」 「 」 「 」를 클릭할 때마다throw현재 예외 추적을 중지하고 새 예외 추적을 시작해야 합니다.

최종 블록의 예외가 캐치 블록의 예외보다 우선합니다.

자바 언어 사양

이유 R에 의해 캐치 블록이 갑자기 종료되면 최종적으로 블록이 실행된다.그리고 선택할 수 있습니다.

  • 최종적으로 블록이 정상적으로 완료되면 이유 R에 의해 try 문이 갑자기 완료됩니다.

  • 이유 S로 인해 최종적으로 블록이 갑자기 완료된 경우 이유 S(및 이유 R이 폐기됨)로 인해 try 문이 갑자기 완료됩니다.

Wikipedia에서 최종적으로 다음과 같이 말하고 있습니다.

보다 일반적인 것은 예외 발생 여부에 관계없이 일반적으로 예외 처리 블록 본문 내에서 취득한 리소스를 해방하기 위해 실행되는 관련 절(최종 또는 보증)입니다.

네 프로그램을 해부해 보자.

try {
    System.out.print(1);
    q();
}

so,는,1됩니다.q()호출됩니다.q()예외가 느려집니다. 후 는 is음음음음음음음음음음음음 the the the the the the the에 의해 포착된다.Exception y하지만 아무 소용이 없어요.그런 다음 최종 절이 실행되므로(필요하죠.3화면에 인쇄됩니다.으로는)q()final 절에도 예외가 있습니다.q()는 부모).throws Exception (Method Declaration) (Method Declaration)new Exception().catch ( Exception i ),MyExc2예외는 느려지지만(현재로서는 예외 스택에 추가), 최종적으로는main블록이 먼저 실행됩니다.

그래서...

catch ( Exception i ) {
    throw( new MyExc2() );
} 
finally {
    System.out.print(2);
    throw( new MyExc1() );
}

마지막으로 절을...라고 한다.(기억해요, 방금 전에Exception iMyExc2의 본질은, 「」입니다.2그리고 뒤에2.MyExc1예외가 느려집니다. MyExc1에 의해 처리됩니다.public static void main(...)★★★★★★ 。

출력:

"132MyExc1 스레드의 예외"

강사님 정답! :-)

기본적으로 try/catch 절에 finally가 있는 경우 (예외를 포착한 후 검출된 예외를 폐기)가 최종적으로 실행됩니다.

마지막으로 try/catch block 내의 어느 곳에서든 예외가 발생해도 절이 실행된다.

마지막입니다.main발신자가 볼 수 있는 예외입니다.

, 「 」, 「 」, 「 」, 「 」, 「 」, 「 」, 「 」를 확실히 하는 것이 합니다.finally은 예외 삼킬 수 있기 에 아무 않습니다.try

A method 수 없다throw이데올로기 때문에은 항상 으로 던져진 것을 것이다.exception '아, 아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아.finally

에서 첫 예외가 q()던지면 잡히고 마지막으로 던져진 블록 예외에 의해 삼켜집니다.

q() -> 투척new Exception -> main catch Exception -> throw new Exception -> finally을 던지다exception 에서 온것)catch잃어버렸다'는죠).잃어버렸다'는 의미)

class MyExc1 extends Exception {}
class MyExc2 extends Exception {}
class MyExc3 extends MyExc2 {}

public class C1 {
    public static void main(String[] args) throws Exception {
        try {
            System.out.print("TryA L1\n");
            q();
            System.out.print("TryB L1\n");
        }
        catch (Exception i) {
            System.out.print("Catch L1\n");                
        }
        finally {
            System.out.print("Finally L1\n");
            throw new MyExc1();
        }
    }

    static void q() throws Exception {
        try {
            System.out.print("TryA L2\n");
            q2();
            System.out.print("TryB L2\n");
        }
        catch (Exception y) {
            System.out.print("Catch L2\n");
            throw new MyExc2();  
        }
        finally {
            System.out.print("Finally L2\n");
            throw new Exception();
        }
    }

    static void q2() throws Exception {
        throw new MyExc1();
    }
}

주문:

TryA L1
TryA L2
Catch L2
Finally L2
Catch L1
Finally L1        
Exception in thread "main" MyExc1 at C1.main(C1.java:30)

https://www.compilejava.net/

가장 쉽게 생각할 수 있는 방법은 현재 예외를 유지하고 있는 전체 애플리케이션에 대한 변수가 글로벌하다고 가정하는 것입니다.

Exception currentException = null;

각 예외가 느려지면 "currentException"이 해당 예외로 설정됩니다.응용 프로그램이 종료되면 currentException이 != null이면 런타임에 오류가 보고됩니다.

또한 최종적으로 블록은 항상 메서드가 종료되기 전에 실행됩니다.그 후 코드 스니펫을 다음과 같이 다시 작성할 수 있습니다.

public class C1 {

    public static void main(String [] argv) throws Exception {
        try {
            System.out.print(1);
            q();

        }
        catch ( Exception i ) {
            // <-- currentException = Exception, as thrown by q()'s finally block
            throw( new MyExc2() ); // <-- currentException = MyExc2
        }
        finally {
             // <-- currentException = MyExc2, thrown from main()'s catch block
            System.out.print(2);
            throw( new MyExc1() ); // <-- currentException = MyExc1
        }

    }  // <-- At application exit, currentException = MyExc1, from main()'s finally block. Java now dumps that to the console.

    static void q() throws Exception {
        try {
            throw( new MyExc1() ); // <-- currentException = MyExc1
        }
        catch( Exception y ) {
           // <-- currentException = null, because the exception is caught and not rethrown
        }
        finally {
            System.out.print(3);
            throw( new Exception() ); // <-- currentException = Exception
        }
    }
}

응용 프로그램이 실행되는 순서는 다음과 같습니다.

main()
{
  try
    q()
    {
      try
      catch
      finally
    }
  catch
  finally
}

가 끝날 까지 논리는 하다.13. .러 、 예예 、 in thrown 、 。q()catch (Exception i)main()및 anew MyEx2()던질 준비가 되었습니다.단, 예외를 설정하기 전에finally먼저 블록을 실행해야 합니다.그러면 출력은132그리고.finally다른 예외를 발생시키도록 요청한다.new MyEx1().

방법은 두 개 이상 던질 수 없기 때문에Exception, 그것은 항상 최신 정보를 던집니다.Exception바꿔 말하면, 둘 다catch그리고.finally블록이 던지려고 하다Exception, 그 다음에Exception어획량은 삼켜지고 예외만 있다finally던져질 것이다.

이 예외, 예외, 예외, 예외.MyEx2 '''가 됩니다.MyEx1 of of of에서 제외됩니다.main() 않게 해, 은 「JVM」이 됩니다.132Exception in thread main MyExc1

질적 a가 에는 in in in in in in infinallyin a a a a try/catch절, 절, 절finally예외를 검출한 후실행되지만 검출된 예외를 슬로우하기 전마지막으로 마지막으로 예외만 슬로우됩니다.

try and catch 후에 최종 블록이 실행되어 항상 실행된다는 것은 잘 알려져 있습니다.하지만 조금 까다롭다는 것을 알 수 있듯이, 때때로 아래의 코드 조각들을 보면 반환과 던지기 문장이 항상 우리가 기대하는 순서대로 수행되지 않는다는 것을 알 수 있습니다.

건배.

/////////////Return dont always return///////

try{

    return "In Try";

}

finally{

    return "In Finally";

}

////////////////////////////////////////////


////////////////////////////////////////////    
while(true) { 

    try {

        return "In try";

   } 

   finally{

        break;     

    }          
}              
return "Out of try";      
///////////////////////////////////////////


///////////////////////////////////////////////////

while (true) {     

    try {            

        return "In try";    

     } 
     finally {   

         continue;  

     }                         
}
//////////////////////////////////////////////////

/////////////////Throw dont always throw/////////

try {

    throw new RuntimeException();

} 
finally {

    return "Ouuuups no throw!";

}
////////////////////////////////////////////////// 

될 것 요.finally★★★★

  1. 「1」을 인쇄합니다.
  2. finallyq33 」3 인3 인인 인다
  3. finallymain인쇄하다

이것으로 문제가 해결된다고 생각합니다.

boolean allOk = false;
try{
  q();
  allOk = true;
} finally {
  try {
     is.close();
  } catch (Exception e) {
     if(allOk) {
       throw new SomeException(e);
     }
  }
}

이러한 상황을 처리하기 위해, 즉 최종 차단에 의해 발생한 예외를 처리합니다.최종 블록을 트라이 블록으로 둘러쌀 수 있습니다.다음 python의 예를 참조하십시오.

try:
   fh = open("testfile", "w")
   try:
      fh.write("This is my test file for exception handling!!")
   finally:
      print "Going to close the file"
      fh.close()
except IOError:
   print "Error: can\'t find file or read data"

언급URL : https://stackoverflow.com/questions/3779285/exception-thrown-in-catch-and-finally-clause

반응형