[계산] //결과 //From Samsung printer //This is a report about... // //From LG printer //This is a report about... interface Printable2 { public void print(String doc); } class SPrinterDriver2 implements Printable2 { @Override public void print(String doc) { System.out.println("From LG printer"); System.out.println(doc); } } class LPrinterDriver2 implements Printable2 { @Override public void print(String doc) { System.out.println("From Samsung printer"); System.out.println(doc); } } public class Test52 { public static void main(String[] args) { String myDoc = "This is a report about..."; // 삼성 프린터로 출력 Printable2 prn = new SPrinterDriver2(); prn.print(myDoc); System.out.println(); // LG 프린터로 출력 prn = new LPrinterDriver2(); prn.print(myDoc); } }
[결과값] From LG printer This is a report about... From Samsung printer This is a report about...
단순한 문법 오류가 아닌 실행 중간에 발생하는 '정상적이지 않은 상황'을 뜻한다.
에러 2 가지 종류
콜스택 : JVM이 쌓는다.
실시간 에러처리 메커니즘
1.컴파일 에러
- 주체 : 컴파일 시점에서 발생하는 에러
- 프로그램이 그 자리에서 프로그램을 중단시키고 객체로 표현한다.
2.실시간 에러
- 주체 : JVM
- JVM은 티비의 메인
java.lang.ArithmeticException
→수학 연산에서의 오류 상황을 의미하는 예외 클래스
java.util.InputMismatchException
→클래스 Scanner를 통한 값의 입력에서의 오류 상황을 의미하는 예외 클래스
[계산] import java.util.Scanner; public class Test52 { public static void main(String[] args) { Scanner kb = new Scanner(System.in); System.out.print("a/b... a? "); int n1 = kb.nextInt(); System.out.print("a/b... b? "); int n2 = kb.nextInt(); System.out.printf("%d / %d = %d \n", n1, n2, n1 / n2); System.out.println("Good bye~~!"); } }
[결과값] a/b... a? 10 a/b... b? 5 10 / 5 = 2 Good bye~~! [만약 0으로 나눌 시 에러 발생] a/b... a? 10 a/b... b? 0 Exception in thread "main" java.lang.ArithmeticException: / by zero at Test52.main(Test52.java:13) [만약 정수가 아닌 a를 넣을 시 에러 발생] a/b... a? 10 a/b... b? a Exception in thread "main" java.util.InputMismatchException at java.base/java.util.Scanner.throwFor(Scanner.java:939) at java.base/java.util.Scanner.next(Scanner.java:1594) at java.base/java.util.Scanner.nextInt(Scanner.java:2258) at java.base/java.util.Scanner.nextInt(Scanner.java:2212) at Test52.main(Test52.java:11)
try ~ catch 사용하는 이유
① 안 죽이려고
JVM은 에러가 나오면 그 자리에서 중단시키는 역할인데,
try ~ catch를 사용하면 개발자가 try{}안의 내용에서 에러 발생 시 책임을 지겠다는 것.
try{} : 에러가 발생할 수 있는 코드를 넣는다.
catch{} : 에러 발생 시 catch 안에 넣은 내용으로 출력
finally{} : 정상 실행이든 에러가 나든 무조건 실행 됨.
[계산] import java.util.Scanner; public class Exception2 { public static void main(String[] args) { Scanner kb = new Scanner(System.in); try { System.out.print("a/b... a? "); int n1 = kb.nextInt(); System.out.print("a/b... b? "); int n2 = kb.nextInt(); System.out.printf("%d / %d = %d \n", n1, n2, n1 / n2); } catch (Exception e) { // e 객체 넣는 JVM System.out.println(e.getMessage()); } System.out.println("Good bye~~!"); } }
[결과값] a/b... a? 10 a/b... b? 0 / by zero Good bye~~!
[계산] import java.util.Scanner; public class Exception2 { public static void main(String[] args) { Scanner kb = new Scanner(System.in); try { System.out.print("a/b... a? "); int n1 = kb.nextInt(); System.out.print("a/b... b? "); int n2 = kb.nextInt(); System.out.printf("%d / %d = %d \n", n1, n2, n1 / n2); } catch (Exception e) { // ArithmeticException을 사용해도 되지만, Exception을 사용하는 것이 더 좋다(부모임) System.out.println("메롱"); //e.printStackTrace(); //System.out.println(e.getMessage()); } System.out.println("Good bye~~!"); } }
[결과값] a/b... a? 10 a/b... b? 0 메롱 Good bye~~!
[계산] import java.util.Scanner; public class Exception2 { public static void main(String[] args) { Scanner kb = new Scanner(System.in); try { System.out.print("a/b... a? "); int n1 = kb.nextInt(); System.out.print("a/b... b? "); int n2 = kb.nextInt(); System.out.printf("%d / %d = %d \n", n1, n2, n1 / n2); } catch (Exception e) { // ArithmeticException을 사용해도 되지만, Exception을 사용하는 것이 더 좋다(부모임) System.out.println("메롱"); e.printStackTrace(); System.out.println(e.getMessage()); } finally { // 정상 실행이든 에러가 나든 무조건 실행되어야하는 것은 finally에 집어 넣음 System.out.println("파이널리 실행"); } System.out.println("Good bye~~!"); } }
[결과값] a/b... a? 10 a/b... b? 0 메롱 java.lang.ArithmeticException: / by zero / by zero 파이널리 실행 Good bye~~! at Exception2.main(Exception2.java:14)
[계산] import java.util.Scanner; public class Exception3 { public static void md1(int n) { md2(n, 0); // 이 지점으로 md2로부터 예외가 넘어온다. }
public static void md2(int n1, int n2) {
int r = n1 / n2; // 예외 발생 지점
}
public static void main(String[] args) { try { md1(3); // 이 지점에서 md1으로부터 예외가 넘어온다. } catch (Exception e) { e.printStackTrace(); } System.out.println("Good bye~~!"); }
}
>``` [결과값] java.lang.ArithmeticException: / by zero at Exception3.md2(Exception3.java:10) at Exception3.md1(Exception3.java:6) at Exception3.main(Exception3.java:15) Good bye~~!
[계산] import java.util.Scanner; class Board { } class PBoard extends Board { } public class ClassCastException { public static void main(String[] args) { Board pbd1 = new PBoard(); PBoard pbd2 = (PBoard) pbd1; // Ok! System.out.println("..intermediate location.."); Board ebd1 = new Board(); PBoard ebd2 = (PBoard) ebd1; // Exception! } }
[결과값] ..intermediate location.. Exception in thread "main" java.lang.ClassCastException: class Board cannot be cast to class PBoard (Board and PBoard are in unnamed module of loader 'app') at ClassCastException.main(ClassCastException.java:17)
[계산] import java.util.Scanner; public class NullPointerException { public static void main(String[] args) { String str = null; System.out.println(str); // null 출력 int len = str.length(); // Exception! } } //public void println(String x) { // x = null // synchronized (this) { // print(x); >> F3 조회 // newLine(); // } //} //public void print(String s) { // s = null // write(String.valueOf(s)); //모든 데이터 타입을 String 문자열로 변경 >> F3 조회 //} //public static String valueOf(Object obj) { // obj = null // return (obj == null) ? "null" : obj.toString(); // null일 경우 null을 반환 //}
[결과값] null Exception in thread "main" java.lang.NullPointerException at NullPointerException.main(NullPointerException.java:8)
[계산] class Object { protected double r; public Object(int r) { this.r = r; } public double getArr(double r) { return this.r * this.r * Math.PI; } } class Circle15 extends Object { public Circle15(int r) { super(r); } @Override public String toString() { return "출력: 넓이는 " + super.getArr(r) + "입니다."; } } public class Test52 { public static void main(String[] args) { Object obj = new Circle15(10); System.out.println(obj); } }
[결과값] 출력: 넓이는 314.1592653589793입니다.