개발 수업/JAVA

[Java] 예외처리/예외클래스

오늘 하루s 2023. 5. 31. 19:14
728x90
더보기

Day23-1. 230531

예외처리/예외클래스

예외와 예외 클래스

예외 : 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류.

예외가 발생되면 프로그램이 곧바로 종료된다는 점에서 에러와 비슷하지만 예외 처리를 통해 프로그램을 종료하지 않고 정상 실행 상태가 유지되도록 할 수 있다.

 

- 일반 예외

컴파일 체크 예외.

프로그램 실행 시 예외가 발생할 가능성이 높기 때문에 자바 소스를 컴파일 하는 과정에서 해당 예외 처리 코드가 있는지 검사. 예외 처리 없다면 컴파일 오류 발생.

 

- 실행 예외

컴파일 넌 체크 예외.

실행 시 예측할 수 없이 갑자기 발생하기 때문에 컴파일 하는 과정에서 예외 처리 코드가 있는지 검사하지 않음.

 

 

실행 예외

자바 컴파일러가 체크하지 않기 떄문에 오로지 개발자의 경험에 의해서 예외 처리 코드를 작성해야 함. 만약 개발자가 실행 예외에 대해 예외 처리 코드를 넣지 않을 경우, 해당 예외가 발생하면 프로그램은 곧바로 종료.

 

NullPointerException

객체 참조가 없는 상태. 즉 null 값을 갖는 참조 변수로 객체 접근 연산자인 도트(.)를 사용했을 떄 발생. 객체가 없는 상태에서 객체를 사용하려해서 예외 발생.

 

ArrayIndexOutOfBoundsException

배열에서 인덱스 범위를 초과할 경우 발생.

예) 길이가 3인 int[] arr = new int[3] 배열을 선언했다면 arr[0]~arr[2] 사용 가능하나 arr[3]을 사용하면 인덱스 범위 초과했기 때문에 ArrayIndexOutOfBoundsException 발생.

 

NumberFormatException

문자열로 되어있는 데이터를 숫자로 변경할 때 메소드를 사용해 문자열이 숫자로 변환 될 수 있다면 숫자를 리턴, 숫자로 변환 될수 없는 문자가 포함되어 있다면 NumberFormatException 발생.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package chap10;
 
import java.text.DecimalFormat;
 
public class NumberFomatException {
 
    public static void main(String[] args) {
        String strV1= "123";
        String strV2= "123번지";
        String strV3= "123.9";
        String strV4= "-123.9";
        String strV5= "999,999,999";
        int v1 = Integer.parseInt(strV1);
        //int v2 = Integer.parseInt(strV2); //NumberFormatException
        double v3 = Double.parseDouble(strV3);
        double v4 = Double.parseDouble(strV4);
        //double v7 = Double.parseDouble(strV5); //NumberFormatException(,가 문자여서)
        float v5 = Float.parseFloat(strV3);
        float v6 = Float.parseFloat(strV4);
        
        
        System.out.println("Integer.parseInt(\"123\")="+v1); 
        //System.out.println("Integer.parseInt(\"123번지\")="+v2);
        //System.out.println(Integer.parseInt(strV3)); //NumberFormatException
        //System.out.println(Integer.parseInt(strV4)); //NumberFormatException
        System.out.println(Integer.parseInt("-1")); 
        System.out.println(v3);
        System.out.println(v4); 
        System.out.println(v5); 
        System.out.println(v6);
        //System.out.println(v7); //NumberFormatException
    }
}
cs
더보기

*실행 결과

Integer.parseInt("123")=123
-1
123.9
-123.9
123.9
-123.9

 

ClassCastException

타입 변환은 상위 클래스와 하위 클래스 간에 발생하고 구현 클래스와 인터페이스 간에도 발생. 이러한 관계가 아니라면 클래스는 다른 타입으로 변환 할 수 없기 때문ClassCastException 발생.

 

 

추가> DecimalFormat - 숫자의 형식화

- 숫자를 다양한 형식(패턴)으로 출력할 수 있게 해줌.

 

- 특정 형식으로 되어있는 문자열에서 숫자를 뽑아 낼 수 있음.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package chap10;
 
import java.text.DecimalFormat;
 
public class NumberFomatException {
 
    public static void main(String[] args) {
        double num = 1234567.89;        
        DecimalFormat df1 = new DecimalFormat("0,000,000,000.00000");
        DecimalFormat df2 = new DecimalFormat("#,###,###,###.####");
        String strNum1 = df1.format(num);
        String strNum2 = df2.format(num);
        System.out.println(strNum1);
        System.out.println(strNum2);
    }
}
cs
더보기

* 실행 결과

0,001,234,567.89000
1,234,567.89

 

 

예외 처리

자바 컴파일러는 소스 파일을 컴파일할 때 일반 예외가 발생할 가능성이 있는 코드를 발견하면 컴파일 에러를 발생시켜 개발자가 강제적으로 예외 처리 코드를 작성하도록 요구.

실향 예외는 컴파일러가 체크해주지 않기 때문에 개발자의 경험을 바탕으로 예외 처리 코드를 작성해야함.

 

예외 처리 코드

try-catch-finally 블록

: 생성자 내부와 메소드 내부에서 작성되어 일반 예외와 실행 예외가 발생할 경우 예외 처리를 할 수 있도록 해줌.

 

 

 

예외 떠넘기기

메소드 내부에서 예외가 발생할 수 있는 코드를 작성할 때 try-catch블록으로 예외를 처리하는 것 기본이지만, 경우에 따라서는 메소드를 호출한 곳으로 예외를 떠넘길 수도 있음. 이때 사용하는 것이 throw절.

리턴타입 메소드이름(매개변수,...) throws 예외클래스1, 예외클래스2,...{
}

발생할 수 있는 예외의 종류별로 throws 뒤에 나열하는 것이 일반적이지만 throws Exception만으로 모든 예외를 간단히 떠넘길 수도 있음.

리턴타입 메소드이름(매개변수,..) throws Exception{
}

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package chap10;
 
public class ThrowsMain {
 
    public static void main(String[] args) {
        System.out.println("main()시작");
        try {
            findClass();
        } catch (ClassNotFoundException e) {
            System.out.println("findClass()를 호출한 곳의 catch절-Class");
            e.printStackTrace();
        }
        System.out.println("findClass() 호출후");
    }
    
    public static void findClass() throws ClassNotFoundException {
        System.out.println("findClass() 진입");
        
        Class.forName("java.lang.String123");
        }
        
}
cs
더보기

*실행 결과

main()시작
findClass() 진입
catch절-ClassNotFoundException
java.lang.ClassNotFoundException: java.lang.String123
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at chap10.ThrowsMain_p462.findClass(ThrowsMain_p462.java:30)
at chap10.ThrowsMain_p462.main(ThrowsMain_p462.java:14)
finally안
findClass() 호출후

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package chap10;
 
public class ThrowsMain_p462 {
 
    public static void main(String[] args) throws ClassNotFoundException {
        System.out.println("main()시작");
        try {
            findClass();
        } catch (ClassNotFoundException e) {
            System.out.println("findClass()를 호출한 곳의 catch절-Class");
            e.printStackTrace();
        }
        System.out.println("findClass() 호출후");
    }
    
    public static void findClass() {
        System.out.println("findClass() 진입");
        try {
            Class.forName("java.lang.String2");
        } catch (ClassNotFoundException e) {
            System.out.println("catch절-ClassNotFoundException");
            e.printStackTrace();
            System.out.println(e.getMessage());
        } finally{
            System.out.println("finally안"); //문제 발생하지 않아도 무조건 거쳐감.
        }
        
    }
}
cs
더보기

* 실행 결과

main()시작
findClass() 진입
catch절-ClassNotFoundException
java.lang.String2
finally안
findClass() 호출후
java.lang.ClassNotFoundException: java.lang.String2
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at chap10.ThrowsMain_p462.findClass(ThrowsMain_p462.java:30)
at chap10.ThrowsMain_p462.main(ThrowsMain_p462.java:14)

728x90