Introduction
- Exception : 런타임 에러 , 프로그램 실행 중 발생하는 문제
- Exception handling : 실행 중 발생한 에러를 해결하여 프로그램이 계속해서 실행될 수 있도록 예외를 처리하는 것
2. Exception handling Examples
- ArrayIndexOutOfBoundsException : 배열의 범위를 넘어선 요소에 접근하려고 하는 경우 발생
- ClassCastException : 객체 데이터 타입 변환이 적절하지 않은 경우 발생
- NullPointerException : 널 값을 참조한 경우 발생
3. Application without Exception Handling (Example)
import java.util.InputMismatchException;
import java.util.Scanner;
public class DivideByZero {
// demonstrates throwing an exception when a divide-by-zero occurs
public static int quotient(int numerator, int denominator) {
return numerator / denominator; // possible division by zero
} // end method quotient
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); // scanner for input
int numerator = 0, denominator = 0, result = -1;
System.out.print("Please enter an integer numerator: ");
numerator = scanner.nextInt();
System.out.print("Please enter an integer denominator: ");
denominator = sxcanner.nextInt();
result = quotient(numerator, denominator);
System.out.printf("\nResult: %d / %d = %d\n", numerator, denominator,
result);
} // end main
} // end class DivideByZeroNoExceptionHandling
- quotient에 들어갈 인풋을 0으로 입력한 경우 Aritchmetic Exception 발생
- 프로그램은 인풋으로 int를 기대하는데 문자를 입력한 경우 inputMismatchException 발생 -> 실행 중단
4. Catch Exception Machanisim
try block
- 예외를 발생시킬 수 있는 코드를 enclose
- 예외가 발생하면 해당 코드를 실행하지 않는 구간
catch block
- = exception handler, catch clause
- 예외를 처리하는 구간
- try 구간에서 에러가 발생하면 실행되는 구간
finally block
- catch 블록 다음에 오는 구간
- try 구간의 에러 발생 여부와 상관없이 무조건 실행되는 구간
- try에서 에러 발생하면 catch 구간 실행하고 finally 블럭을 실행하고
- try 구간에서 에러가 발생하지 않으면 catch구간을 실행하지 않고 finally 구간을 실행함
Notes
- try, catch, finally 각 블럭에서 선언한 변수는 각 블럭 내부에서만 사용할 수 있음
4.1 Application with Exception Handling (Example)
// Handling ArithmeticExceptions and InputMismatchExceptions.
import java.io.IOException;
import java.util.InputMismatchException;
import java.util.Scanner;
public class DivideByZeroWithExceptionHandling
{
// demonstrates throwing an exception when a divide-by-zero occurs
public static int quotient( int numerator, int denominator )
throws ArithmeticException
{
return numerator / denominator;
} // end method quotient
public static void main( String[] args )
{
Scanner scanner = new Scanner( System.in ); // scanner for input
boolean continueLoop = true; // determines if more input is needed
do
{
try // read two numbers and calculate quotient
{
System.out.print( "Please enter an integer numerator: " );
int numerator = scanner.nextInt();
System.out.print( "Please enter an integer denominator: " );
int denominator = scanner.nextInt();
int result = quotient( numerator, denominator );
System.out.printf( "\nResult: %d / %d = %d\n", numerator,
denominator, result );
continueLoop = false; // input successful; end looping
} // end try
catch ( Exception var )
{
System.out.printf( "\nException: %s\n", var );
scanner.nextLine();
System.out.println(
"\n Please try again.\n" );
} // end catch
finally{
System.out.print("\nthis is final\n");
}
} while ( continueLoop ); // end do...while
} // end main
} // end class DivideByZeroWithExceptionHandling
- quotient 함수는 ArithmeticException을 유발할 가능성이 높기 때문에 처리
- try에 quotient 함수와 scanner 부분을 넣고
- 에러가 발생한 경우 catch 부분을 실행 -> scanner retry
- finally 부분은 에러 발생 여부와 상관없이 항상 실행됨
- do-while 을 사용해서 continueLoop 변수로 input이 성공적으로 수행되면 false로 바꿔 while loop 탈출
- input으로 에러가 발생하지 않으면 while loop 탈출해서 소프트웨어 종료
- throws ArithmeticException: 해당 종류의 에러가 발생할 수 있음을 알림
5. Uncaught exception When to Use Exception Handling?
- 예외 처리는 동기적 에러를 처리하도록 설계됨 (비동기 X)
- ex) 디스크 입출력 완료, 네트워크 메시지 도착, 마우스 클릭 또는 키보드 방해 등의 비동기적 이벤트는 예외 처리가 어려움
6. Exception Hierarchy
- Exception 클래스는 Exception 클래스를 직, 간접적으로 상속
- unchecked exception : try catch 구문 없이도 throws할 수 있는 예외 - runtimeException 클래스, 모든 하위 클래스
- check exception: 반드시 try catch 구문을 사용해서 처리해야 하는 예외
6.1 사용자 정의 예외
7. Multi-catch in Java SE 7
import java.io.IOException;
import java.util.Scanner;
public class UsingExceptions {
public static void main(String[] args) {
int a;
Scanner input = new Scanner(System.in);
a = input.nextInt();
try {
if (a > 10) {
// generate some error if the number is more than 10
throw new testingExc("number is more than 10");
}
else {
throw new RuntimeException("number is less than 10");
}
} catch (testingExc |RuntimeException e) {
e.printStackTrace();
}
} // end main
}
//user defined exception
class testingExc extends Exception {
public testingExc(String message) {
super(message);
}
}
- testingExc : 사용자 정의 예외
- throws textingExc -> try-catch 구문으로 처리
- try
- 변수 a를 입력 받는데 이때 10을 초과하는 값을 입력하면 testingExc 예외 발생
- 예외가 발생하면 catch 구문으로 점프해서 printStackTrace()
- testingExc e = 예외 이름 전달
- super(message): 메시지를 RuntimeException 예외 클래스로 보냄
- try 구문 내부에 if-else 구문으로 멀티 예외 처리 가능 throw testingExc and RuntimeException
- catch 구문에서 testinExc | RuntimeException e 로 받아서 printStackTrace()
8. Assertions
- example
// Checking with assert that a value is within range.
import java.util.Scanner;
public class AssertTest
{
public static void main( String[] args )
{
Scanner input = new Scanner( System.in );
System.out.print( "Enter a number between 0 and 10: " );
int number = input.nextInt();
// assert that the value is >= 0 and <= 10
assert ( number >= 0 && number <= 10 ) : "bad number: " + number;
System.out.printf( "You entered %d\n", number );
} // end main
} // end class AssertTest
- code running command
$ javac AssertTest.java
$ java -ea AssertTest
-ea option: 자바 컴파일 시 , assertion을 가능하게 하는 옵션
References
- 성균관대학교 소프트웨어학과 타메르 교수님 2021-1 <자바 프로그래밍 실습> 수업
'프로그래밍 언어 > Java' 카테고리의 다른 글
Week11) Java Programming Lab : File I/O (0) | 2021.05.05 |
---|---|
Week10) Java Programming Lab : Multithreading (0) | 2021.04.30 |
Week8) Java Programming Lab : More on Grapical User Interface (GUI) (0) | 2021.04.12 |
Week7) Java Programming Lab : Grapical User Interface (GUI) AWT and Swing APIs (0) | 2021.04.05 |
Java programming 자바 프로그래밍 실습 : 다형성 polymorphism 추상 클래스 interface을 활용한 예제 (0) | 2021.04.05 |