문제가 될 만한 부분을 사전에 예상하고 → 문제가 발생하면 이렇게 처리하라고 프로그래밍 하는 것 목적: 실행이 멈추지 않게
에러 - 심각한 것 / 예외 - 미약한 것
컴파일러 에러 (Compile-time Error): 문법적으로 틀린 부분, 컴파일 할 때 발생하는 에러 런타임 에러 (& Runtime Exception, 실행 예외): (컴파일 과정에서) 실행 할 때 일어나는 에러 / 프로그램 종료 논리적 에러(Logical Error): 작성 의도와 다르게 동작 / 프로그램 종료 X
주요 실행 예외
NullPointException (NPE) - null값을 갖는 참조 변수 / dot(.)을 사용했을 때 발생
package day10.exception.trycatch;
import day06.inherit.good.Person;
publicclassRunTimeEx{
publicstaticvoidmain(String[] args){
// 실행예외(runtime)// String s = null;// if(s != null) {// s.charAt(0);// }// ArrayIndexOut// int[] arr = {1, 2, 3};// arr[5] = 10;// ClassCast// Object o = new Object(); // Person p = (Person)o; // Person으로 생성된 객체만 Person으로 캐스팅 가능// NumberFormat// String s = "홍길동";// Integer.parseInt(s); // 숫자로 바꿔주는 기능
}
}
TryCatchEx01
<java />
package day10.exception.trycatch;
publicclassTryCatchEx01{
publicstaticvoidmain(String[] args){
int a = 10;
int b = 0;
System.out.println(a + b);
try {
System.out.println(a / b);
System.out.println("이 문장은 실행이 될까요?"); // 실행 안됨, 위에서 에러 발생시 catch영역으로 바로 넘어감// catch뒤에는 해당 예외를 처리할 수 있는 예외 종류가 들어갑니다.
} catch (Exception e) {
System.out.println("0으로 나눌 수 없습니다");
}
System.out.println(a - b);
}
}
----------------------출력-------------------
100으로 나눌 수 없습니다
10
a+b, a-b의 경우는 예외가 없으므로 그대로 출력
에러, 예외가 생길 것 같은 구문에 try-catch로 예외시 나올 문장(0으로 나눌 수 없습니다.) 출력
try{}의 경우 에러가 발생하는 순간 아래 부분은 실행이 안되고 바로 catch 영역으로 넘어감
TryCatchEx02
<java />
package day10.exception.trycatch;
publicclassTryCatchEx02{
publicstaticvoidmain(String[] args){
String[] arr = {"홍길동", "이순신", "홍길자"};
int i = 0;
while(i < 4) {
try {
System.out.println(arr[i]);
} catch (Exception e) {
System.out.println("범위를 벗어났습니다");
} finally {
System.out.println("이 문장은 예외 여부와 상관없이 항상 실행됨");
}
i++;
}
}
}
---------------------------출력--------------------------
홍길동
이 문장은 예외 여부와 상관없이 항상 실행됨
이순신
이 문장은 예외 여부와 상관없이 항상 실행됨
홍길자
이 문장은 예외 여부와 상관없이 항상 실행됨
범위를 벗어났습니다
이 문장은 예외 여부와 상관없이 항상 실행됨
String[] 배열 타입 arr에 초기화 된 값이 있음
while 반복문으로 i = 0 ~ 3까지 돌면서 배열값이 출력
에러가 발생하면 catch 영역의 범위를 벗어났다는 문구 출력
finally영역은 예외 여부와 상관없이 반복을 돌때마다 출력
MultiCatchEx01 - 복습
<java />
package day10.exception.trycatch;
publicclassMultiCatchEx01{
publicstaticvoidmain(String[] args){
// main의 args 사용방법// run -> run configuration -> argments탭에 -> ${string_prompt}try {
// main 메소드의 String[] args는 사용자가 입력한 값(문자열)을 args(파라미터)에 할당하는 것을 의미
String data1 = args[0];
String data2 = args[1];
int n1 = Integer.parseInt(data1); // String타입의 숫자를 int타입으로 변환int n2 = Integer.parseInt(data2);
System.out.println("두 수의 합: " + (n1 + n2));
String s = null;
s.charAt(0); // string으로 저장된 문자열 중에서 한글자만 선택해서 char타입으로 변환
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("매개값은 2개 입력하세요");
} catch (NumberFormatException e) {
System.out.println("매개값은 숫자로 입력하세요");
} catch (Exception e) { // 어떤 실행 예외든 처리가 가능 (예외의 부모) (클래스의 상속 관계: ctrl + t)
System.out.println("기타 예외 입니다");
}
// System.out.println(args[0]);// System.out.println(args[1]);
}
}
package day10.exception.throws_;
publicclassThrowsEx02{
// 생성자publicThrowsEx02()throws Exception {
System.out.println("생성자호출");
aaa();
System.out.println("생성자종료"); // aaa()가 끝나고 실행
}
publicvoidaaa()throws Exception {
System.out.println("aaa시작");
try {
bbb(1);
} catch (Exception e) {
System.out.println("0으로 나눌 수 없습니다");
}
System.out.println("aaa종료"); // bbb()가 끝나고 실행
}
publicvoidbbb(int i)throws Exception{
System.out.println("bbb시작");
// try {// System.out.println(i / 0); // 예외// } catch (Exception e) { }
System.out.println(i / 0); // 예외
System.out.println("bbb종료");
}
}
// main은 같음
-------------------------호출---------------------
생성자호출
aaa시작
bbb시작
0으로 나눌 수 없습니다
aaa종료
생성자종료
ThrowsEx02 - "생성자호출" - aaa() - "aaa시작" - bbb(1) - "bbb시작"- 예외발생 - main의 "0으로 나눌 수 없습니다"문구 출력 - (bbb는 뒷부분 실행 X) - aaa()안의 bbb(1)실행 후 "aaa종료" - 같은 방식으로 위의 "생성자종료"