사용자가 겪을 수 있는 오류 2 유형
▷ 컴파일 오류 : 오타, 자료형불일치, 상속관계 불일치
▷ 실행오류
- 에러(치명적인 오류) : 개발자가 해결할 수 없는 오류 ex) 메모리가 부족해서 나오는 오류
- 예외(경미한 오류) : 개발자가 해결할 수 있는 오류 또는 처리할 수 있는 오류
예외는 해결or처리 안해도 되는데, 안하면 프로그램이 죽어버림 이게 문제
※ 예외종류
java.lang.Throwable
:
java.lang.Exception
: : : :
RuntimeException IOException SQLException SocketException
※ RuntimeException의 종류
RuntimeException은 uncheckedException이라고도 부른다.
NullPointerException, ArithmeticException, ArrayIndexOutOfBoundsException, NumberFormatException, ClassCastException 등
: IOException, SQLException, SocketException 이것들은 compile할때 감지되는데(컴파일오류)
RuntimeException는 컴파일러가 감지를 못해서 일단 프로그램 실행하고 정지됨
ExceptionTest.java
※ 예외처리방법
- try~catch~finally
- throws
▷ finally 생략 가능, 예외발생 유무와 관계없이 처리해야하는 구문, 주로 외부자원과 닫는 구문
예외가 발생안하면 try 구문 끝까지 진행하고 finally
예외가 발생하면 그 즉시 catch로 이동하고 finally
catch 없이 try~finally도 사용 가능
- 모양
try {
//예외발생가능코드
} catch(발생가능한 예외종류 e) {
} finally {
}
try {
//NullPointerException 발생가능코드
//ArithmeticException 발생가능코드
} catch(NullPointerException e) {
System.out.println("문제발생!");
} catch(ArithmeticException e) {
System.out.println("문제발생!");
}
// 위의 코드 아래처럼 수정 가능
try {
//NullPointerException 발생가능코드
//ArithmeticException 발생가능코드
} catch(NullPointerException | ArithmeticException e) {
System.out.println("문제발생!");
}
import java.util.Scanner;
public class ExceptionTest {
public static void m(int num) {
System.out.println("99를 " + num + "로 나눈 나머지값은 " + (99%num));
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
m(num);
}
}
import java.util.InputMismatchException;
import java.util.Scanner;
public class ExceptionTest {
public static void m(Object obj) {
try {
String str = obj.toString();
System.out.println("객체정보: "+ str);
} catch(NullPointerException e) {
System.out.println(e.getMessage());
} finally {
System.out.println("finally");
}
}
public static void m(int num) {
// System.out.println("99를 " + num + "로 나눈 나머지값은 " + (99%num)); 밑에 try catch 보낼 때
try {
System.out.println("99를 " + num + "로 나눈 나머지값은 " + (99%num));
} catch(ArithmeticException e) {
String msg = e.getMessage(); //예외 메시지만 받을 수 있다.
System.out.println(msg);
System.out.println("0은 입력하셨습니다");
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("0이 아닌 숫자값을 입력하세요:");
int num;
try {
num = sc.nextInt();
} catch(InputMismatchException e) {
e.printStackTrace();
// System.out.println("숫자값을 입력하세요");
System.out.println("숫자값을 입력하지 않았습니다. 1로 자동설정합니다");
num = 1;
}
/*
try {
m(num);
} catch(ArithmeticException e) {
System.out.println("0은 입력하면 안됩니다");
}
*/
/*
// 모든 예외를 막을 수 없음. 예외가 발생하도록 놔두고 사후 예외처리를 함
if(num == 0) { //예외가 아예 발생하지 않도록 피해가는 작업
System.out.println("0은 입력하면 안됩니다");
return;
}
*/
m(num);
Object o;
o = new Object();
m(o);
o = null;
m(o);
}
}
※ Exception 처리 순서
자식→부모 순으로 해야함. 순서 바뀌면 안된다.
try {
//FileNotFoundException(자식) 발생가능코드
//IOException(부모) 발생가능코드
} catch(FileNotFoundException e) {
System.out.println("문제발생!");
} catch(IOException e) {
System.out.println("문제발생!");
}
public int m( Object o ){
try {
System.out.println(o.toString());
return 1;
} catch(NullPointerException e) {
return 0;
} finally {
System.out.println("finally!");
}
}
▷ throws
throws : 메소드 호출한 곳으로 예외 떠넘기기
public void someMethod() throws IOException {
// 예외 발생 가능성이 있는 코드
}
try-catch : 메소드 내에서 예외 해결, try-catch는 예외가 발생할 수 있는 코드를 감싸는 블록, 예외를 직접 처리하는 용도
try 블록 안에서 예외가 발생하면, 해당 예외와 일치하는 catch 블록이 실행. catch 블록은 예외를 처리하는
코드를 포함.
try {
// 예외 발생 가능성이 있는 코드
} catch (IOException e) {
// 예외 처리 코드
}
throw : 강제예외 발생 ( throws와 다르다)
public void someMethod(int value) {
if (value < 0) {
throw new IllegalArgumentException("value cannot be negative");
}
// 나머지 코드
}
'언어 > Java' 카테고리의 다른 글
NaN과 Infinity (0) | 2023.08.04 |
---|---|
오버플로우와 언더플로우 (0) | 2023.08.04 |
복제(shallow copy, deep copy) (0) | 2023.08.02 |
리플렉션(Reflection) (0) | 2023.08.02 |
GUI프로그램 (0) | 2023.08.02 |