-
throw, throws / 예외 주기 (2)프로그래밍/JAVA 자바 2021. 7. 29.반응형
package ex0728; public class Ex01_exception { public static void main(String[] args) { // TODO Auto-generated method stub User1 ob = new User1(); try { ob.set("김자바", -5); System.out.println(ob.getName()+":"+ob.getAge()); } catch (Exception e) { System.out.println(e.toString()); } } } class User1 { private String name; private int age; public void set(String name, int age) throws Exception { try { setName(name); setAge(age); } catch (Exception e) { //System.out.println(e.toString()); //throw new Exception("값을 설정하지 못했습니다."); 새로운 예외를 발생 throw e; //예외를 다시 던짐 어디가 문제인지 구분이 된다. } } public String getName() { return name; } public void setName(String name) throws Exception { if(name==null) throw new Exception("이름은 null이 될수없음"); this.name=name; } public int getAge() { return age; } public void setAge(int age) throws Exception { if(age < 0) { throw new Exception("나이는 0살 이상 입니다."); } this.age = age; } }
throw e = 예외를 다시 던진다
즉 setName 메소드와 setAge 메소드 사이에서 문제가 일어난 메소드를 던져준다.
이름이 잘못되었는지 나이가 잘못되었는지 구분할 수 있게 된다.
package ex0728; import java.util.Scanner; public class Ex02_exception { public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc = new Scanner(System.in); User2 ob = new User2(); try { System.out.println("이름 ? "); ob.setName(sc.next()); System.out.println("나이 ? "); ob.setAge(sc.nextInt()); System.out.println(ob.getName() + ":" + ob.getAge()); } catch (Exception e) { System.out.println("입력 오류 입니다."); } finally { sc.close(); } System.out.println("end"); } } class User2 { private String name; private int age; public String getName() { return name; } public void setName(String name) throws Exception { if(name.length() < 2) { throw new Exception("이름은 두글자 이상 입니다."); } this.name = name; } public int getAge() { return age; } public void setAge(int age) throws Exception { if(age < 0) { throw new Exception("나이는 0이상만 가능"); } this.age = age; } }
try catch를 메인에서 잡은 경우
사용자 정의 예외 클래스(checked exception)
package ex0728; import java.util.InputMismatchException; import java.util.Scanner; public class Ex03_exception { public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc = new Scanner(System.in); User3 ob = new User3(); try { System.out.println("이름 ? "); ob.setName(sc.next()); System.out.println("나이 ? "); ob.setAge(sc.nextInt()); System.out.println(ob.getName() + ":" + ob.getAge()); } catch (InputMismatchException e) { System.out.println("숫자만 입력 가능"); } catch (NameValidException e) { System.out.println("이름은 두자 이상만 가능"); } catch (AgeValidException e) { System.out.println("나이는 0 이상"); } catch (Exception e) { //System.out.println("입력 오류 입니다."); e.printStackTrace(); } finally { sc.close(); } System.out.println("end"); } } //사용자 정의 예외 클래스(checked exception) class NameValidException extends Exception { private static final long serialVersionUID = 1L; public NameValidException(String msg) { super(msg); } } class AgeValidException extends Exception { private static final long serialVersionUID = 1L; public AgeValidException(String msg) { super(msg); } } class User3 { private String name; private int age; public String getName() { return name; } public void setName(String name) throws NameValidException { if(name.length() < 2) { throw new NameValidException("이름은 두글자 이상 입니다."); } this.name = name; } public int getAge() { return age; } public void setAge(int age) throws AgeValidException { if(age < 0) { throw new AgeValidException("나이는 0이상만 가능"); } this.age = age; } }
예외를 내가 원하는 걸로 새로 정의할 수 있음.
Exception을 상속 받게 만들어야함
class NameValidException extends Exception {
private static final long serialVersionUID = 1L;
public NameValidException(String msg) {
super(msg);
}
}NameValidException 이름을 가진 새로운 예외를 만드는데
public void setName(String name) throws NameValidException {
if(name.length() < 2) {
throw new NameValidException("이름은 두글자 이상 입니다.");
}
this.name = name;
}이런식으로 사용이 가능함.
그리고 try catch문에서 catch를 잡아줘야함
catch (NameValidException e) {
System.out.println("이름은 두자 이상만 가능");
}두 정수와 연산자를 입력 받아 계산 해주는 프로그램
package ex0728; import java.util.InputMismatchException; import java.util.Scanner; public class Ex04_exception { public static void main(String[] args) { Calculate ob = new Calculate(); ob.calc(); } } class OperatorException extends Exception { private static final long serialVersionUID = 1L; public OperatorException(String msg) { super(msg); } } class Calculate { private Scanner sc = new Scanner(System.in); public void calc() { int a, b; String op; try { System.out.println("첫번째 수"); a = sc.nextInt(); System.out.println("두번째 수"); b = sc.nextInt(); System.out.println("연산자"); op = inputOperator(); String s = null; switch(op) { case "+" : s = String.format("%d+%d=%d", a,b, a+b); break; case "-" : s = String.format("%d-%d=%d", a,b, a-b); break; case "*" : s = String.format("%d*%d=%d", a,b, a*b); break; case "/" : s = String.format("%d/%d=%d", a,b, a/b); break; } System.out.println(s); } catch (ArithmeticException e) { System.out.println("0으로 나누거나 연산이 불가능 하다."); } catch (InputMismatchException e) { System.out.println("두 정수는 숫자만 입력 가능하다."); sc.nextLine(); // a에 문자열 입력 잘못해서 오류로 넘어 왔을때 안에 있던 값을 버리기 위해서 필요함. } catch (OperatorException e) { //System.out.println("연산자 입력 오류"); System.out.println(e.getMessage()); } catch (Exception e) { e.printStackTrace(); } } private String inputOperator() throws OperatorException { String s = null; s = sc.next(); if(! s.matches("(\\+|\\-|\\*|\\/)")) { throw new OperatorException("연산자 입력 오류"); } return s; } }
사용자 정의 예외를 활용한 모습
반응형'프로그래밍 > JAVA 자바' 카테고리의 다른 글
List 인터페이스 (0) 2021.07.30 generic , 제네릭 (0) 2021.07.29 throw / throws (0) 2021.07.29 예외 잡기 (try, catch, finally문) (0) 2021.07.29 중첩 ,내부 ,익명 클래스 (0) 2021.07.28