[java] 자바의 정석 연습문제 ch08

8-1. 예외처리의 정의와 목적에 대해서 설명하시오.

- 정의 : 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드를 작성하는 것

목적 : 프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것




8-2. 다음은 실행도중 예외가 발생하여 화면에 출력된 내용이다. 이에 대한 설명 중 옳지 않은 것은?

java.lang.ArithmeticException : / by zero

at ExceptionEx18.method2(ExceptionEx18.java:12)

at ExceptionEx18.method1(ExceptionEx18.java:8)

at ExceptionEx18.main(ExceptionEx18.java:4)

 

  1. 위의 내용으로 예외가 발생했을 당시 호출스택에 존재했던 메서드를 알 수 있다.
  2. 예외가 발생한 위치는 method2 메서드이며, ExceptionEx18.java파일의 12번째 줄이다.
  3. 발생한 예외는 ArithmeticException이며, 0으로 나누어서 예외가 발생했다.
  4. method2메서드가 method1메서드를 호출하였고 그 위치는 ExceptionEx18.java파일의 8번째 줄이다.




8-3. 다음 중 오버라이딩이 잘못된 것은? (모두 고르시오)

void add(int a, int b)

throws InvalidNumberException, NotANumberException{}

class NumberException extends Exception{}

class InvalidNumberException extends NumberException{}

class NotNumberException extends NumberException{}

 

  1. void add(int a, int b) throws InvalidNumberException, NotNumberException{}
  2. void add(int a, int b) throws InvalidNumberException{}
  3. void add(int a, int b) throws NotANumberException{}
  4. void add(int a, int b) throws Exception{}
  5. void add(int a, int b) throws NumberException{}

- 오버라이딩(overiding)을 할 때, 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.




8-4. 다음과 같은 메서드가 있을 때, 예외를 잘못 처리한 것은? (모두 고르시오)

void method() throws InvalidNumberException, NotANumberException{}

class NumberException extends RuntimeException{}

class InvalidNumberException extends NumberException{}

class NotANumberException extends NumberException{}

 

  1. try {method();} catch(Exception e) {}
  2. try {method();} catch(NumberException e) {} catch(Exception e){}
  3. try {method();} catch(Exception e) {} catch(NumberException e) {}
  4. try {method();} catch(InvalidNumberException e) {} catch(NotANumberException){}
  5. try {method();} catch(NumberException e) {}
  6. try {method();} catch(RuntimeException e) {}

- try블럭 내에서 예외가 발생하면, catch블럭 중에서 예외를 처리할 수 있는 것을을 차례대로 찾아 내려간다. 발생한 예외의 종류와 일치하는 catch블럭이 있으면 그 블럭의 문장들을 수행하고 try-catch문을 빠져나간다. 일치하는 catch블럭이 없으면 예외는 처리되지 않는다. 발생한 예외의 종류와 일치하는 catch블럭을 찾을 때, instanceof로 검사를 하기 때문에 모든 예외의 최고조상인 Exception이 선언된 catch블럭은 모든 예외를 다 처리할 수 있다. 한 가지 주의할 점은 Exception을 처리하는 catch블럭은 모든 catch블럭 중 제일 마지막에 있어야 한다는 것이다.




8-5. 아래의 코드가 수행되었을 때의 실행 결과를 적으시오.

--------------------------------------------------------------------------------------------------

public class ch08 {

static void method(boolean b){

try {

System.out.println(1);

if(b) throw new ArithmeticException();

System.out.println(2);

} catch (RuntimeException r) {

System.out.println(3);

return;

} catch (Exception e) {

System.out.println(4);

return;

} finally{

System.out.println(5);

}

System.out.println(6);

}

public static void main(String[] args) {

method(true);

method(false);

}

}

--------------------------------------------------------------------------------------------------

1

3

5

1

2

5

6





8-6. 아래의 코드가 수행되었을 때의 실행 결과를 적으시오.

--------------------------------------------------------------------------------------------------

public class ch08 {

static void method1(){

try {

method2();

System.out.println(1);

} catch (ArithmeticException e) {

System.out.println(2);

} finally{

System.out.println(3);

}

System.out.println(4);

}

static void method2(){

throw new NullPointerException();

}

public static void main(String[] args) {

try {

method2();

} catch (Exception e) {

System.out.println(5);

}

}

}

--------------------------------------------------------------------------------------------------

5




8-7. 아래의 코드가 수행되었을 때의 실행 결과를 적으시오.

--------------------------------------------------------------------------------------------------

public class ch08 {

static void method(boolean b){

try {

System.out.println(1);

if(b) System.exit(0);

System.out.println(2);

} catch (RuntimeException r) {

System.out.println(3);

return;

} catch (Exception e) {

System.out.println(4);

return;

} finally{

System.out.println(5);

}

System.out.println(6);

}

public static void main(String[] args) {

method(true);

method(false);

}

}

--------------------------------------------------------------------------------------------------

1




8-8. 다음은 1~100사이의 숫자를 맞추는 게임을 실행하던 도중에 숫자가 아닌 영문자를 넣어서 발생한 예외이다. 예외처리를 해서 숫자가 아닌 값을 입력했을 때는 다시 입력을 받도록 보완하라.

--------------------------------------------------------------------------------------------------

public class ch08 {

public static void main(String[] args) {

int answer = (int)(Math.random()*100)+1;

int input = 0;

int count = 0;

 

do{

count++;

System.out.print("1과 100사이의 값을 입력하세요 :");

try{

input = new Scanner(System.in).nextInt();

 

if(answer > input){

System.out.println("더 큰 수를 입력하세요.");

}else if(answer < input){

System.out.println("더 작은 수를 입력하세요.");

}else{

System.out.println("맞췄습니다.");

System.out.println("시도횟수는 "+count+"번입니다.");

break;

}

} catch(InputMismatchException e){

System.out.println("유효하지 않은 값입니다. 다시 값을 입력해주세요.");

}

}while(true);

}

}

 

--------------------------------------------------------------------------------------------------




8-9. 다음과 같은 조건의 예외클래스를 작성하고 테스트하시오.

[참고] 생성자는 실행결과를 보고 알맞게 작성해야한다.

- 클래스명 : UnsupportedFuctionException

- 조상클래스명 : RuntimeException

- 멤버변수

이름 : ERR_CODE

저장값 : 에러코드

타입 : int

기본값 : 100

제어자 : final private

- 메서드

1. 메서드명 : getErrorCode

기능 : 에러코드(ERR_CODE)를 반환한다.

반환타입 : int

매개변수 : 없음

제어자 : public

2. 메서드명 : getMessage

기능 : 메세지의 내용을 반환한다. (Exception클래스의 getMessage()를 오버라이딩)

반환타입 : String

매개변수 : 없음

제어자 : public

--------------------------------------------------------------------------------------------------

class UnsupportedFuctionException extends RuntimeException{

final private int ERR_CODE;

private String msg;

 

public UnsupportedFuctionException(String msg, int code) {

this.msg = msg;

ERR_CODE = code;

}

 

public int getErrorCode(){

return ERR_CODE;

}

public String getMessage(){

return "["+getErrorCode()+"]"+msg;

}

}

 

public class ch08 extends Exception{

public static void main(String[] args) {

throw new UnsupportedFuctionException("지원하지 않는 기능입니다.",100);

}

}

--------------------------------------------------------------------------------------------------




8-10. 아래의 코드가 수행되었을 때의 실행결과를 적으시오.

--------------------------------------------------------------------------------------------------

public class ch08 {

static void method1() throws Exception{

try {

method2();

System.out.println(1);

} catch (NullPointerException e) {

System.out.println(2);

throw e;

} catch (Exception e) {

System.out.println(3);

} finally {

System.out.println(4);

}

System.out.println(5);

}

static void method2(){

throw new NullPointerException();

}

public static void main(String[] args) {

try {

method1();

System.out.println(6);

} catch (Exception e) {

System.out.println(7);

}

}

}

--------------------------------------------------------------------------------------------------

2

4

 

7