Java 병렬 프로그래밍 예시 (8): 스레드의 비검사 예외 처리

Java 언어에서는 이상을 두 가지 유형으로 나눕니다.
검사 이상: 이런 이상은 반드시 throws 자구에서 현식으로 던져지거나 방법 내에서 포획되어야 합니다.예를 들어, IOException 예외 또는 ClassNotFoundException 예외입니다.
검사되지 않은 이상: 이런 이상은 현식 투매나 포획이 필요하지 않습니다.예를 들어, NumberFormatException 예외입니다.
검사된 이상이 Thread 대상의run () 방법에서 던져졌을 때, 우리는 그것을 포착하고 처리해야 한다. 왜냐하면 run () 방법은 이상을 던질 수 없기 때문이다.검사되지 않은 이상이 Thread 대상의run () 방법에서 던져졌을 때, 기본 동작은 컨트롤러에서 창고 추적 정보를 출력하고 프로그램을 종료하는 것입니다.
다행히도 Java는 프로그램의 종료를 피하기 위해 Thread 대상이 던진 비검사 이상을 처리하는 메커니즘을 제공합니다.
이 절에서 우리는 예시로 이런 메커니즘을 보여 준다.
그 사실을 알다
아래와 같은 절차에 따라 우리의 예시를 실현하다.
1. 우선, 우리는 검사를 받지 않은 이상을 처리하는 데 사용되는 종류를 실현해야 한다.이 클래스는 반드시 Uncaught Exception Handler 클래스를 실현하고 이 인터페이스에서 설명한 uncaught Exception () 방법을 실현해야 한다.이 예에서 이 클래스는 ExceptionHandler, uncaught Exception () 방법으로 이상과 이상한 스레드 정보를 출력합니다.코드는 다음과 같습니다.

public class ExceptionHandler implements Thread.UncaughtExceptionHandler {
    @Override
    public void uncaughtException(Thread t, Throwable e) {
        System.out.printf("An exception has been captured\
");
        System.out.printf("Thread: %s
", t.getId());
        System.out.printf("Exception: %s: %s
", e.getClass().getName(),
                e.getMessage());
        System.out.printf("Stack Trace:
");
        e.printStackTrace(System.out);
        System.out.printf("Thread status: %s
", t.getState());
    }
}
2. 검사되지 않은 이상을 던질 수 있는 클래스를 Task라고 하고 Runnable 인터페이스를 실현하며run() 방법을 실현한다. 일부러 검사되지 않은 이상을 일으킬 수 있는 코드를 인코딩한다. 예를 들어 문자열을 숫자로 변환한다.코드는 다음과 같습니다.

public class Task implements Runnable {
    @Override
    public void run() {
        int numero = Integer.parseInt("diguage.com");
    }
}
3. 프로그램의 메인 클래스, 메인 클래스를 만들고 메인 () 방법을 실현합니다.코드는 다음과 같습니다.

public class Main {
    public static void main(String[] args) {
4. Task 객체를 만들고 Thread 객체를 작성합니다.setUncaughtExceptionHandler() 방법을 사용하여 검사되지 않은 비정상적인 처리 클래스를 설정합니다.그리고 라인을 시작합니다.코드는 다음과 같습니다.

Task task = new Task();
Thread thread = new Thread(task);
thread.setUncaughtExceptionHandler(new ExceptionHandler());
thread.start();
5. 예시를 실행하고 결과를 봅니다.
그 까닭을 알다
아래의 출력 부분에서 이상 실행 결과를 볼 수 있습니다.이상이 던져지고 처리 클래스에 포착되어 이상 정보를 컨트롤러에 출력합니다.

An exception has been captured
Thread: 9
Exception: java.lang.NumberFormatException: For input string: "diguage.com"
Stack Trace:
java.lang.NumberFormatException: For input string: "diguage.com"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:492)
    at java.lang.Integer.parseInt(Integer.java:527)
    at com.diguage.books.concurrencycookbook.chapter1.recipe8.Task.run(Task.java:13)
    at java.lang.Thread.run(Thread.java:722)
Thread status: RUNNABLE

Process finished with exit code 0

하나의 스레드가 이상을 던지고 이 이상(여기는 특별히 검사를 받지 않는 이상을 가리킨다)이 포착되지 않았을 때 자바 가상 기회는 상응하는 방법으로 검사를 받지 않는 이상 처리 클래스를 설정했는지 확인하고, 이미 설정된 경우 uncaught Exception () 방법을 호출하여 스레드와 이상을 매개 변수로 전달합니다.
처리 클래스를 설정하지 않으면 Java 가상 머신이 콘솔에서 스택 추적 정보를 출력하고 프로그램을 종료합니다.
영원히 끝이 없다
Thread 클래스는 검사되지 않은 이상 처리와 관련된 방법이 하나 더 있습니다.이것이 바로 정적 방법setDefaultUncaught ExceptionHandler () 입니다. 이 방법은 프로그램의 모든 스레드에서 검사되지 않은 비정상적인 처리 클래스를 설정할 수 있습니다.
스레드에서 포착되지 않은 예외가 발생하면 Java 가상 기회는 세 곳에서 예외 처리 클래스를 찾습니다.
우선, 루틴 대상에서 이상 처리 종류를 찾는 것이 바로 우리 절에서 배운 내용이다.존재하지 않으면 스레드가 있는 스레드 그룹(Thread Group)에서 이상 처리 클래스를 찾습니다.이 부분의 내용에 관해서는 나중에 전문적으로 설명할 것이다.만약 존재하지 않는다면, 위에서 언급한 프로그램의 기본 이상 처리 클래스를 찾습니다.
위에서 언급한 이상 처리가 존재하지 않으면 Java 가상 시스템은 이상한 스택 추적 정보를 컨트롤러에 출력하고 프로그램을 종료합니다.
나래주의
본고는 《Java7 Concurrency Cookbook》(D 오이고에서 《Java7 병발 예시집》으로 번역)에서 번역한 것으로 학습 자료로만 사용된다.권한이 없으면 어떠한 상업 행위에도 사용할 수 없다.
소소하다
ExceptionHandler 클래스의 전체 코드

package com.diguage.books.concurrencycookbook.chapter1.recipe8;

/**
 *
 * Date: 2013-09-22
 * Time: 23:11
 */
public class ExceptionHandler implements Thread.UncaughtExceptionHandler {
    @Override
    public void uncaughtException(Thread t, Throwable e) {
        System.out.printf("An exception has been captured
");
        System.out.printf("Thread: %s
", t.getId());
        System.out.printf("Exception: %s: %s
", e.getClass().getName(),
                e.getMessage());
        System.out.printf("Stack Trace:
");
        e.printStackTrace(System.out);
        System.out.printf("Thread status: %s
", t.getState());
    }
}

Task 클래스의 전체 코드

package com.diguage.books.concurrencycookbook.chapter1.recipe8;

/**
 *
 * Date: 2013-09-22
 * Time: 23:18
 */
public class Task implements Runnable {
    @Override
    public void run() {
        int numero = Integer.parseInt("diguage.com");
    }
}

Main 클래스의 전체 코드

package com.diguage.books.concurrencycookbook.chapter1.recipe8;

/**
 *
 * Date: 2013-09-22
 * Time: 23:20
 */
public class Main {
    public static void main(String[] args) {
        Task task = new Task();
        Thread thread = new Thread(task);
        thread.setUncaughtExceptionHandler(new ExceptionHandler());
        thread.start();
    }
}

좋은 웹페이지 즐겨찾기