컴파일 타임에 확인할 수 있는 예외
Throwable
하위 클래스 중 RuntimeException
을 상속하지 않는 클래스들은 checked exception이다.throws
키워드를 사용하여 예외를 구체화해야 한다.“C:\test\a.txt” 위치의 파일을 열고 첫 3문장을 출력하는 자바 프로그램
import java.io.*;
class Application {
public static void main(String[] args) throws IOException {
FileReader file = new FIleReader("C:\\test\\a.text");
BufferedREader fileInput = new BufferedREader(file);
for (int counter = 0; counter < 3; counter++;) {
System.out.println(fileInput.readLine());
}
fileInput.close();
}
}
readLine()
, close()
: IOExceptionFileReader()
: FileNotFoundException → IOException의 subclass컴파일 타임에 확인되지 않는 예외
Error
나 RuntimeException
클래스 하위 예외들은 unchecked exception이다.컴파일은 잘 되지만 실행(run) 시에 ArithmeticException 발생
class Application {
public static void main(String[] args) {
int x = 0;
int y = 10;
int z = y / x; // divided by 0, mathematically incorrect
}
}
프로그래머가 예외를 강제적으로 발생시키는 방법
throw new SomeException();
호출한 쪽에 예외 처리를 전가하는 방법
public class Application {
public static void main(String[] args) {
Calculator calculator = new Calculator();
try {
calculator.add("1", "ㄱ");
catch (NumberFormatException e) {
System.out.println("입력한 값은 숫자가 아닙니다.");
}
}
}
class Caculator {
public void add(String a, String b) throws numberFormatException {
int sum = Integer.parseInt(a) + Integer.parseInt(b);
System.out.println("합 = " + sum);
}
}
public class Application {
public static void main(String[] args) {
Calculator calculator = new Calculator();
try {
calculator.add("1", "ㄱ");
catch (NumberFormatException e) {
System.out.println("입력한 값은 숫자가 아닙니다.");
}
}
}
class Caculator {
public void add(String a, String b) throws numberFormatException {
try {
int sum = Integer.parseInt(a) + Integer.parseInt(b);
System.out.println("합 = " + sum);
} catch (NumberFormatException e) {
System.out.println("숫자형 문자가 아닙니다. 형 변환을 할 수 없습니다.");
throw e;
}
}
}
final int MAX_RETRY = 100;
public Object retry() {
int maxRetry = MAX_RETRY;
while (maxRetry > 0) {
try {
...
catch (SomeException e) {
maxRetry--;
// 로그 출력
// 정해진 시간만큼 대기
} finally {
// 리소스 반납 및 정리 작업
}
}
throw new RetryFiledException();
}
public void avoid1() throws SQLException {
...
}
public void avoid2() throws SQLException {
try {
...
catch (SQLException e) {
...
throw e;
}
}
// 적합한 의미의 예외를 던지기
public void convert1(User user) throws DuplicateUserIdException, SLQException {
try {
...
catch (SQLException e) {
if (e.getErrorCode() == MysqlErrorNumbers.ER_DUP_ENTRY) {
throw new DuplicateUserIdException();
} else {
throw e;
}
}
}
// 단순 예외 포장
public void convert2() {
try {
...
} catch (NamingException ne) {
throw new EJBException(ne);
} catch (SQLException se) {
throw enw EJBException(se);
catch (RemoteException re) {
throw new EJBException(re);
}
}