본문 바로가기
[즐거운 자바 강좌] 정리

[즐거운 자바 강좌] 섹션6 - 주석문 & 예외문(Exception)

by haeyoon 2024. 4. 2.

1. 주석문

JavaDoc주석문에는 annotaion 사용

[코드]

/**
 * 책 한권의 정보를 담기 위한 클래스
 *
 * @author urstory(<a href="mailto:urstory@gmail.com">김성박</a>)
 * since 2022.03
 * version 0.1
 */

public class Book { ... }

 


2. 예외문(Exception)

 

Error와 Exception

= 비정상적으로 프로그램을 종료되게 하는 원인

- Error: 수습할 수 없는 심각한 오류

     · 컴파일 에러: 컴파일시 발생하는 에러

     · 런타임 에러: 실행시 발생하는 에러

- Exception: 예외처리를 통해 수습할 수 있는 덜 심각한 오류

 

[코드]

public class Exception1 {
    public static void main(String[] args) {
        ExceptionObj1 exobj = new ExceptionObj1();
        int value = exobj.divide(10,0);
        System.out.println(value);
    }
}

class ExceptionObj1{
    public int divide(int i, int k){
        int value = 0;
        value = i/k;
        return value;
    }
}

Exception in thread "main" java.lang.ArithmeticException: / by zero

value = i/k; 에서 오류 발생 → 10/0은 불가능하기 때문

 

1) 예외 처리하기 (try-catch)

try{
	코드1
    코드2
    ......
} catch(Exception클래스명1 변수명1){
		Exception을 처리하는 코드
} catch(Exception클래스명1 변수명1){
		Exception을 처리하는 코드
}

[코드]

public class Exception1 {
    public static void main(String[] args) {
        ExceptionObj1 exobj = new ExceptionObj1();
        int value = exobj.divide(10,0);
        System.out.println(value);
    }
}

class ExceptionObj1{
    public int divide(int i, int k){
        int value = 0;
        try {
            value = i / k;
        }catch(ArithmeticException ex){
            System.out.println("0으로 나눌수 없어요.");
            System.out.println(ex.toString());
        }
        return value;
    }
}

출력

문제점: 10/0은 0이아닌데 결국 기본 value값인 0이 출력 → 틀린 값이 return됐으므로 더 큰 문제 발생

 

 

2) 예외 떠넘기기(throws)

리턴타입 메소드면 (아규먼트 리스트) throws Exception클래스명1, Exception클래스명2 ...{
	코드1
    코드2
    .....
}

[코드]

public class Exception1 {
    public static void main(String[] args) {
        ExceptionObj1 exobj = new ExceptionObj1();
        try {
            int value = exobj.divide(10, 0);
            System.out.println(value);
        }catch (ArithmeticException ex){
            System.out.println("0으로 만들 수 없습니다.");
            //해당 경우에는 value가 사용되지 않음
        }
    }
}
public class ExceptionObj1 {
    /**
     * i를 k로 나눈 나머지를 반환한다.
     * @param i
     * @param k
     * @return
     * @throws ArithmeticException
     */
    public int divide(int i, int k) throws ArithmeticException{
        int value = 0;
        value = i / k;
        return value;
    }
}

 

출력:

 

 

RuntimeException과 CheckedException

 - RuntimeException: 실행시 오류가 나 에러가 발생하는 것

                                 = RuntimeException라는 클래스를 상속받고있다.

 - CheckedException: CheckedException RuntimeException라는 클래스를 상속받지 않는것

                                 = Exception을 상속받고 있다.

[코드1]

import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class Exception4 {
    public static void main(String[] args) {
        try{
            FileInputStream fis = new FileInputStream("Exception4.java");
        }catch(FileNotFoundException fnfe){
            System.out.println("파일을 찾을수가 없어요.");
        }
    }
}

[코드2]

import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class Exception4 {
    public static void main(String[] args) throws FileNotFoundException {

        FileInputStream fis = new FileInputStream("Exception4.java");

    }
}

Exception만들때는 RuntimeException을 상속받는 클래스를 만드는 것이 좋음

 

3) 다중Exception 처리

public class Exception6 {
    public static void main(String[] args) {
        int[] array = {4,0};
        int[] value = null;
        try{
            value[0] = array[0]/array[1];
        }catch(ArrayIndexOutOfBoundsException aiob){
            System.out.println(aiob.toString());
        }catch(ArithmeticException ae){
            System.out.println(ae.toString());
        }catch(Exception ex){
            System.out.println(ex);
        }
    }
}

→  java.lang.ArithmeticException: / by zero

public class Exception6 {
    public static void main(String[] args) {
        int[] array = {4,2};
        int[] value = null;
        try{
            value[0] = array[0]/array[1];
        }catch(ArrayIndexOutOfBoundsException aiob){
            System.out.println(aiob.toString());
        }catch(ArithmeticException ae){
            System.out.println(ae.toString());
        }catch(Exception ex){
            System.out.println(ex);
        }
    }
}

→  java.lang.NullPointerException: Cannot store to int array because "value" is null

public class Exception6 {
    public static void main(String[] args) {
        int[] array = {4};
        int[] value = new int[1];
        try{
            value[0] = array[0]/array[1];
        }catch(ArrayIndexOutOfBoundsException aiob){
            System.out.println(aiob.toString());
        }catch(ArithmeticException ae){
            System.out.println(ae.toString());
        }catch(Exception ex){
            System.out.println(ex);
        }
    }
}

→  java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1

public class Exception6 {
    public static void main(String[] args) {
        int[] array = {4,2};
        int[] value = new int[1]; //방1개자리 배열
        try{
            value[0] = array[0]/array[1];
        }catch(ArrayIndexOutOfBoundsException aiob){
            System.out.println(aiob.toString());
        }catch(ArithmeticException ae){
            System.out.println(ae.toString());
        }catch(Exception ex){
            System.out.println(ex);
        }
    }
}

→  에러가 발생하지 않는다

 

4) 사용자 정의 Exception

public class MyException extends RuntimeException{
    //오류 메세지나, 발생한 Exception을 감싼 결과로 내가 만든 Exception을 사용하고 싶을 때가 많다.

    public MyException(String message) {
        super(message);
    }

    public MyException(Throwable cause) {
        super(cause);
    }
}
public class Exception7 {
    public static void main(String[] args) {
        try{
            ExceptionObj7 exobj = new ExceptionObj7();
            int value = exobj.divide(10,0);
            System.out.println(value);
        }catch(MyException ex){
            System.out.println("사용자 정의 Exception이 발생했네요.");
        }
    }
}
class ExceptionObj7{
    public int divide(int i, int k) throws MyException{
        int value = 0;
        try{
            value = i/k;
        }catch(ArithmeticException ae){
            throw new MyException("0으로 나눌 수 없습니다.");
        }
        return value;
    }
}