Recent Posts
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- 오블완
- 깡돼후
- terminal
- Value too long for column
- 코루틴 컨텍스트
- preemption #
- 코루틴 빌더
- PersistenceContext
- mp4fpsmod
- taint
- 티스토리챌린지
- JanusWebRTCServer
- JanusWebRTC
- Spring Batch
- kotlin
- 개성국밥
- VARCHAR (1)
- 달인막창
- 겨울 부산
- tolerated
- 헥사고날아키텍처 #육각형아키텍처 #유스케이스
- table not found
- PytestPluginManager
- python
- JanusWebRTCGateway
- pytest
- k8s #kubernetes #쿠버네티스
- vfr video
- JanusGateway
- 자원부족
Archives
너와 나의 스토리
[Java Exception] 예외와 예외 클래스 / 예외 처리 본문
반응형
에러(Error)
- 컴퓨터 하드웨어의 오동작 또는 고장으로 인해 애플리케이션 실행 오류가 발생하는 것
- 에러는 JVM 실행에 문제가 생겼다는 것으로, 개발자는 이런 에러에 대처할 방법이 없다.
- 자바에서는 에러 이외에 예외(exception)이라고 부르는 오류가 있다.
- 예외란 개발자의 잘못된 코딩 또는 사용자의 잘못된 조작으로 발생하는 오류를 말한다.
- 에러는 발생하면 곧바로 프로그램이 종료된다. 하지만 예외는 예외 처리(Exception Handling)을 통해 프로그램을 종료하지 않고 정상 실행 상태가 유지되도록 할 수 있다.
예외(Exception)
- 예외에는 두 가지 종류가 있다.
- 일반 예외(Exception)
- 컴파일 체크 예외라고도 한다.
- 자바 소스를 컴파일하는 과정에서 예외 처리 코드가 필요하는지 검사함.
- 실행 예외(Runtime Exception)
- 일반 예외(Exception)
- 자바에서는 예외를 클래스로 관리한다.
- JVM은 프로그램을 실행하는 도중에 예외가 발생하면 해당 예외 클래스로 객체를 생성해 이용하도록 한다.
- 모든 예외 클래스는 Exception 클래스를 상속 받는다.
- 일반 예외: Exception을 상속받지만 RuntimeException을 상속받지 않는다.
- 실행 예외: RuntimeException을 상속받는다.
Runtime Exception
- Runtime Exception은 자바 컴파일러가 체크하지 않기 때문에, 개발자가 직접 예외 처리 코드를 작성해야 한다.
- NullPointerException
- 객체 참조가 없는 상태
- null 값을 갖는 참조 변수로 객체 접근 연산자인 '.'를 사용했을 때 발생한다.
String data = null;
System.out.println(data.toString()); // NullPointerException 발생
- ArrayIndexOutOfBoundsException
- 배열에서 인덱스 범위를 초과하여 사용할 경우 발생한다.
- NumberFormatException
- 문자열로 되어 있는 데이터를 숫자로 변경하는 경우가 있다.
- 예: Integer.parseInt(String s), Double.parseDouble(String s)
- 이때, 숫자로 변환될 수 없는 문자가 포함되어 있다면 NumberFormatException 에러가 발생한다.
- 문자열로 되어 있는 데이터를 숫자로 변경하는 경우가 있다.
- ClassCastException
- 타입 변환(Casting)은 [상위 클래스-하위 클래스], [인터페이스-구현 클래스]관계에서 가능하다.
- 이러한 관계가 아닌데 타입 변환을 시도하는 경우 ClassCastException이 발생한다.
- instanceof를 이용해 true인 경우만 캐스팅하자!
* case1: casting 가능
Animal animal = new Dog();
Dog dog = (Dog) animal;
* case2: casting 불가
Animal animal = new Dog();
animal instanceof cat // false
Cat cat = (Cat) animal; // ClassCastException 발생
예외 처리
- try-catch-finall 블록을 이용해서 예외처리를 해준다.
try {
// 예외 발생 가능한 코드
} catch (예외 클래스 e) {
// 예외 처리
} catch (예외 클래스 e) {
// 예외 처리
} finally {
// 항상 실행되는 코드
}
- try 블록에서 예외 발생 없이 코드가 정상 실행되면 catch 블록은 실행되지 않고 finally 블록으로 넘어가게 된다.
- finally 블록은 옵션으로 생략 가능하다.
- catch문은 1개 이상 작성할 수 있다.
- try 블록 내부에서 다양한 종류의 예외가 발생할 수 있는데, 이 경우, 발생되는 예외 별로 catch 문을 작성할 수 있다.
- 다중 catch 블록을 작성할 경우, 상위 예외 클래스가 하위 예외 클래스보다 아래쪽에 위치해야 한다.
- catch 블록은 위에서부터 차례대로 검색되기 때문
- try 블록에서 다양한 종류의 예외가 발생할 수 있지만, 따로따로 처리해주고 싶지 않은 경우, 하나의 catch문에서 한 번에 처리해줄 수 있다.
try {
// 예외 발생 가능한 코드
} catch (예외 클래스1 e1 | 예외 클래스2 e2) {
// 예외 처리
}
자동 리소스 닫기
- try-with-resources를 사용하면 예외 발생 여부와 상관없이 사용했던 리소스 객체를 close해준다.
- 리소스 객체: 데이터를 읽고 쓰는 객체(각종 입출력 스트림, 서버 소켓, 소켓, 각종 채널)
- try-with-resources 사용 조건: java.lang.AutoCloseable 인터페이스를 구현하고 있어야 한다.
- AutoCloseable에는 close() 메서드가 정의되어 있다.
public class FileInputStream implements AutoCloseable {
// ...
}
try {
fis = new FileInputStream("file.txt");
} catch (IOException e) {
}
- FileInputStream의 close()를 호출하는 코드를 작성하지 않았지만, 자동으로 close() 메서드를 호출한다.
Throw Exception
- 메서드 내부에서 try-catch 블록으로 예외를 처리하는 것 대신, 경우에 따라서 메서드를 호출한 곳으로 예외를 떠넘길 수도 있다.
public void method1() {
try {
method2();
} catch (ClassNofFoundException e) {
// 예외 처리
}
}
public void method2() throws ClassNotFoundException {
Class c = Class.forName("java.lang.String2");
}
- method2()에서 예외가 발생 (가능)하지만, 자신을 호출한 method1()에게 예외를 떠넘겨 method1()이 예외 처리하도록 한다.
사용자 정의 예외
- 사용자 정의 예외 클래스 선언
public class CustomException extends RuntimeException // 또는 Exception
public CustomException() {}
public CustomException(String msg) {
super(msg);
}
}
- 예외 발생시키기
public void method1() throws CustomException {
// ...
}
예외 정보 얻기
- 모든 예외 객체는 Exception 클래스를 상속받기 때문에, Exception이 가지는 메서드를 모든 예외 객체에서 호출할 수 있다.
- getMessage()
- 예외를 발생시킬 때 메시지를 갖는 생성자를 이용했다면, 메시지는 자동적으로 예외 객체 내부에 저장된다.
- 예: throw new CustomException("예외 메시지");
- 예외.getMessage()를 하는 경우 예외가 가지고 있는 Message를 얻을 수 있다.
- 예외를 발생시킬 때 메시지를 갖는 생성자를 이용했다면, 메시지는 자동적으로 예외 객체 내부에 저장된다.
- printStackTrace()
- 예외 발생 코드를 추적해서 모두 콘솔에 출력한다.
- 예외 발생 경로를 알 수 있다.
출처:
- [이것이 자바다]
반응형
'Programming Language > Java' 카테고리의 다른 글
[Java] 멀티 스레드 - 우선순위 설정 / 동기화 (0) | 2021.05.03 |
---|---|
[Java] 코드 내에서 File 실행 권한 주기 (0) | 2021.04.26 |
[Java] 익명 객체(Anonymous Object) (0) | 2021.04.20 |
[Java] 중첩 클래스와 중첩 인터페이스 (0) | 2021.04.19 |
[Java] static vs final vs static final (0) | 2021.04.16 |
Comments