Fairy ' s
[JAVA] Exception / try ~ catch 본문
예외처리 Exception
- 코딩을 하며 에러가 나면 적절한 처리를 하고 싶을 때 자바가 제공해주는 문법 (try, catch, throw 등)
Scanner scan=new Scanner(System.in);
System.out.print("숫자 입력:");
//숫자 형식의 문자열을 입력 받는다. "10" "20" "10.1" 등등
String inputNum=scan.nextLine();
double num=Double.parseDouble(inputNum);
//변환한 숫자에 100 을 더하고
double result = num+100;
//더한 결과 값을 출력한다.
System.out.println("입력한 숫자 + 100 :"+result);
- 숫자를 문자열로 입력받아 숫자로 변환하고 변환한 숫자에 100을 더해서 출력하는 코드
- 이 코드를 실행하고 숫자가 아닌 문자를 입력하게 되면 오류가 발생
- try 문 안에서 오류가 발생하면 예외에 해당되는 catch문이 실행되고, 오류가 발생하지 않으면 실행되지 않는다.
- catch문은 여러개 만들 수 있고, finally문은 try 문에서 예외 발생 여부에 관계없이 무조건 실행
Scanner scan=new Scanner(System.in);
System.out.print("숫자 입력:");
//숫자 형식의 문자열을 입력 받는다. "10" "20" "10.1" 등등
String inputNum=scan.nextLine();
try{
double num=Double.parseDouble(inputNum);
//변환한 숫자에 100 을 더하고
double result = num+100;
//더한 결과 값을 출력한다.
System.out.println("입력한 숫자 + 100 :"+result);
} catch(NumberFormatException e) {
e.printStackTrace();
}
- printStackTrace() 메서드는 예외 정보를 콘솔창에 출력해준다.
예제 1
Scanner scan=new Scanner(System.in);
System.out.print("나눌수 입력:");
String inputNum1=scan.nextLine();
System.out.print("나누어 지는 수 입력:");
String inputNum2=scan.nextLine();
//입력한 문자열을 정수로 변환하고
int num1=Integer.parseInt(inputNum1);
int num2=Integer.parseInt(inputNum2);
//num2 를 num1 으로 나눈 몫
int result=num2/num1;
//num2 를 num1 으로 나눈 나머지
int result2=num2%num1;
System.out.println(num2+" 를 "+num1+" 으로 나눈 몫:"+result);
System.out.println(num2+" 를 "+num1+" 으로 나눈 나머지:"+result2);
System.out.println("main 메소드가 정상 종료됩니다.");
- 위 코드에서 숫자가 아닌 것과 0을 나눌 수에 입력하게 되면 예외가 발생합니다.
- 0으로 나눌 경우 ArithmeticException 발생
- 숫자가 아닌 경우 NumberFormatException
Scanner scan=new Scanner(System.in);
System.out.print("나눌수 입력 : ");
String inputNum1=scan.nextLine();
System.out.print("나누어 지는 수 입력 : ");
String inputNum2=scan.nextLine();
try {
//입력한 문자열을 정수로 변환하고
int num1=Integer.parseInt(inputNum1);
int num2=Integer.parseInt(inputNum2);
//num2 를 num1 으로 나눈 몫
int result=num2/num1;
//num2 를 num1 으로 나눈 나머지
int result2=num2%num1;
System.out.println(num2+" 를 "+num1+" 으로 나눈 몫:"+result);
System.out.println(num2+" 를 "+num1+" 으로 나눈 나머지:"+result2);
System.out.println("작업 성공입니다.");
}catch(NumberFormatException nfe) {
nfe.printStackTrace();
}catch(ArithmeticException ae) {
ae.printStackTrace();
}finally { //예외가 발생 하던 안하던 실행이 보장되는 블럭
System.out.println("무언가 마무리 작업을 합니다.");
}
System.out.println("main 메소드가 정상 종료됩니다.");
- 발생한 예외 오류에 try catch 처리로 예외 발생 여부에 관계 없이 마무리 작업을 한다는 내용 출력
- 오류가 발생해도 finally 구문을 정상처리 되는 것을 볼 수 있다.
예제 2 / 직접 예외 발생 시키기
// SleepException 클래스 생성
public class SleepyException extends Exception{
//예외 메세지를 생성자의 인자로 전달받아서 부모 생성자에 전달하기
public SleepyException(String msg) {
super(msg);
}
}
- SleepException 클래스에 Exception을 상속해 준다.
- Exception 말고도 RuntimeException 을 상속받을 수 있다.
Exception / RuntimeException
- Exception을 상속받으면 반드시 try ~ catch 로 묶어 주어야 한다.
- RuntimeException을 상속받으면 try ~ catch 로 묶어 주지 않아도 오류가 나지 않는다. 필요 시 사용
public class test {
public static void study() throws SleepyException {
Random ran = new Random();
int ranNum = ran.nextInt(3);
if(ranNum==0) {
throw new SleepyException("너무 졸려서 공부를 할 수가 없어요!");
}
System.out.println("열심히 공부합니다!!");
}
public static void main(String args[]) {
System.out.println("main 메소드가 시작되었습니다.");
try {
test.study();
} catch (SleepyException e) {
e.printStackTrace();
}
}
}
- 0 ~ 3 까지 랜덤한 숫자가 나오게 하고 나온 숫자가 0이면 졸려서 공부를 할 수 없다는 예외 발생
- main 메서드에서 try catch 문을 통해 test.study() 함수를 실행시키고 예외가 발생하면 어떠한 예외가 발생했는지 표시
'Study > JAVA' 카테고리의 다른 글
[JAVA] Thread ? (0) | 2023.01.12 |
---|---|
[JAVA] 입출력스트림 (0) | 2023.01.11 |
[JAVA] Wrapper Class ? (0) | 2023.01.11 |
[JAVA] Generics Class ? (0) | 2023.01.10 |
[JAVA] ArrayList ? (0) | 2023.01.10 |
Comments