프로그램 오류
프로그램 수행 시 치명적 상황이 발생하여 비정상 종료 상황이 발생한것, 이것을 프로그램 오류
프로그램 오류의 종류
1. 컴파일 에러 - 프로그램의 실행을 막는 소스 상의 문법에러, 소스 구문을 수정하여 해결(대부분 오타)
2. 런타임 에러 - 입력 값이 틀렸거나, 배열의 인덱스 범위를 벗어났거나, 계산식의 오류 등 주로 if문으로 에러 처리
3. 시스템 에러 - 컴퓨터 오작동으로 인한 에러, 소스 구문으로 해결 불가
Checked, Unchecked
Chekced Exception
반드시 예외 처리를 진행해야함 (필수사항)
Unchecked Exception
예외처리 선택사항 안해도 상관없음
RuntimeException
프로그램 실행 시 발생 되는 예외들
UncheckedException이므로 반드시 예외처리 구문을 작성할 필요는 없고,
코드 개선을 통해 처리가능,
예외종류
1.ArraysIndexOutOfBoundsException
배열의 접근에 잘못 된 인덱스 값을 사용하는 예외
int[] arr = new int[5];
배열의 인덱스는 0, 1, 2 ,3, 4 << 총 5개의 공간인데
arr[5] = 10; 이런식으로 작성식
배열접근을 잘못하여 에러발생
2. NullPointerException
참조 변수가 null로 초기화 된 상태에서 메소드를 호출하는 예외
String str = null;
int size = str.length();
이렇게 호출 String 이 null값인데 입력된 값의 수를 확인할때 에러발생
3. ClassCastException
허용할 수 없는 형변환이 진행되는 예외
String str = "1";
Object obj = str;
Integer integer = (Integer)obj;
4. ArithmeticException
나누기 연산할때 0으로 나누었을때 발생하는 예외
System.out.println(0/4);
이런식으로 0으로 나누었을대 발생하는 에러
예외(try-catch) 작성방법
try{
예외가 발생될만한 코드
} catch(발생될 예외 작성 매개변수){
예외발생시 실행할코드
}
Scanner sc = new Scanner(System.in);
System.out.print("숫자 하나 입력 : ");
try {
int num = sc.nextInt();
int result = 10 / num;
System.out.println("result : " + result);
}catch(ArithmeticException e) {
System.out.println("0 입력 불가!");
}catch(InputMismatchException e) {
System.out.println("문자 입력 불가");
}catch(RuntimeException e) {
System.out.println("모든 RuntimeException을 받아주마!");
}catch(Exception e) {
System.out.println("모든 Exception을 받아주마!");
}
catch 블럭은 여러개 사용가능함
result에서 10 / 0 이되는상황이면 첫 catch블럭의 0입력 불가! 실행후 try-catch 빠져나옴
CheckedException 은 대부분 입출력 클래스 사용할때 발생하게된다.
사용자 정의 예외
꼭 지정된 예외가 아니더라도 개발자가 예외를 생성할수있다.
UserException.class
// 1. Exception 상속
// 2. 기본생성자, 매개변수 생성자 1개씩 생성
public class UserException extends Exception{
public UserException(){}
public UserException(String str){
super(str); // 여기에 예외발생될때마다 메세지 개발자가 입력할수있음
}
}
UserExceptionTest.class
public class UserExceptionTest{
// 소문자만 입력 받고 소문자가 아닌 입력이 있을 경우 UserException을 발생 시키는 프로그램
public void method1 () throws UserException {
Scanner sc = new Scanner(System.in);
System.out.print("영문 입력(반드시 소문자만) : ");
String input = sc.nextLine();
for(int i = 0; i < input.length(); i++) {
if(input.charAt(i) < 'a' || input.charAt(i) > 'z') {
// throw : 오류 발생 시키
throw new UserException(input.charAt(i) + "는 소문자가 아닙니다.");
}
}
System.out.println("입력 된 문자 : " + input);
}
}
만약 입력된 영문자중 대문자가 들어오면 throw 구문이용하여 아까생성한 예외 발생처리
throw
코드를 작성하다보면 예외를 발생해야할 때가있을것이다.
그럴때마다 개발자가 임의로 예외를 발생시킬수있다.
throw new 예외이름(); <<이런식으로 작성하면 강제 예외발생
throws
class 옆에적어주는 구문으로
예외가 발생할수있다. 대신 내가처리안하고 나를 호출한 곳으로 예외를 던지겠다.
라는뜻이다.
'프로그래밍 > JAVA' 카테고리의 다른 글
JAVA - I.O(입출력) > 보조 스트림 (0) | 2021.06.04 |
---|---|
JAVA - I.O(입출력) > 기반 스트림 (2) | 2021.06.03 |
JAVA - DATE, Calendar, (0) | 2021.06.02 |
JAVA - String 클래스 (0) | 2021.05.31 |
JAVA - 객체(toString(), equals(), hashCode()) (0) | 2021.05.27 |