336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

JAVA 프로그래밍(객체지향프로그래밍)을 하다보면 클래스 및 메소드, 변수에 접근을 제어하기 위하여 public, private, protected 선언을 사용한다. 


그렇다면 이러한 선언에 따른 접근 권한이 어떻게되는지 알아보도록 하겠다. 


  • 접근 제어자
    • public: 모든 클래스에서 접근가능함
    • private: 클래스 내에서만 접근가능함
    • protected: 동일한 패키지에 속하는 클래스에서 접근가능함. 또, 자신을 상속받은 클래스에서 접근가능함.
    • (default): 아무것도 선언하지 않은 상태를 표현하며, 동일한 패키지에 속한 클래스에서만 접근 가능함.



336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

서비스의 특성상 지속적으로 제공해야하는 서비스인데 비정상적으로 종료될 경우, 비정상종료의 원인을 파악할 수 있는 로그를 남기고 서비스를 재실행하여 서비스를 계속 제공하면 된다. 


그렇다면, 이런것을 가능하게 하는 방법은 무엇일까? Java 1.5 부터 지원된 기능으로 setDefaultUncaughtExceptionHandlersetUncaughtExceptionHandler 메소드이다. 메소드 이름을 보면 알겠지만, 예상할 수 없는 예외사항을 처리하는 핸들러를 지정하는 것이다. 


static 함수인 setDefaultUncaughtExceptionHandler은 모든 스레드에서 발생하는 uncaught exception을 처리하는 핸들러를 지정할 때 사용하며, setUncaughtExceptionHandler은 해당 스레디에서 발생하는 uncaught exception을 처리하는 핸들러를 지정한다. 


예제 코드는 아래와 같다. 


package kr.yoongi.java.tutorial;

public class TutotialUncaughtExceptionHandler {
    class Task implements Runnable {
        @Override
        public void run() {
            Thread.currentThread().setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
                @Override
                public void uncaughtException(Thread thread, Throwable e) {
                    // TODO 처리 코드 입력 
                    System.out.println(thread + " throws exception: "+ e);

                    // TODO 재실행을 위한 스레드 생성
                    // new Thread(new Task()).start();
                }
            }
            throw new RuntimeException();
        }
    }

    public static void main(String[] args) {
        Thread t = new Thread(new Task());
        /*
        Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {
            @Override
            public void uncaughtException(Thread thread, Throwable e) {
                System.out.println("DefaultUncaughtExceptionHanlder / " + thread + " throws exception: "+ e);
            }
        });
        */
        t.start();
    }
}



위의 코드를 실행하면 아래와 같이 콘솔에 출력됩니다. 


Thread[Thread-0,5,main] throws exception: java.lang.RuntimeException


여기까지는 Java 에서 사용하는 방법을 설명하였다. 만약 Android 에서 사용한다면 아래와 같은 상황을 고려해야 한다. 

  • 예외 사항을 처리한 후 앱 종료 방법
  • 앱 종료의 비정상종료를 나타는 UI를 표현하는 방법
  • 앱 종료 후 재실행하는 방법

Android 에서 사용하는 방법은 다시 작성하도록 하겠다. 


[참고]

1) https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html

2) https://developer.android.com/reference/java/lang/Thread.UncaughtExceptionHandler.html