1. 예외 (Exception)처리
- 예외 : 프로그램 실행도중에 예기치 못하게 발생되는 경미한 에러
- 예외처리 : 예외가 발생되었을때 이에 대한 적절한 처리를 하는것
- 형식
try{
예외가 발생될수 있는 실행문장;
...
} catch(예외타입1 참조변수){
예외가 발생되었을때의 적절한 처리문장;
....
}finally{
예외와 상관없이 무조건 수행해야 할 문장;
...
}
==> 예외가 발생될수 있는 문장을 try{}블록으로 묶고 catch 절에서 예외가 발생되었을때 해당하는 적절한 처리를 한다.
ex>
package test01.exception;
import java.util.Scanner;
public class Test01{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
while(true){
System.out.println("첫번째 수 입력(종료:0)");
int a=scan.nextInt();
if(a==0){
break;
}
System.out.println("두번째 수 입력");
int b=scan.nextInt();
try{
int c=a/b;
System.out.println(a+"/"+b+"="+c);
}catch(ArithmeticException e){
System.out.println("오류메시지:" + e.getMessage());
System.out.println("0으로 나눌수 없습니다.");
continue;
}
}
}
}
ex>
package test01.exception;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Test02{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
System.out.println("1st:");
try{
int n1=scan.nextInt();
System.out.println("2st:");
int n2=scan.nextInt();
int n3=n1/n2;
System.out.println("나누기한 값 "+ n3);
}catch(InputMismatchException ie){
System.out.println("숫자만 입력하세요.");
}catch(ArithmeticException ae){
System.out.println("0으로 나눌수 없습니다.");
}
System.out.println("Exit!!");
}
}
자바의 모든 예외는 Exception의 자식클래스이므로 Exception은 모든 예외를 처리할 수 있다.
catch절에서 Excepion은 모든 예외를 처리할수는 있으나 자식예외보다 먼저 위치할 수는 없다.
ex>
package test01.exception;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Test03{
private static Scanner scan;
public static void main(String[] args) {
scan = new Scanner(System.in);
System.out.println("1st:");
try{
int n1=scan.nextInt();
System.out.println("2st:");
int n2=scan.nextInt();
int n3=n1/n2;
System.out.println("나누기한 값 "+ n3);
// 모든 예외는 Exception타입으로 처리할수 있다.
}catch(InputMismatchException e){
System.out.println("숫자만 입력합니다.");
}catch(Exception ie){
// 부모예외가 반드시 아래에 와야 함.!!
System.out.println(ie.getMessage());
}
System.out.println("Exit!!");
}
}
2. Exception의 종류
- 자바에는 두가지 종류의 익셉션이 있다.
1) Checked Exception
- RuntimeException을 상속받지 않은 예외클래스
- 반드시 try~catch절로 예외처리를 해야 하며 예외처리를 하지 않으면 컴파일시에 오류를 발생시킨다.
예) IOException, FileNoFoundException,...
2) UnChecked Exception
- RuntimeException을 상속받은 예외클래스
- try~catch절로 예외처리를 하지 않아도 컴파일시에 오류가 발생되지 않으며 프로그래머가 선택적으로 try~catch로 처리한다.
예) NumberFormatException, ArithmeticException,...
EX>
package test01.exception;
import java.io.*;
public class Test04{
public static void main(String[] args){
//String a="10 00";
//int n=Integer.parseInt(a);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("keyboard로 부터 숫자를 입력받다.");
//keyboard로 부터 한줄 입력받
try{
String num=br.readLine();
int n1=Integer.parseInt(num);
System.out.println(num);
}catch(IOException ie){
System.out.println(ie.getMessage());
}catch(NumberFormatException e){
System.out.println("숫자만");
}
}
}
3. 예외처리방법
- 자바에서는 예외처리방법이 두가지가 있다.
방법1) 예외가 발생될수 있는 문장을try~catch로 직접 처리
방법2) 자신이 직접 처리하지 않고 throws로 예외를 떠넘기는 방법이 있다.
throws로 떠넘길때는 이를 호출하는 곳에서 try~catch로 처리해야 한다.
ex> 방법 1 예외가 발생될수 있는 문장을try~catch로 직접 처리
package test01.exception;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Test05{
public static void main(String[] args){
String name=input("이름입력");
System.out.println(name);
String phone=input("전화번호입력");
System.out.println(phone);
}
public static String input(String msg){
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println(msg);
String str="";
try{
str=br.readLine();
return str;
}catch(IOException ie){
System.out.println(ie.getMessage());
return null;
}finally{
System.out.println("finally");
}
}
}
ex> 방법 2 throws로 예외를 떠넘기는 방법
package test01.exception;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Test06{
public static void main(String[] args){
try{
String name;
name =input("이름입력");
System.out.println(name);
String phone=input("전화번호입력");
System.out.println(phone);
}catch(IOException ie){
System.out.println(ie.getMessage());
}
}
// 자신이 처리하지 않고 throws로 예외를 넘김.--> 메소드를 호출한 곳에서 try~catch로 처리한다.
public static String input(String msg)throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println(msg);
String str="";
str=br.readLine();
return str;
}
}
ex> 값 2개 입력받아 나눗셈 실행하기.
package test01.exception;
import java.util.Scanner;
public class Test07{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
System.out.println("1st :");
int n1=scan.nextInt();
System.out.println("2st :");
int n2=scan.nextInt();
try{
int n3=div(n1,n2);
System.out.println("나눗셈 한 값 :" + n3);
}catch(ArithmeticException ae){
System.out.println("0으로 나눌수 없습니다.");
}finally{
System.out.println("무조건 실행");
}
System.out.println("Exit!!");
}
public static int div(int n1, int n2) throws ArithmeticException{
int n3=n1/n2;
return n3;
}
}
4. 예외를 강제로 발생시키기
문법적인 오류는 아니더라도 논리적으로 오류가 있을때 예외를 강제로 발생시킬수 있다.
형식> throw 예외객체;
EX> 가로,세로 값으로 넓이 구하기. 강제 예외 발생
package test01.exception;
public class Test08{
public static void main(String[] args){
//사각형 가로,세로
int x=100,y=-200;
try{
//사각형넓이 구하기
int rectArea = area(x,y);
System.out.println("사각형 넓이:" + rectArea);
}catch(Exception e){
System.out.println(e.getMessage());
}
}
public static int area(int x, int y) throws Exception
{
//Exception e=new Exception("가로,세로는 0보다 커야 한다.");
// 논리적으로 잘못된 값이 들어오면
if(x<=0 || y<=0){
//강제로 예외객체 발생.
throw new Exception("가로,세로는 0보다 커야 한다.");
}
int z=x*y;
return z;
}
}
ex> 사용자 예외처리 클래스
package test01.exception;
class RectException extends Exception
{
public RectException(String msg)
{
super(msg);
}
}
public class Test09
{
public static void main(String[] args)
{
// TODO Auto-generated method stub
int a=10, b=-10;
try{
// 논리적으로 잘못된값이 들어온 경우
if(a<=0 || b<=0){
//사용자가 만든 예외객체 생성해서 던지기
throw new RectException("가로,세로 길이는 0보다 크게");
}
}catch(RectException re){
System.out.println(re.getMessage());
return;
}
int area=a*b;
System.out.println("넓이:" + area);
}
}
'JAVA' 카테고리의 다른 글
자바 IO ( Ⅱ ) (0) | 2014.09.12 |
---|---|
자바 IO - Stream ( Ⅰ ) (0) | 2014.09.12 |
Calendar 클래스 (0) | 2014.09.12 |
자료구조 - ArrayList / 제네릭 클래스 / 확정for 문 (0) | 2014.09.12 |
자료구조 - Map (0) | 2014.09.12 |