Programing/Java

Effective Java - Exception

안중환 2016. 3. 9. 16:14
  • Exception
    package kr.co.ioacademy;
    // 자바의 예외 3가지
    // 1. 점검 지정 예외     : 복구가 가능한 상황
    // 2. 무점검 지정 예외    : 복구가 불가능한 상황
    //  1) 실행 시점 예외(Runtime Exception) - 사용자
    //  2) 오류(Error) - JVM
    
    // API 사용자에게 점검 지정 예외를 준다는 것은 그 상태를 복구할 권한을 준다는 것이다.
    // (무시할 수 있지만 무시하면 안된다)
    
    // 실행 시점 예외와 오류의 동작 방식은 동일하다.
    // -> 둘다 catch 할 필요가 없다. 처리해서도 안된다.
    
    
    class Engine {}
    
    class Car {
    
      private static Class<Engine> engineClass = Engine.class;
    //  private Engine engine = engineClass.newInstance();
    //  // 2. 인스턴스 필드의 초기화에서 발생하는 예외는 생성자에서 처리해야 한다.
    //  public Car() throws Exception {
    //  }
    
      private Engine engine = newEngine();
      private static Engine newEngine() {
        try {
          return engineClass.newInstance();
        } catch (InstantiationException | IllegalAccessException e) {
          e.printStackTrace();
        }
        return null;
      }
    
      /*
      // 1. 인스턴스 필드가 생성자 호출보다 먼저 일어난다.
      private Car instance = new Car();
      public Car() throws Exception {
        throw new Exception("Failed to create");
      }
      */
    }
    
    public class Example9 {
      public static void main(String[] args) {
        try {
          Car car = new Car();
          System.out.println("Succeed");
        } catch (Exception e) {
          System.out.println("Failed");
        }
      }
    }

  • Assertion
    : jdk 1.4부터 도입
    : Assertion은 불리언 식(expression)을 포함하고 있는 문장으로서, 프로그래머는 그 문장이 실행될 경우 불리언 식이 참이라고 단언할 수 있다. (JSR, Java Specification Request) 
    : Assertion은 개발자가 참이라고 가정하는 상태를 명시하기 위해서 사용된다. (예를 들어, 어떤 메소드가 파라미터로 양수만 입력받아야 한다고 확신한다면, Assertion을 사용하여 그 사실을(즉, 파라미터가 양수라는 것을) 명시할 수 있다.)

    // jdk 1.4
    // javac -source 1.4 AssertionTest.java 
    // JRE 클래스가 Assertion을 포함하는지 여부에 상관없이 기본적으로 Assertion 기능을 사용하지 않는다.
    // java -ea AssertionTest
    
    
    // 문법
    // assert [boolean 식];
    // assert [boolean 식]:[표현식];
    
    // 사용해선 안 되는 경우
    // public 메소드의 파라미터를 검사하는 경우
    // 올바른 수행을 위해 필요한 작업을 수행하는 경우
    // ex) assert checkName(); -> boolean checked = checkName();
    // 							  assert checked;
    
    public class AssertionTest {
    	// Assert 기능 강제적으로 사용하도록 유도
    	static { 
    		boolean assertsEnabled = false;
    		assert assertsEnabled = true;        if (!assertsEnabled)
    			throw new RuntimeException("Assertion 기능이 사용가능해야 합니다!");
    	}    
    
    	/*    
        // post-condition check
    	Object getObj(Object obj) {
    		assert obj != null : "obj cannot be null";
    
    		return obj;
    	}
     
        // pre-condition check
    	void register(MemberInfo member) {
    		assert Member != null:"MemberInfo cannot be null";
    		assert member.getId() != null && !member.getId().equals("");
    
    	        ...
    	}
    	 */
    
    	public static void main(String[] args) {
    		char operator = '%';                  // assumed either '+', '-', '*', '/' only
    		int operand1 = 5, operand2 = 6, result = 0;
    		switch (operator) {
    			case '+': result = operand1 + operand2; break;
    			case '-': result = operand1 - operand2; break;
    			case '*': result = operand1 * operand2; break;
    			case '/': result = operand1 / operand2; break;
    			default: assert false : "Unknown operator: " + operator;  // not plausible here
    		}
    		System.out.println(operand1 + " " + operator + " " + operand2 + " = " + result);
    	}
    }
    
    참고 : http://javacan.tistory.com/entry/79, https://www3.ntu.edu.sg/home/ehchua/programming/java/J5a_ExceptionAssert.html