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)
- 위의 내용으로 예외가 발생했을 당시 호출스택에 존재했던 메서드를 알 수 있다.
- 예외가 발생한 위치는 method2 메서드이며, ExceptionEx18.java파일의 12번째 줄이다.
- 발생한 예외는 ArithmeticException이며, 0으로 나누어서 예외가 발생했다.
- 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{}
- void add(int a, int b) throws InvalidNumberException, NotNumberException{}
- void add(int a, int b) throws InvalidNumberException{}
- void add(int a, int b) throws NotANumberException{}
- void add(int a, int b) throws Exception{}
- 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{}
- try {method();} catch(Exception e) {}
- try {method();} catch(NumberException e) {} catch(Exception e){}
- try {method();} catch(Exception e) {} catch(NumberException e) {}
- try {method();} catch(InvalidNumberException e) {} catch(NotANumberException){}
- try {method();} catch(NumberException e) {}
- 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
'예전 포스팅 모음' 카테고리의 다른 글
[java] 예외처리(Exception Handling) (0) | 2014.09.22 |
---|---|
[DB] select 예제, golden tool 사용법, 문자열 연산자, drop, sqlldr(sqlloader)의 사용 (0) | 2014.09.22 |
[java] 자바의 정석 연습문제 ch07 (0) | 2014.09.19 |
[java] 자바의 정석 연습문제 ch05 (0) | 2014.09.19 |
[java] 자바의 정석 연습문제 ch04 (0) | 2014.09.19 |