Error
에러란 프로그램이 동작 중 어떤 요인으로 인해 동작을 중지하거나 비정상적인 동작을 하는 것을 말합니다.
이때 에러에는 크게 2가지가 있는데, 컴파일 에러와 런타임 에러로 나눌 수 있습니다.
컴파일 에러 : 컴파일 시에 발생하는 에러
런타임 에러 : 프로그램이 실행하는 도중에 발생하는 에러
Compile Time Error
JVM을 통해 .class 파일로 변환되는 과정이다. .java파일에 대해 잘못된 문법, 오타, 자료형 문제 등의 기본적인 검사를 수행한다.
Run Time Error
대표적인 예
- 무한루프
- Null 에러
- 0으로 나누는 경우
- 잘못 접근한 경우
즉, 프로그램을 잘못 설계하면서 생기는 에러가 Run time error이다.
프로그램을 짜고 정상 동작을 확인하면서 생기는 에러는 대부분 여기에 해당합니다.
또한 동작 중 에러가 발생해서 동작 자체가 멈추기 때문에 이러한 에러들을 방지하는 모든 경우의 수에 대비해야 합니다.
자바에서는 발생할 수 있는 에러를 미리 클래스로 만들어 놨습니다.
예외 클래스
예외 클래스는 Throwalbe 클래스를 부모클래스로 가지고 있습니다.
- Exception 클래스 : 예외가 발생했을 때 사용하는 클래스
- Error 클래스 : 심각한 오류가 발생하면 사용하는 클래
에러의 경우 의도치 않게 실행도중에 발생하지만 Exception 클래스의 경우 미리 처리를하여 막을 수 가 있기때문에 해주는 것이 좋습니다.
Exception 클래스
exception클래스에는 RuntimeException 하위 클래스들과 RuntimeException 이외의 클래스로 나눌 수 있다.
- RuntimeException : 대부분 프로그래머의 실수로 생긴다.
- NullPointerException: 참조변수를 호출했는데 Null값일 때
- ClassCastException: 클래스의 형변환을 잘못했을 때
- ArithmeticException: 0으로 나눌 때
- Exception: 프로그램외의 외적인 영향으로 발생
- ClassNotFoundException: 클래스 이름을 잘못 적었을때
- DataFormatException: 입력한 데이터 형식이 잘못된 경우
등이 있다.
예외 처리 ( Try - Catch )
예외의 경우 직접 예방할 수 있지만 미처 처리하지 못한 경우 JVM의 예외처리기가 받아서 해당 예외 인스턴스를 생성하여 사용자에게 보여준다.
try - catch 사용법
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
class Main {
public static void main(String[] args) {
try {
int a = 5/0;
} catch (IllegalAccessError | ArrayIndexOutOfBoundsException e) {
} catch (NullPointerException exception) {
} catch (ArithmeticException exception) {
System.out.println("0으로 나눴다!!!\n" + exception);
} catch (Exception exception) {
}
}
}
|

여기서 try 괄호 내부에서 일어나는 예외중 가장 먼저 일어나는 하나만을 잡는다.
따라서 try-catch문은 하나의 if문으로 생각해 보셔도 됩니다. 'try문의 문구를 실행했을 때? -> ~예외가 발생한다면? -> 어떻게 하겠다.' 다만, try문 내에서는 예외가 발생하는 줄이 있으면 catch문으로 갑니다. 이때 ()괄호에서의 클래스를 instanceof연산자를 통해 같은 인스턴스를 찾게 됩니다.
그렇다면 이런 예외로 어떻게 사용할까?
printStackTrace() & getMessage()
예외가 발생했을 때 예외 인스턴스에 대한 정보를 가져올 수 있는 메서드가 있습니다. 그 두 가지가 printStackTrace()와 getMessage()입니다.
printStackTrace: 함수는 호출이 되면 Call stack에 함수에 대한 데이터와 함께 쌓이는데, 예외가 발생하게 되면 예외 당시의 Call stack에 있는 함수 데이터와 예외 메세지를 화면에 출력해 주는 역할을 합니다.
Throw 예외
class Main {
public static void main(String[] args) throws Exception {
throw new Exception();
}
public static void test1() {
throw new IllegalArgumentException();
}
public static void test2() throws IllegalArgumentException {
throw new IllegalArgumentException();
}
}
특정 조건에 따라 예외를 처리하기 위해서 하는 동작은 throw를 하는 것입니다.
하지만 Exception의 경우 모든 예외에 대한 부모 클래스이므로 따로 메서드에 선언을 해줘야 합니다.
메서드에 예외 선언 이유?
메서드 내의 발생 가능한 예외를 명시하여 이에 대한 처리를 강요합니다. 이를 통해 메서드가 사전에 어떤 에러를 발생시키는지 명시하기 위해 사용됩니다.
예외 구문 분석
class Main {
public static void main(String[] args) throws Exception {
test1();
}
public static void test1() {
beforeTest();
test2();
afterTest();
}
public static void test2() throws IllegalArgumentException {
throw new IllegalArgumentException("에러");
}
public static void beforeTest() {
System.out.println("Before Test");
}
public static void afterTest() {
System.out.println("After Test");
}
}

위 코드를 실행했을 때의 결과입니다.
여기서 알 수 있는것은
- 발생한 예외 : IllegalArgumentException
- 예외 내역 : 에러
- Call stack에 담겨있던 함수(위에서 부터) : test2 - test1 - main
- 따라서 가장 나중에 호출된, 즉 예외가 발생한 함수가 위에서 부터 나열된다.
- 예외 발생 이후 : 예외를 catch하는 부분까지 돌아간다.
Finally문
class Main {
public static void main(String[] args) {
try {
test1();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} finally {
System.out.println("Finally");
}
System.out.println("finally 이외 끝");
}
public static void test1() {
System.out.println("Before test");
test2();
System.out.println("After test");
}
public static void test2() {
throw new IllegalArgumentException("에러");
}
}

Finally문은 예외 상관없이 무조건 실행되어야 하는 코드이다.
Try-Catch-Resource (JDK 1.7)
try (FileInputStream fis = new FileInputStream("score.dot");
DataInputStream dis = new DataInputStream(fis)){
// do
} catch (IOException e) {
// catch file.close()
} finally {
System.out.println("Finally");
}
System.out.println("finally 이외 끝");
}
Resource는 파일 입출력에서 가장 많이 사용하는 try-catch문 입니다.
try (resource) {} catch () {} 로 구성되어 있습니다. resource문을 사용하는 이유는 사용했던 자원을 도중에 중단되는데 이때, 자원을 자동 반납하기 위해 사용됩니다.
Custom 예외클래스 만들기
class CustomException extends Exception {
private static final long serialVersionUID = 123456789L;
CustomException(String msg) {
super(msg);
}
public static long getSerialVersionUID() {
return serialVersionUID;
}
}
자신만의 예외 처리 함수를 만들고 싶다면, Exception클래스를 상속받아야 합니다.
또한 에러 메세지의 경우 부모 클래스로 넘겨주면 된다.
'JAVA > 자바스터디' 카테고리의 다른 글
[자바스터디] Collection - Iterator (0) | 2023.01.22 |
---|---|
[자바스터디] Collection - List (0) | 2023.01.21 |
인터페이스 (0) | 2022.11.17 |
상속 - 추상클래스 (0) | 2022.11.17 |
상속 - 다형성 (0) | 2022.11.17 |