*모든 실습은 eclipse에서 진행되고 있습니다.
- 오류(Error): 피할 수 없는 경우
- Ex) 문법 오류로 인해 컴파일 오류, 메모리 부족, 정전 등
public class ExceptionApp {
public static void main(String[] args) {
System.out.println(1);
int[] scores = {10, 20, 30};
try {
System.out.println(2);
System.out.println(scores[3]);
//ArrayIndexOutOfBoundsException
// 여기까지 실행 ->
// catch(ArrayIndexOutOfBoundsException e)문으로 이동
System.out.println(3);
System.out.println(2/0); //ArithmeticException
System.out.println(4);
} catch(ArithmeticException e) {
System.out.println("잘못된 계산이네요.");
} catch(ArrayIndexOutOfBoundsException e) {
System.out.println("없는 값을 찾고 계시네요~");
}
System.out.println(5);
}
}
//1
//2
//없는 값을 찾고 계시네요~
//5
public class ExceptionApp {
public static void main(String[] args) {
System.out.println(1);
int[] scores = {10,20,30};
try {
System.out.println(2);
System.out.println(3);
System.out.println(2/0);
System.out.println(4);
} catch(ArithmeticException e) {
System.out.println("잘못된 계산이네용!!!!!"+e.getMessage());
e.printStackTrace();
}
System.out.println(5);
}
}
//1
//2
//3
//잘못된 계산이네용!!!!!/ by zero 0으로 나눈 것이 잘못되었다고 한다.
//java.lang.ArithmeticException: / by zero
// at ExceptionApp.main(ExceptionApp.java:11)
//5
- RuntimeException으로 부터 상속된 예외 말고 모두
- Throwable-Exception -RuntimeException 부터 상속된 모든 예외
- 이는 컴파일 시는 발생하지 않고 실행 도중에 발생한 예외이다.
import java.io.FileWriter;
import java.io.IOException;
public class CheckedExceptionApp {
public static void main(String[] args) {
FileWriter f =null;
try {
f =new FileWriter("data.txt");
f.write("Hello");
//close() 하기 전에 예외 발생하면 close가 실행되지 않음
} catch(IOException e) {
e.printStackTrace();
} finally { //예외가 발생해도 무조건 finally는 실행된다.
//만약에 f가 null이 아니라면
if (f != null) {
try {
f.close();
} catch(IOException e) {
e.printStackTrace();
}
}
}
}
}
import java.io.FileWriter;
import java.io.IOException;
public class TryWithResource {
public static void main(String[] args) {
try (FileWriter f = new FileWriter("data.txt")) {
f.write("Hello");
} catch (IOException e) {
e.printStackTrace();
}
}
} //close() 없이도 자동으로 종료된다.
public class MyException {
public static void main(String[] args) {
throw new RuntimeException("런타임 문제가 있습니다.");
}
public static void main(String[] args) {
throw new Exception("뭔가 문제가 있습니다.");
}
}
import java.io.IOException;
public class ThrowException {
public static void error() throws IOException {
throw new IOException("입출력 오류가 error 메소드에서 나왔습니다.");
}
public static void main(String[] args) {
ThrowException sample =new ThrowException();
try{
ThrowException.error();
} catch (IOException e) {
System.out.println("입출력 오류가 main으로 넘어왔습니다.");
}
}
}
//나쁜예
상품발송() {
포장();
영수증발행();
발송();
}
포장(){
try {
...
}catch(예외) {
포장취소();
}
}
영수증발행() {
try {
...
}catch(예외) {
영수증발행취소();
}
}
발송() {
try {
...
}catch(예외) {
발송취소();
}
}
//좋은 예
상품발송() {
try {
포장();
영수증발행();
발송();
}catch(예외) {
모두취소(); // 하나라도 실패하면 모두 취소한다.
}
}
포장() throws 예외 {
...
}
영수증발행() throws 예외 {
...
}
발송() throws 예외 {
...
}
Reference: