예외 처리 기술과 원리를 파악하지 않았다 몇 년 동안 많은 프로그래머

자바에서 예외 메커니즘 의미 : 프로그램이 자동으로 다양한 조치를 취할 수있는 예외 알림 프로세스를받은 후, 통지 절차에 프로그램을 예외 객체를 던질 것이다 작업 중 예기치 않은 상황이 발생하는 경우,이 메커니즘은 프로그램을 수 더 강력한, 더 읽기. 이 문서 Laijiangjiang 지식 예외 처리.


이상 분류

CheckedExcep에 자바 예외와의 RuntimeException.

  • RuntimeException의 : 오류는 프로그램 실행 중에 예외를 확인됩니다 발생합니다. 예를 들어 : 변환 오류, 배열 첨자 액세스 위반, 널 포인터 예외의 유형 등 지정된 클래스를 찾을 수 없습니다.
  • CheckedException : 예외는 예외에서 예외를 확인하고 실행 중이 아닌 경우, 컴파일러는 체크하여 캡처를 시행하고 블록을-시도 캐치 또는이 예외가 머리에 발신자의 처리 방법에 슬로우됩니다 선언합니다.

2. 오류 및 이상 차이

예외 말하기, 종종 오류를 포함한다. 그리고 구별 오류 예외가있다 :

오류가 시스템 오류를 지칭 프로그래머가 변경 될 수없고, 처리는 프로그램을 컴파일시에 오류이며, 그것은 단지 프로그램을 수정함으로써 보정 될 수있다. 자바에서 오류가 일반적으로 시스템 충돌, 가상 기계 오차, 메모리 공간 부족, 메소드 호출 스택 오버플로 가상 머신과 관련된 문제를 말한다. 애플리케이션의 경우 이러한 오류는 프로그램 자체 복구 할 수 없습니다 및 예방에 의존 중단으로 이어질 같은 오류가 발생, 우리는 가상 머신 코드 또는 프로그램을 다시 시작의 매개 변수를 조정, 종료 할 수있는 프로그램을 추천합니다;

예외 (예외) 프로그램이 처리 할 수있다. 때 비정상적인, 프로그래머는 예외 프로그램 이력서를 처리하기 위해 가능한 한 많이 수집해야하며, 예외를 종료 자유롭게 안된다. 정말이 예외가 위쪽으로 발신자를 다루는 왼쪽 발생합니다 처리하는 방법을 모르겠어요.

예외 처리의 3 원칙

4. 어떻게 정의 예외

복잡한 비즈니스 환경에서, 자바는 우리의 비즈니스의 요구를 충족 할 수 없습니다 제외하고, 우리는 사용자 지정 비즈니스 예외를 처리하는이 시간에 예외가있을 수 있습니다 온다.

public class MyException extends RuntimeException {

    private static final long serialVersionUID = 6958499248468627021L;
   
    private String errorCode;
    
    private String errorMsg;

    public MyException(String errorCode,String errorMsg){
        super(errorMsg);
        this.errorCode = errorCode;
        this.errorMsg = errorMsg;
    }

    public MyException(String errorCode,String errorMsg,Throwable throwable){
        super(errorCode,throwable);
        this.errorCode = errorCode;
        this.errorMsg = errorMsg;
    }

    public String getErrorCode() {
        return errorCode;
    }

    public void setErrorCode(String errorCode) {
        this.errorCode = errorCode;
    }

    public String getErrorMsg() {
        return errorMsg;
    }

    public void setErrorMsg(String errorMsg) {
        this.errorMsg = errorMsg;
    }
}

사용 MyException에서, 바람직하게는 클래스 열거 정의 열거 오류 코드 및 오류 세부 사항을.

5. 창 그리고 마지막으로 실행 순서

자바에서 예외 처리는 주로, 시도, 잡기, 던지기로 구성 던져 finally5 키워드 처리됩니다. 자바 프로그램은 비정상적인 아니지만 잡은 시도-catch 블록 경우, 시스템은 발생 처리 코드를 알고, 예외가 정상에있다 발생합니다. 블록이 처리되지 않은 경우는 멀티 쓰레드 ()에 의해 발생 Thread.run 경우는 메인 스레드가 단일 인 경우, 발생) (상단에 투입된다. 던져 후, 아이 thread 경우, 자식 스레드가 종료. 예외가 메인 프로그램에 의해 발생되는 경우,이 모든 프로그램은 종료됩니다.

다음과 같이 더 일반적인 예외 처리 방법은 :

    try {
        //step1
        System.out.println("try...");
        throw new RuntimeException("异常1...");
    }catch (Exception e){
        //step2
        System.out.println("catch。。。");
    }finally {
        //step3
        System.out.println("finally。。。");
    }
    //step4
    System.out.println("end...");

위의 코드로 인해 프로그램이 아래로 계속, 현재의 thread가 종료되지 않도록 캐치 예외 라이브 던져 성공적이었다이 단계 코드가 인쇄됩니다 4 단계.

    try {
        System.out.println("try...");
        throw new RuntimeException("异常1...");
    }catch (Exception e){
        System.out.println("catch。。。");
        throw new RuntimeException("异常2...");
    }finally {
        System.out.println("finally。。。");
    }
    System.out.println("end...");

catch 블록은 예외를 던져 및 예외가 해당 catch 블록 처리하지 않기 때문에 위의 코드는, 시스템은 실행보다도 이하, 이상 마지막 인쇄 문이를 던질 것이다.

던져, 마지막으로, 캐치 시도하고 유도를 사용하여 발생

  • 마지막으로-시도하거나 시도 - 캐치 - 마지막으로, 단지 시도 - 캐치를 할 수 있습니다, 캐치를 시도, 그리고 마지막으로 단독으로 사용 할 수 없습니다.
  • 블록 모니터 코드, 시도 다음 코드를 실행 이상 정지 한 다음 구현을 계속 코드를 실행 catch 블록 후, 핸들 예외 catch 블록에 전달 .
  • 마지막 블록 코드는 일반적으로 자원 회수에 사용 실행될 것이다.
  • 오류 : 호출 방법을 알리는 특별한 문을.
  • 던져 : 예외가 잡힌 또는 그것과는 아무 상관 넣지 계속 될 때, 예외를 throw합니다.

더 중요한 것은 수익 사이의 관계 그리고 마지막의 구현도있다,이 참조 할 수 있습니다 블로그

6. 이상 체인

보통 개발에서, 우리는 종종 예외가 다른 사용자 정의 예외 후에 발생합니다 잡을하고 예외 체인이라고합니다 원래 예외 정보를 유지하는 것이 좋습니다. 때 우리 사용자 정의 예외로 오래 던질 수있는 수신 생성자의 매개 변수가있을 수 :

public MyException(String errorCode,String errorMsg,Throwable cause){
    super(errorCode,cause);
    this.errorCode = errorCode;
    this.errorMsg = errorMsg;
}

7. 시도 -과 - 자원

우리는 수동으로 가까운 그들, 당신은 외부 리소스 (등 파일, 데이터베이스 연결, 네트워크 연결을) 열면 자바 프로그래밍 과정에서, 우리는 이러한 외부 자원을 사용해야 후 것을 알고있다. 우리는 적절한시기에 외부 리소스 해제 프로그래밍, 외부 리소스 누수로 이어질 것을 보장하지 않는 경우 JVM이 아닌 도움이 외부 자원 관리 때문에 JVM 가비지 수집 메커니즘을 즐길 수없는 수, 즉시 파일에 의해이 점유 될 것이다이 이상, 과도한 데이터베이스 연결 오버 플로우 풀 연결하는 심각한 문제가 많이 발생합니다.

  1. 전통적인 자원 - 오프 모드
//这种方式关闭资源,代码显得比较臃肿
public static void main(String[] args) {
    FileInputStream inputStream = null;
    try {
        inputStream = new FileInputStream(new File("test"));
        System.out.println(inputStream.read());
    } catch (IOException e) {
        throw new RuntimeException(e.getMessage(), e);
    } finally {
        if (inputStream != null) {
            try {
                inputStream.close();
            } catch (IOException e) {
                throw new RuntimeException(e.getMessage(), e);
            }
        }
    }
}
  1. 시도 --자원과 자원을 종료하는 방법
public static void main(String[] args) {
    try (FileInputStream inputStream = new FileInputStream(new File("test"))) {
        System.out.println(inputStream.read());
    } catch (IOException e) {
        throw new RuntimeException(e.getMessage(), e);
    }
}

그것은 뒤에 괄호 시도 키워드는 시도-catch 블록이 완료되면, 자바 close 메소드가 호출되는 외부 자원을 보장에서 객체의 핸들 외부 리소스를 생성합니다. 코드는 현재 많은 간단하지 않다!
객체 핸들 외부 자원이 달성되면 JDK7에서 AutoCloseable 인터페이스는 시도 -과 - 자원 더 우아한 구문 종료 리소스를 사용 플레이트 코드를 제거 할 수 있습니다.

참고

추천

출처www.cnblogs.com/54chensongxia/p/12146161.html