>Java >java지도 시간 >Java 예외 처리에 대한 자세한 소개

Java 예외 처리에 대한 자세한 소개

不言
不言앞으로
2018-10-24 10:59:541891검색

이 기사는 Java 예외 처리에 대한 자세한 소개를 제공합니다. 특정 참고 가치가 있으므로 도움이 될 수 있기를 바랍니다.

Java 예외 처리(Exception Handling)에 대한 예제와 몇 가지 지식 포인트를 살펴보겠습니다.

Java 예외 처리에 대한 자세한 소개

아래 프로그램을 보세요. pleaseThrow 메소드는 Exception의 인스턴스를 받아들이고 단순히 인스턴스를 던집니다. 그런 다음 이 메서드를 호출할 때 SQLException 인스턴스를 전달했습니다. pleaseThrow에 대한 호출이 try catch 블록에 래핑되어 있기 때문에

질문: pleaseThrow 메서드에서 발생한 SQLException을 성공적으로 포착할 수 있습니까?

public class ExceptionForQuiz<t> {

      private void pleaseThrow(final Exception t) throws T {

             throw (T) t;

      }

     public static void main(final String[] args) {

          try {

               new ExceptionForQuiz<runtimeexception>().pleaseThrow(new SQLException());

          }

         catch( final SQLException ex){

              System.out.println("Jerry print");

              ex.printStackTrace();

        }

}

}</runtimeexception></t>

Java 예외 처리에 대한 자세한 소개

답변: 위 코드에는 구문 오류가 있어서 컴파일할 수 없습니다!

단계별로 분석해 보겠습니다.

Java 클래스 ExceptionForQuiz는 일반 구문을 사용합니다. T 확장 예외는 이 일반 클래스가 인스턴스화될 때 전달된 유형 매개변수 T가 Exception 및 해당 하위 클래스여야 함을 의미합니다.

ExceptionForQuiz 클래스를 인스턴스화할 때 전달된 유형 매개변수는 RuntimeException입니다.

RuntimeException은 Java에서 확인되지 않은 예외입니다. 메서드가 실행 중일 때 RuntimeException이 발생하더라도 개발자는 메서드 전에 코드에서 이를 명시적으로 선언할 필요가 없습니다.

JDK RuntimeException의 주석을 보면 매우 명확합니다. 확인되지 않은 예외는 메서드나 생성자의 실행으로 인해 발생할 수 있는 경우 메서드나 생성자의 절에서 선언할 필요가 없습니다.

저자 Frank Yellin은 훌륭한 사람이 되십시오.

Java 예외 처리에 대한 자세한 소개

제네릭은 Java 1.5 버전에서 도입된 개념이므로 제네릭에 대한 유형 삭제 개념이 있습니다. 즉, 제네릭 정보는 코드 컴파일 단계에서만 존재하므로 다릅니다. 제네릭 유형 관련 정보는 삭제됩니다. 예를 들어 이전 제네릭 클래스의 타입 매개변수 부분이 상한을 지정하지 않고 와 같이 쓰면 일반 Object 타입으로 변환됩니다. 과 같이 상한값이 지정되면 유형 매개변수는 유형 상한값으로 대체됩니다.

단순화를 위해 먼저 코드에서 try catch 블록을 제거하겠습니다.

Java 예외 처리에 대한 자세한 소개

다음은 ExceptionForQuiz.class에서 디컴파일한 후의 코드입니다.

Java 예외 처리에 대한 자세한 소개

위 그림에서 pleaseThrow 및 RayExceptionForQuiz 메소드의 일반 매개변수 RuntimeException이 지워진 것을 확인할 수 있습니다. pleaseThrow 메소드에서 발생할 수 있는 예외 유형이 삭제되어 Exception이 됩니다.

javap을 사용하여 컴파일로 생성된 바이트코드를 관찰하면 유형 매개변수 RuntimeException이 지워졌다는 사실도 확인할 수 있습니다.

두 번째 빨간색으로 강조 표시된 영역을 살펴보세요. 예외: throw java.lang.Exception

Java 예외 처리에 대한 자세한 소개

이제 컴파일러가 보고할 오류 메시지를 살펴보겠습니다. SQLException에 대한 도달할 수 없는 catch 블록입니다. 이 예외는 try 문 본문에서 발생하지 않습니다.

Java 예외 처리에 대한 자세한 소개

이 오류 메시지는 예외 유형 삭제라는 사실을 기반으로 합니다. 합리적인 입니다. pleaseThrow 메소드의 선언은 이제 Exception 유형의 예외만 발생시킬 수 있기 때문에 14행의 catch는 SQLException 유형의 예외를 수신할 수 없으므로 컴파일러가 오류를 발생시킵니다.

이 컴파일러 오류를 제거하는 방법은 무엇입니까? 14행의 SQLException을 RuntimeException으로 변경하면 됩니다.

그러나 이 경우 구문 오류가 제거되었더라도 pleaseThrow 메소드에서 발생한 SQLException을 포착할 수 없으며 런타임 오류가 보고됩니다.

Java 예외 처리에 대한 자세한 소개

catch 문을 사용하여 pleaseThrow가 던진 SQLException을 어떻게 잡을 수 있나요? 14행의 RuntimeException을 모든 예외의 상위 클래스인 Exception으로 변경합니다.

다시 실행하세요. 이번에는 구문 오류나 런타임 오류가 없습니다. SQLException이 14행의 catch 문에 의해 성공적으로 포착되었습니다.

Java 예외 처리에 대한 자세한 소개

위 내용은 Java 예외 처리에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제