프로그램을 실행했을 때 에러가 니는 경우
예외처리를 하지 않았으면 프로그램이 바로 종료됩니다.
하지만 실제 우리가 프로젝트를 만들때 프로그램이 종료되면 안되기때문에
에러발생해도 프로그램 종료되지 않도록 예외처리를 꼭 해줘야 합니다.
System.out.println("숫자입력: ");
int num = sc.nextInt();
그냥 이렇게만 하면 숫자 대신 문자입력했을 때 InputMismatchException 에러가 납니다.
try-catch 처리하면
System.out.println("숫자입력: ");
try {
int num = sc.nextInt();
} catch (Exception e) {
//에러 발생시 catch 구문으로 이동됨
System.out.println("숫자만 입력해주세요");
}
System.out.println("정상 입력됐습니다");
이렇게 예외처리를 해줌으로써 프로그램 종료를 막을 수 있습니다.
RunTime Exception
은 컴파일 과정에서 체크하지 않기 때문에 실행시 예측할 수 없이 갑자기 발생합니다.
예를 들어 세미콜론 빼먹으면 컴파일과정에서 알수있지만,
숫자입력해야하는데 문자입력해서 생긴 에러는 실행을 해봐야 알수있는데
이런 것을 Runtime Exception이라고 합니다.
public void method3() {
int [] arr = new int[3];
for(int i=0;i<=arr.length;i++) {
System.out.println(arr[i]);
}
}
ArrayIndexOutOfBoundsException (index의 범위를 넘어갔다는 에러)가 난 것을 확인할 수 있습니다
for문에서 i<=arr.length를 했기 때문
에러를 처리하기 위해서는 맨 위 Exception1.java:61 을 봐야하는데
그곳을 클릭하면 실제 에러난 곳의 위치로 이동하게 됩니다.
그 부분을 try-catch로 예외처리하면
public void method3() {
int [] arr = new int[3];
try {
for(int i=0;i<=arr.length;i++) {
System.out.println(arr[i]);
}
} catch (Exception e) {
System.out.println("배열 범위를 벗어남");
}
}
프로그램이 종료되지 않습니다.
public void method1() {
int[] arr = {1,2,0};
System.out.println("배열 번호 입력");
int num= sc.nextInt();
int result = 10/arr[num];
}
ArrayIndexOutOfBoundsException 에러 남
(배열범위 벗어남)
ArithmeticException 에러 남
(나누기 0)
public void method1() {
int[] arr = {1,2,0};
System.out.println("배열 번호 입력");
try {
int num= sc.nextInt();
int result = 10/arr[num];
}
catch (Exception e) {
e.printStackTrace(); // 프로그램 종료 x
}
System.out.println("실행");
}
e.printStrackTrace()를 하면 프로그램이 종료되지 않고도 에러를 출력시킬 수 있습니다.
여러 에러들을 처리하기 위해 catch구문을 여러개 할 수도 있습니다.
public void method1() {
int[] arr = {1,2,0};
System.out.println("배열 번호 입력");
try {
int num= sc.nextInt();
int result = 10/arr[num];
}catch (ArrayIndexOutOfBoundsException e) {
System.out.println("배열 범위 벗어남");
}
catch (ArithmeticException e) {
System.out.println("0으로 나눌 수 없다.");
}
catch(Exception e)
{
System.out.println("예외 처리");
}
System.out.println("실행");
}
에러 이름(ArrayIndexOutOfBoundsException, ArithmeticException)을 catch구문에 넣어서
여러 에러를 한번에 처리할 수 있게 해줄 수 있습니다.
Throw Exception
예외 강제로 발생시키기
- 일반 메소드 내부에서 사용
- 사용 형식
throw 예외 클래스 객체명
→ IOException io = new IOException();
ex) throw new Exception();
throw IOException();
왜 throw사용?
해당 메소드에서 에러를 처리할 수 없으면
강제로 에러를 발생시키고 위로 보내버립니다.
그럼 에러를 받은 쪽에서 try-catch로 에러를 처리해줘야합니다.
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
일반 예외 (컴파일 체크 예외)
Try-catch하라고 빨간줄 뜸
RuntimeException과 달리 일반예외는 자바 소스 컴파일 과정에서 해당 예외 처리가 있는지 검사합니다.
일반예외는 exception을 상속받지만 runtimeException을 상속받지 않습니다.
public class Exception4 {
Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
Exception4 obj = new Exception4();
obj.process();
}
public void process() {
getNum();
}
public int getNum() throws Exception {
System.out.println("입력: ");
int num=sc.nextInt();
if(num<0) {
throw new Exception();
}
return num;
}
}
위는 메소드에서 에러 처리를 해주지 않고 그냥 넘겨버려서 빨간줄이 뜨는 겁니다.
따라서 에러를 받은 process에서
try-catch 처리를 해야 정상적으로 실행됩니다.
public class Exception4 {
Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
Exception4 obj = new Exception4();
obj.process();
}
public void process() {
while(true)
{
try {
getNum();
} catch (Exception e) {
System.out.println("0보다 큰 수 입력");
}
}
}
public int getNum() throws Exception {
System.out.println("입력: ");
int num=sc.nextInt();
if(num<0) {
throw new Exception();
}
return num;
}
}
에러 처리를 하는 또다른 방법에는
우리가 Exception을 직접 만들어서 날리는 방법이 있습니다.
import java.util.Scanner;
public class Exception5 {
Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
Exception5 obj = new Exception5();
obj.process();
}
public void process() {
while(true) {
System.out.println("닉네임을 입력하세요");
try {
String nick = inputNick();
break;
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
public String inputNick() {
String result = sc.nextLine();
if(result.length()<2 || result.length() >5)
{
throw new NickNameLengthException();
}
if(result.contains("바보"))
{
throw new NickNameException();
}
return result;
}
}
//runtimeexception 상속받기
//실행했을 때 체크하겠다
class NickNameException extends RuntimeException{
public NickNameException() {
super("부적절한 닉네임");
}
}
class NickNameLengthException extends RuntimeException{
public NickNameLengthException() {
super("닉네임 길이가 2~5글자");
}
}
'자바' 카테고리의 다른 글
hash (0) | 2024.07.26 |
---|---|
date, calendar (0) | 2024.07.25 |
간단한 게시판 예제 (1) | 2024.07.24 |
인터페이스 (2) | 2024.07.24 |
추상 클래스 (0) | 2024.07.23 |