본문 바로가기

프로그래밍 언어/Java

Week9) Java Programming Lab : Exception Handling

Java-Lecture9.pdf
1.00MB

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 <자바 프로그래밍 실습> 수업