강좌 & 팁
- 자바는 프로그램 실행 중 예외나 오류가 발생할 경우 정상적인 실행과정과 분리하여 처리한다.
→ Exception 클래스, Error 클래스가 있으며 이는 Throwable 클래스의 서브 클래스이다.
→ Exception 클래스의 경우 파일의 끝을 지나서 읽기를 시도하거나, 배열의 색인이 범위를 넘은 경우 등이다.
-> RuntimeException
-> IOException
→ Error 클래스는 메모리 부족, 정의되지 않은 클래스 등을 말한다.
- 예외 객체의 생성은 JAVA 가상머신이 생성한다.
→ 예외 객체는 예외를 처리하는 부분으로 던진다.(throw)
→ 예외를 처리하는 부분은 이 객체를 포함(catch)하여 적절하게 처리한다.
- Error 클래스의 오류
→ IOException 클래스 예외는 반드시 프로그램내에서 처리되어야 한다.
→ 예외를 처리하지 않으면 컴파일 오류가 발생
→ 일단 throws로 마구잡이로 던진다.(IOException)
- try문의 형식과 실행
→ try에서 에러가 발생하면 자동으로 catch()로 점프(해당하는 Exciption을 찾는다.)
→ catch(예외 클래스 이름 예외 변수)
→ finally는 try문의 실행이 끝나기 전에 반드시 처리된다.
import java.io.*;
public class AddTwoNumber
{
public static void main(String[] args) throws IOException
{
int aNum = NumberClass.readInteger("Enter the first integer : ");
int bNum = NumberClass.readInteger("\nEnter the second integer : ");
System.out.println("The sum of two number is " + (aNum + bNum));
}
}
class NumberClass
{
// NumberClass 객체 생성 없이 메소드가 호출되므로 static으로 설정
public static int readInteger(String prompt)
{
BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
int num = 0;
boolean getANum = false;
while(!getANum)
{
System.out.print(prompt);
System.out.flush(); // 강제 출력
try
{
num = Integer.parseInt(stdin.readLine());
getANum = true;
}
// 정수형이 아닌 입력으로 인한 에러가 들어온다면
catch(NumberFormatException exp)
{
System.out.println("Not an Integer. Enter an Integer/");
}
// 키보드 입력으로 인한 에러가 들어온다면(포괄적)
// if ~ else문처럼 순서에 따른 프로그램 실행이 달라질 수 있다.
catch(IOException exp)
{
System.out.println("Problem in I/O. Execution terminated!!.");
System.exit(0);
} // end of try
} // end of while
return num;
} // end of readInteger()
} // end of NumberClass
→ 실행결과
→ public static int readInteger (String prompt)
-> NumberClass 객체의 생성없이 메소드가 호출됨으로 static으로 설정되었다.
→ try문 내에 두개의 catch 블럭이 정의되었다.
→ catch (NumberFormatException exp)
-> parseInt() 메소드가 인수로 받은 문자열을 정수로 변환시킬 때, 인수가 정수를 나타내는 문자열이 아니면 NumberFormat Exception 클래스의 예외가 발생 이를 처리하는 catch 블럭은 오류메세지를 출력하고 try문의 실행을 끝낸다.
-> 프로그램의 제어는 while문의 처음으로 돌아간다.
→ catch (IOException exp)
-> readLine() 메소드가 키보드로부터 입력을 받는 도중에 문제가 발생하여 IOException 오류가 발사될 때 처리하는 catch 블럭이다. catch 블럭에서 오류메세지를 출력하고 프로그램을 종료시킨다.