Exception

Ajisai·2023년 7월 24일
0

Java

목록 보기
9/17

크게 다음과 같이 분류된다.

  • Error
  • Exception

Error

  • 실행 시 하드웨어의 문제로 인해 발생하는 오류
  • JVM 실행에 문제가 생겼음을 의미한다.
  • Java application은 JVM 위에서 실행되기 때문에 프로그램을 아무리 잘 만들었어도 실행 불능이 되고, 개발자는 이에 대처할 방법이 없다.
  • 심각한 거
  • 일단 Throwable을 상속받으므로 예외 처리가 가능은 하지만 잘 안 함
  • 에러는 예외와 달리 근본적인 원인을 제거해야 한다.

Exception

  • 사용자의 잘못된 조작이나 개발자의 실수로 인해 발생하는 오류
  • 일단 발생하면 프로그램이 바로 종료된다는 점에서는 에러와 같다.
  • 예외 처리(exception handling)를 통해 실행 상태를 유지할 수 있다는 점에서는 에러와 다르다.
  • 덜 심각한 거

예외는 다시 일반 예외(exception)과 실행 예외(runtime exception)로 나뉜다.

일반 예외 exception

  • 컴파일 과정에서 예외 처리 코드가 필요한지 검사한다.
  • 그래서 컴파일러 체크 예외 checked exception라고도 한다.
  • 예외 처리 코드(try-catch 등)가 없다면 컴파일 오류가 발생한다.

실행 예외 Runtime exception

  • 컴파일 과정에서 예외 처리 코드를 검사하지 않는 예외다.
  • 그래서 unchecked Exception이라고도 한다.
  • 컴파일 시 검사 유무만 다를 뿐, 두 예외 모두 예외 처리는 필요하다.

Exception class

  • 자바는 예외를 클래스로 관리한다.
  • 프로그램 실행 중 예외가 발생하면 JVM은 해당 예외 클래스의 instance를 생성한 후, 예외 처리 코드에서 예외 객체를 사용할 수 있게 한다.
  • 모든 예외 클래스는 java.lang.Exception 클래스를 상속한다.
  • 일반 예외 클래스는 java.lang.Exception 클래스를 바로 상속하고, Runtime exception 클래스는 java.lang.RuntimeException 클래스를 상속한다.
  • java.lang.RuntimeException 클래스는 java.lang.Exception 클래스를 상속한다.
    즉 다음과 같은 구조다.

일반 예외 클래스

  • ClassNotFoundException
    컴파일된 클래스 파일(*.class)을 찾을 수 없는 경우
  • InterruptedException
    인터럽트(다른 처리를 위해 실행을 멈추는 것)가 발생한 경우

실행 예외 클래스

  • NullPointerException
    객체 참조가 없는 변수, 즉 null 값을 갖는 변수를 통해 객체를 참조하는 경우
  • ArrayIndexOutOfBoundsException
    배열에서 인덱스 범위를 초과해 접근하는 경우
  • NumberFormatException
    숫자로 변환할 수 없는 문자열을 숫자로 변환하려고 하는 경우
  • ClassCastException
    타입 변환(casting)이 불가능한 경우
    타입 변환은 상위 클래스와 하위 클래스 간에서, 인터페이스와 구현 클래스 간에서만 가능하다. 이런 관계가 아닌데 타입 변환을 하면 ClassCastException이 발생한다.
  • ArithmeticException
    • 어떤 수를 0으로 나누는 경우
    • 근데 이것도 정수일 때 얘기다.

ArithmeticException

    /**
     * A constant holding the positive infinity of type
     * {@code double}. It is equal to the value returned by
     * {@code Double.longBitsToDouble(0x7ff0000000000000L)}.
     */
    public static final double POSITIVE_INFINITY = 1.0 / 0.0;

    /**
     * A constant holding the negative infinity of type
     * {@code double}. It is equal to the value returned by
     * {@code Double.longBitsToDouble(0xfff0000000000000L)}.
     */
    public static final double NEGATIVE_INFINITY = -1.0 / 0.0;

    /**
     * A constant holding a Not-a-Number (NaN) value of type
     * {@code double}. It is equivalent to the value returned by
     * {@code Double.longBitsToDouble(0x7ff8000000000000L)}.
     */
    public static final double NaN = 0.0d / 0.0;

Double 클래스 맨 첫 부분이다.
정수를 0으로 나누는 경우(3/0 등)에는 ArithmeticException이 발생하지만 정수에서는 그냥 Infinity로 출력된다.
NaNNot a Number라는 뜻으로 음수의 제곱근 등을 말한다.

System.out.println(Math.sqrt(-1));
System.out.println(3.0/0);

즉 위 코드의 출력은 다음과 같다.

NaN
Infinity
profile
Java를 하고 싶었지만 JavaScript를 하게 된 사람

0개의 댓글

관련 채용 정보