자바 의 이상 과 처리 메커니즘 분석[부 면 시험 문제]
자바 의 이상 메커니즘
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
더 많은 자바 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.
본 고 에서 말 한 것 이 여러분 의 자바 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.