try { |
public void divide() {
try {
System.out.print("계산결과는 ");
System.out.print(this.left/this.right);
System.out.print(" 입니다.");
} catch(Exception e) {
System.out.println("오류가 발생했습니다 : " + e.getMessage());
}
}
- getMessage( ) : 에러의 원인을 간단하게 출력
- toString( ) : 에러의 예외에 대한 내용과 원인을 출력
- printStackTrace( ) : 에러의 발생지를 찾아서 단계별로 에러를 출력
System.out.println(e.getMessage());
System.out.println(e.toString());
e.printStackTrace();
- try 안에서 예외가 발생하면 남아있는 try 구문은 건너뛰고, 바로 catch가 발생
- 같은 try 구문에서 다양한 예외가 발생할 수 있음
try {
System.out.println(arr[first] / arr[second]);
} catch(ArrayIndexOutOfBoundsException e){
System.out.println("ArrayIndexOutOfBoundsException");
} catch(ArithmeticException e){
System.out.println("ArithmeticException");
System.out.println("Exception");
}
try { |
- throws : 다음 사용자에게 예외를 전가
class B {
void run() throws IOException, FileNotFoundException {
...
}
}
class C {
void run() {
B b = new B();
try {
b.run();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// 예외를 c.run()에게 전가
}
}
class B {
void run() throws IOException, FileNotFoundException {
// IOException에 FileNotFound가 포함되어 있기 때문에, FileNotFound는 지워도 됨
...
}
}
class C {
void run() throws IOException, FileNotFoundException {
B b = new B();
b.run();
}
public class ThrowExceptionDemo {
public static void main(String[] args) {
C c = new C();
try {
c.run();
} catch (FileNotFoundException e) {
System.out.println("out.txt 파일은 설정 파일입니다. 이 파일이 프로젝트 루트 디렉토리에 존재해야 합니다.");
// out.txt 파일을 찾을 수 없는 상황은 B.run() 입장에서 처리할 수 없는 일이고, 애플리케이션 사용자가 처리할 수 있는 문제기 때문에 애플리케이션의 진입점인 main 메소드에게 전가
} catch (IOException e) {
e.printStackTrace();
}
// 예외를 main 메소드에게 전가
}
}
- IllegalArgumentException : 매개변수가 의도하지 않은 상황을 유발시킬 때
- IllegalStateException : 메소드를 호출하기 위한 상태가 아닐 때
- NullPointerException : 매개 변수 값이 null 일 때
- IndexOutOfBoundsException : 인덱스 매개 변수 값이 범위를 벗어날 때
- ArithmeticException : 산술적인 연산에 오류가 있을 때
import java.io.IOException;
class E {
void throwArithmeticException() {
throw new ArithmeticException();
}
void throwIOException(){
throw new IOException();
// 발생한 예외에 대해서 특별한 처리를 하지 않아서 에러가 발생
// try-catch 구문을 정의하거나, 이 API를 사용하는 사용자에게 throw
}
}
- getMessage( ), printStackTrace( ), toString( ) 메소드들은
exception 클래스들의 공통된 조상인 throwable 클래스에 기본적으로 정의가 되어 있음 - exception의 취지에 따라 다양한 형태의 상속 구조를 가짐
- throwable 클래스는 공통적인 인터페이스를 제공함
- throwable 클래스의 하위 클래스만
예외의 정보를 담고 있는 클래스로 인스턴스화 되어 throw 될 수 있음
try {
System.out.println(arr[first / arr[second]);
} catch(ArrayIndexOutOfBoundsException e) {
System.out.println("ArrayIndexOutOfBoundsException");
} catch(ArithmeticException e) {
System.out.println("ArithmeticException");
} catch(Exception e) {
System.out.println("Exception");
}
// Exception e가 제일 상위 클래스이기 때문에, 마지막에 위치함
- Error에는 메무리 부족 등이 포함되고, 이는 하드웨어 업그레이드 등으로 해결해야 함
- RuntimeException의 하위 클래스가 아니면, 반드시 try-catch 구문을 정의하거나 throws로 예외를 전가해야 함
(RuntimeException의 하위 클래스이면, uncheckedException) - "표준 예외" : 자바가 기본적으로 제공하는 예외
- 예외를 만들 때는 checked인지 unchecked인지 정해야 함
"checked"
- 예외가 발생했을 때, API의 사용자가 예외 상황에서 프로그램적으로 복구할 수 있는 경우
(즉, 상황을 개선할 수 있는 경우) - ex) NoFileFoundException
- API를 사용하는 쪽에서 예외처리를 하도록 강제함
- 상위 클래스에 RuntimeException이 있으면 안됨
"unchecked"
- 상황을 개선할 수 없거나, 프로그램을 종료시키는게 나을 경우
- ex) ArithmeticException
- 상위 클래스에 RuntimeException이 있어야 함
class DivideException extends Exception { // 에러
// Exception은 checkedException이므로 try-catch 구문을 정의하거나 throws로 예외를 전가해야 하기 때문에 에러가 발생함
// DivideException extends ArithmeticException은 에러가 발생하지 않음
DivideException() {
super();
}
DivideException(String message) {
super(message);
}
}
class Calculator {
int left, right;
public void setOperands(int left, int right) {
this.left = left;
this.right = right;
}
public void divide() {
if(right == 0) {
throw new DivideException("0으로 나눌 수 없습니다.");
}
System.out.print(this.left/this.right);
}
}
'onYouTube > Java' 카테고리의 다른 글
상수와 enum (0) | 2021.03.27 |
---|---|
Object 클래스 (0) | 2021.03.26 |
다형성 (Polymorphism) (0) | 2021.03.24 |
인터페이스 (Interface) (0) | 2021.03.24 |
final (0) | 2021.03.24 |