본문 바로가기

bitcamp/JAVA

예외처리

1. 에러와 예외의 차이는?

※에러란?

· 시스템에 비정상적인 상황을 말하며, 원인이 로직에서 존재하지 않는다(코딩상의 문제X)

· 코딩상의 문제가 아니며 메모리가 꽉 찼을 떄 등의 문제를 말한다. 
예외란?

· Exception은 개발자가 구현한 로직에서, 실행 도중 발생하는 정상적이지 않은 상황을 말한다.

· 자바의 예외처리 메커니즘은 문제가 발생하는 지점에 대한 정보 출력과 동시에 프로그램을 종료시킨다.

 

 

 2. try-catch 하는 이유?   

· 예외가 발생할 수 있는 구문에 예외처리가 되어 있지 않다면 해당되는 시점부터 실행이 끝나버리지만, 
  try~catch를 통해 예외처리가 되어있다면, jvm이 프로그램을 살리기 위해 해당객체로 넘겨서 해결한다.

 

예외 발생 이후의 실행 흐름
· 아래와 같이 실행순서 1, 2, 3번이 존재하는 상황에서, 2번에서 예외 발생 시 3번은 실행되지 않고 멈춰 예외 처리가 되고 

 4번 위치부터 다시 실행된다. 이 때 4번이 실행되긴 하지만 출력은 되지 않으며 오류 메세지를 전달한다.
· try의 영역을 설정할 때 나눠서 할 것인가 한 번에 할 것인가? 한 번에 묶어 처리할 것!

 

 

3. 예외처리 UML를 그리시오. 외울 것!!

· 예외처리 메커니즘(Try Catch finally)을 제공한다.
· Exception은 코드의 문법적 오류가 아닌, 프로그램 실행 과정에서 발생하는 예외적 상황을 표현하기 위한 클래스들이며,

 RuntimeException을 상속하는 Unchecked Exception와 Checked Exception로 구성된다.

· RuntimeException은 실행중간에 오류가 발생하고, 코드 오류로 발생하는 경우가 대부분이다.

  대표적인 예)

  ArithmeticException: 수학 연산에서의 오류를 의미, InputMismatchException: Scanner를 통한 값입력의 오류를 의미

 

 

4. unchecked와 cheked 예외의 차이는?

· unchecked Exception은 RuntimeException을 상속하고, 명시적인 처리를 강제하지 않는다.
· cheked Exception은 RuntimeException을 상속하지 않고, 반드시 예외 처리가 필요하다.(try~catch)

 

 

5. throws에 대하여 설명하시오. 

· 코드의 문법적 오류가 아닌, 프로그램 실행 과정에서 발생하는 예외처리는 반드시 명시해 주어야 하는데 
  throws절 선언 혹은 try~catch를 사용하여 예외처리를 한다.
· throws 키워드의 선언을 통해 예외 처리를 넘길 수 있으며, 이 때 throws는 함수 단위로 사용된다.

 (메소드 이상으로는 넘길 수 없으므로 throws Exception() 형태의 선언은 불가)

 

 

6. try-catch-finally에 대하여 설명하시오.

· try-catch-finally 예외처리는 try 혹은 catch 부분에서 예외 처리와 상관없이 finally 이후의 구문은 무조건 실행되므로,      반드시 실행되어야 하는 부분은 finally 구문에서 처리한다.

 

 

7. try-with-resource 에 대하여 설명하시오.

· try-catch 예외처리 하는 경우, .close()를 선언하여 안정적으로 try 구문을 빠져나가도록 표기해주어야 한다.

·  try( resource ) 이와 같이, resource에는 객체가 들어가고, 객체에 대한 리소스를 관리해줌으로써 .colse();가 자동으로

  실행되어 try 구문을 빠져나가 다음 문장을 자동 실행시키는 역할을 한다.

 

 

 

8. 아래가 컴파일 에러가 나는 이유에 대하여 설명하시오.


· Exception은 InputMismatchException를 포함하는 상위클래스이므로 자식클래스를 재차 선언할 필요가 없기 때문이다.

 

 

​9. 사칙연산 계산기를 아래의 조건으로 작성하시오.

· 참고: interface를 활용하고, 예외 처리 메커니즘을 적용할 것

 

· 작성

1
2
3
4
5
6
7
public interface ICalculate{
    int add(int x, int y);
    int sub(int x, int y);
    int mul(int x, int y);
    int div(int x, int y);
    int play();
}
cs

 

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
class Calculator implements ICalculate{
    private int x;
    private int y;
    private String oper;
 
    @Override
    public int add(int x, int y) {
        return x + y;
    }    
    @Override
    public int sub(int x, int y) {
        return x - y;
    }
    @Override
    public int mul(int x, int y) {
        return x * y;
    }    
    @Override
    public int div(int x, int y) { 
        return x / y;                
    }    
    @Override
    public int play() {
    Scanner sc = new Scanner(System.in);
    
    while(true) {
        try{
        System.out.println("숫자, 연산자를 입력해주세요.");    
        int x = sc.nextInt();
        String oper = sc.next();
        int y = sc.nextInt();        
        }
        catch(InputMismatchException | ArithmeticException e) {
           System.out.println("다시 입력해주세요.");
        }
        switch(oper) {
          case "+" : 
            System.out.println(add(x, y));    
            break;
          case "-" : 
            System.out.println(sub(x, y));    
            break;
          case "*" : 
            System.out.println(mul(x, y));
            break;
          case "/" : 
            System.out.println(div(x, y));
            break;
         }
       }
     }
 }
cs

 

1
2
3
4
5
6
class Calmain{
     public static void main(String[] args) {
           Calculator cal = new Calculator();
    cal.play();
    }
 }
cs

 

 

10. 다음 필드와 메소드를 가진 4개의 클래스 Add, Sub, Mul, Div를 작성하여라.

· 참고

 

· 작성

1
2
3
4
5
6
7
8
9
10
 abstract class Calculator {
    protected int num1;
    protected int num2;
 
    public void setValue(int num1, int num2) {
        this.num1 = num1;
        this.num2 = num2;
    }
    abstract public int calculate();
 }
cs

 

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
 class Add extends Calculator{
    @Override
    public int calculate() {
        return num1 + num2;
    }
        
 class Sub extends Calculator{
    @Override
    public int calculate() {
        return num1 - num2;
    }
 }
 
 class Mul extends Calculator{
    @Override
    public int calculate() {
        return num1 * num2;
    }
 }
 
 class Div extends Calculator{
    @Override
    public int calculate() {
        return num1 / num2;
    }
  }
}
cs

 

 

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
34
35
36
37
38
 class Calculatormain {
   public static void main(String[] args) {
    Scanner  sc = new Scanner(System.in);
    int result = 0;
    System.out.println("두 정수와 연산자를 입력하시오 >> ");
            
    try {
     int num1 = sc.nextInt();
     int num2 = sc.nextInt();
     char op = sc.next().charAt(0);
        
    Calculator cal = null;
    switch(op) {
    case '+':
       cal = new Add();
       break;
    case '-':
       cal = new Sub();
       break;
    case '*':
       cal = new Mul();
       break;
    case '/':
       cal = new Div();
       break;
    default:
       System.out.println("잘못된 연산입니다. ");
   }
    cal.setValue(num1, num2);
    System.out.println(cal.calculate());
    }
    catch(Exception e) {
      System.out.println("비정상 종료입니다.");
      e.printStackTrace();
    }
    sc.close();
    }
 }
cs