자바 의 이상 과 처리 메커니즘 분석[부 면 시험 문제]

본 고의 실례 는 자바 의 이상 과 처리 메커니즘 을 서술 하 였 다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
자바 의 이상 메커니즘
Throwable 클래스
Throwable 클래스 는 자바 이상 유형의 최상 위 부모 클래스 로 하나의 대상 은 Throwable 클래스(직접 또는 간접)인 스 턴 스 만 이 이상 대상 이 고 이상 처리 체제 에 의 해 식별 된다.JDK 에 자주 사용 되 는 이상 클래스 가 만들어 져 있 습 니 다.저희 도 이상 을 사용자 정의 할 수 있 습 니 다.
Throwable 은 오류 류 와 Exception 류 를 파생 합 니 다.
오류:Error 클래스 와 그의 하위 클래스 의 인 스 턴 스 는 JVM 자체 의 오 류 를 대표 합 니 다.오 류 는 프로그래머 가 코드 를 통 해 처리 할 수 없고 오류 가 거의 발생 하지 않 습 니 다.따라서 프로그래머 들 은 Exception 이 아버지 류 의 갈래 에 있 는 각종 이상 류 에 주목 해 야 한다.
이상:Exception 및 그의 하위 클래스 는 프로그램 이 실 행 될 때 보 내 는 각종 예상 치 못 한 사건 을 대표 합 니 다.자바 이상 처리 메커니즘 에 사용 할 수 있 는 이상 처리 의 핵심 입 니 다.
자바 이상 시스템 구조

자바 의 이상 은 두 가지 로 나 뉜 다(자바 c 의 이상 처리 요구 에 따라).
Checked exception(검사 이상):Error 와 Runtime Exception 의 다른 이상 을 제외 합 니 다.검 사 를 받 은 이상 은 프로그램 자체 에 문제 가 없다 는 뜻 이지 만 I/O,네트워크,데이터베이스 등 예측 할 수 없 는 다른 오류 로 인 한 이상 은 자원 소 진 으로 인 한 이상 일 수도 있다.javac 는 프로그래머 에 게 이러한 이상 을 위해 예비 처리 작업 을 하도록 강요 합 니 다(try..catch..finally 또는 throws 사용).방법 에 서 는 try-catch 구문 으로 캡 처 하고 처리 하거나 throws 자구 성명 으로 던 지 거나 그렇지 않 으 면 컴 파일 이 통과 되 지 않 습 니 다.이러한 이상 은 일반적으로 프로그램의 운행 환경 에 의 해 야기 된다.프로그램 이 여러 가지 알 수 없 는 환경 에서 실 행 될 수 있 기 때문에 프로그래머 는 사용자 가 작성 한 프로그램 을 어떻게 사용 하 는 지 관여 할 수 없 기 때문에 프로그래머 는 이러한 이상 한 시간 을 위해 준비 해 야 합 니 다.예 를 들 어 SQLException,IOException,ClassNotFoundException 등 이다.
Unchecked exception(Runtime Exception)(검사 이상 없 음):Error 와 Runtime Exception 및 그들의 하위 클래스.검사 되 지 않 은 이상 은 일반적으로 코드 의 논리 적 문제 로 여 겨 지 며,일반적으로 코드 를 수정 하여 이상 을 해결 해 야 하 며,이상 메커니즘 으로 처리 할 수도 있다.이러한 이상 이 발생 한 원인 은 대부분 코드 에 문제 가 있 는 것 이다.예 를 들 어 0 오류 ArithmeticException,잘못된 강제 형식 변환 오류 ClassCastException,배열 색인 크로스 오 버 Array Index OutOf Bounds Exception,빈 대상 NullPointer Exception 등 을 사용 합 니 다.
Runtime Exception 클래스 는 Exception 클래스 에서 직접 계승 되 며,자바 의 모든 실행 시 이상 은 Runtime Exception 에서 직접 또는 간접 적 으로 계승 됩 니 다.
자바 에 서 는 Runtime Exception 클래스 의 이상 을 계승 하 는 것 이 아니 라 Checked Exception 에서 계승 합 니 다.
이상 처리 의 기본 문법
코드 처리 가 이상 할 때 검사 이상 에 대해 서 는 두 가지 다른 처리 방식 이 있 습 니 다.try..catch..finally 구문 블록 으로 처리 합 니 다.또는 함수 서명 에서 throws 성명 을 사용 하여 함수 호출 자 caller 에 게 전달 합 니 다.
(1)try...catch...finally 구문 블록

try{
   //try            。
   //     try      ,      finally  finally     (     )。
   //      ,      catch 。
}catch(SQLException SQLexception){
  //   catch               ,          。Java7             catch 。
  //catch                 。                ,         catch      。
  // catch                        。       catch       ,       。
  //    try             catch      ,     finally,          caller         。
  //  try       ,    catch     。
}catch(Exception exception){
  //...
}finally{
  //finally       。
  //        ,         ,finally    。
  //  try      catch ,  ,     1 finally 。  finally         ,finally      。
//   try  catch     return  , return    finally         ,  finally        。
//   finally     return,  try catch  return     ,     finally     。
 //finally         ,     ,         。
}

주의 점:
try 블록 에 있 는 부분 변수 와 catch 블록 에 있 는 부분 변수(이상 변수 포함),그리고 finally 에 있 는 부분 변 수 는 공유 할 수 없습니다.
모든 catch 블록 은 이상 을 처리 하 는 데 사 용 됩 니 다.이상 매 칭 은 catch 블록 순서대로 위 에서 아래로 찾 습 니 다.첫 번 째 일치 하 는 catch 만 실 행 됩 니 다.일치 할 때 정확 한 일치 뿐만 아니 라 부모 클래스 의 일치 도 지원 합 니 다.따라서 같은 try 블록 아래 의 여러 catch 이상 유형 이 부자 관계 가 있다 면 하위 클래스 이상 을 앞 에 두 고 부모 클래스 이상 을 뒤에 두 어야 합 니 다.그러면 모든 catch 블록 이 존재 하 는 의 미 를 가 집 니 다.
finally 블록 은 이상 이 발생 하 든 발생 하지 않 든 대응 하 는 try 가 실행 되면 반드시 실 행 됩 니 다.finally 블록 을 실행 하지 않 는 방법 은 오직 하나 입 니 다:System.exit().따라서 finally 블록 은 보통 자원 방출 작업 을 하 는 데 사 용 됩 니 다.파일 을 닫 고 데이터베이스 연결 을 닫 는 등 입 니 다.좋 은 프로 그래 밍 습관 은 try 블록 에서 자원 을 열 고 finally 블록 에서 이 자원 을 정리 하 는 것 입 니 다.
finally 블록 은 이상 을 처리 할 능력 이 없습니다.이상 한 것 은 catch 블록 만 처리 할 수 있 습 니 다.
같은 try...catch...finally 블록 에서 try 에서 이상 을 던 지고 일치 하 는 catch 블록 이 있 으 면 catch 블록 을 실행 하고 finally 블록 을 실행 합 니 다.catch 블록 이 일치 하지 않 으 면 finally 를 실행 하고 밖 에 있 는 호출 자 중에서 적당 한 catch 블록 을 찾 습 니 다.
같은 try...catch...finally 블록 에서 try 에 이상 이 발생 하고 일치 하 는 catch 블록 에서 이상 을 처리 할 때 도 이상 을 던 집 니 다.그러면 뒤의 finally 도 실 행 됩 니 다.먼저 finally 블록 을 실행 한 다음 외곽 호출 자 에서 적당 한 catch 블록 을 찾 습 니 다.
(2)throws 함수 선언
throws 성명:한 방법 내부 의 코드 가 검사 이상(checked exception)을 던 지고 방법 자체 가 완전히 처리 하지 않 으 면 자바 c 는 방법 서명 에 throws 키 워드 를 사용 하여 던 질 수 있 는 이상 을 설명 해 야 합 니 다.그렇지 않 으 면 컴 파일 이 통과 되 지 않 습 니 다.
throws 는 다른 처리 이상 방식 입 니 다.try..catch..finally 와 달리 throws 는 함수 에 나타 날 수 있 는 이상 을 호출 자 에 게 만 설명 하고 자신 은 구체 적 으로 처리 하지 않 습 니 다.
이러한 이상 처 리 를 하 는 이 유 는 방법 자체 가 이러한 이상 을 어떻게 처리 해 야 할 지 모 르 거나 호출 자 에 게 더 잘 처리 하 라 고 하 며 호출 자 는 발생 할 수 있 는 이상 에 대해 책임 을 져 야 하기 때 문 일 수 있다.

public void foo() throws ExceptionType1 , ExceptionType2 ,ExceptionTypeN
{
   //foo       ExceptionType1 , ExceptionType2 ,ExceptionTypeN     ,            。
}

throw 이상 투하 문
문법:throw exceptionObject프로그래머 도 throw 문 구 를 통 해 수 동 으로 이상 을 던 질 수 있다.throw 문장의 뒤쪽 은 이상 한 대상 이 어야 합 니 다.
어떤 방법(예 를 들 어 a 방법)에서 throw new 이상 을 사용 하 는 방식 으로 이상 이상 을 던 집 니 다.즉,이 방법 은 이상 을 처리 하지 않 고 a 를 호출 하 는 방법 b 로 처리 합 니 다.(이때 b 는 throws 키 워드 를 사용 합 니 다)b 도 방법 c 로 호출 되면 c 로 처리 하고 한 층 씩 유추 합 니 다.main 방법 까지 main 방법 도 이상 을 던 집 니 다.그러면 JVM 에 맡 기 라 고 하 죠.
throw 문 구 는 함수 에 써 야 합 니 다.throw 문 구 를 실행 하 는 곳 은 이상 한 던 지 는 점 입 니 다.JRE 에서 자동 으로 형 성 된 이상 한 던 지 는 점 과 차이 가 없습니다.

package practice;
public class ExceptionTest {
    public static void test(Object obj) {
        try {
            if (obj == null) {
                throw new Exception();//        , catch     
            }
        } catch (Exception e) {
            System.out.println("nullpoint");
        }
    }
    public static void test2(Object obj) throws Exception {
        try {
            obj.toString();
        } catch (Exception e) {
            throw new Exception();// catch        ,      ,           e          ,               
        }
    }
    public static void test1(Object obj) throws Exception {
        if (obj == null) {
            throw new Exception();//        ,  throws   ,   test     
        }
    }
    public static void main(String[] args) throws Exception{
        ExceptionTest.test(null);
        //           
        //   :test2    throws     ,         ,   
        try {
            ExceptionTest.test2(null);
        }catch(Exception e) {
            System.out.println("nullpoint");
        }
        //   :test1       Throws     
        ExceptionTest.test1(null);
    }
}

사용자 정의 이상
사용자 정의 이상:보통 Exception 클래스 를 계승 하 는 하위 클래스 를 정의 합 니 다.이 클래스 는 사용자 정의 이상 클래스 입 니 다.일반적으로 우 리 는 Exception 류 를 직접 계승 하 며,일반적으로 어떤 운행 시의 이상 류 를 계승 하지 않 습 니 다.
이상 한 기능:
하나의 try 는 여러 개의 catch 블록 을 가 질 수 있 지만,실행 할 때 하나의 catch 블록 만 실 행 될 수 있 으 며,순서대로 일치 하 는 catch 블록 을 찾 을 수 있 기 때문에 부모 클래스 의 이상 을 뒤의 catch 블록 에 두 어야 합 니 다.

try{
test.method(str);
}catch (MyException e)
{
System.out.println("MyException catch");
e.printStackTrace();
}catch(MyException2 e)
{
System.out.println("MyException2 catch");
e.printStackTrace();
}catch(Exception e)
{
System.out.println(“Exception catch”);
e.printStackTrace();
}
finally
{System.out.println("finally");
}


try{
test.method(str);
}catch(Exception e)
{
System.out.println(“Exception catch”);
e.printStackTrace();
}
catch (MyException e)
{
System.out.println("MyException catch");
e.printStackTrace();
}catch(MyException2 e)
{
System.out.println("MyException2 catch");
e.printStackTrace();
}
finally
{System.out.println("finally");
}

면접 문제
제목 1:

package defineexception;
public class ExceptionTest3
{
    public void method()
    {
        try
        {
            System.out.println("try");
            return;
        }
        catch(Exception ex)
        {
            System.out.println("     ");
        }
        finally
        {
            System.out.println("finally");
        }
        System.out.println("         ");
    }
    public static void main(String[] args)
    {
        ExceptionTest3 test =new ExceptionTest3();
        test.method();
    }
}

결과:
try
finally
분석 하 다.
try 블록 에 return 문 구 를 존재 합 니 다.그러면 먼저 finally 블록 에 있 는 코드 를 실행 한 다음 에 return 문 구 를 실행 해 야 합 니 다.그리고 그 후의 다른 코드 도 다시 실행 하지 않 습 니 다.
제목 2:

package defineexception;
public class ExceptionTest3
{
    public void method()
    {
        try
        {
            System.out.println("try");
            System.exit(0);
        }
        catch(Exception ex)
        {
            System.out.println("     ");
        }
        finally
        {
            System.out.println("finally");
        }
        System.out.println("         ");
    }
    public static void main(String[] args)
    {
        ExceptionTest3 test =new ExceptionTest3();
        test.method();
    }
}

결실
try
분석 하 다.
try 블록 에 있 는System.exit(0)문 구 를 먼저 실행 하고 가상 컴퓨터 시스템 에서 종료 되 었 기 때문에finally블록 의 코드 를 실행 하지 않 습 니 다.
참조 링크
https://www.jb51.net/article/161574.htm
더 많은 자바 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.
본 고 에서 말 한 것 이 여러분 의 자바 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기