-
221215 자바8. 예외처리스타터스 백엔드 3기 2022. 12. 15. 11:35
하루입니다.
복습 !!!
인터페이스
- 참조형변수이고 stack주소 - heap에 실제값이 있다.
- 객체 생성 불가능하다.
- 목적은 다중상속을 통해 여러가지 객체를 표준화시키는 것이다.
- 기본적으로 abstract public 메소드 + public final static 변수를 사용한다.
- jdk 1.8버전에서 public default, public static 메소드를 가진다.
- default 메소드 : 오버라이딩 해도 되고, 바로 써도 된다.
- static 메소드 : 정적, 오버라이딩 금지
- 자식이 메소드 오버라이딩하면 modifier public으로 줘야 한다.
- 자식이 상속받는 변수는 final static이므로 변수값 수정 금지이다.
내부클래스 / 내부인터페이스
포함 이유 : 내부클래스를 현재 자신 클래스 내부에서만 사용하려고 사용을 제한하는 것이다.

익명클래스
- 상속한 상위클래스 / 구현한 인터페이스가 있어야 한다.

상속 관계를 명확하게 하기 위해 이런 방식으로 만들었다. 
익명 클래스로 이름 없이 바로 만들 수 있다.
8장. 예외처리
- 오류란 프로그램을 작성하고 실행하는 과정에서 생기는 오동작이다.
- 견고한 프로그램은 항상 일정한 동작을 보장해야 한다.
- @Override시, 부모클래스의 throws 예외보다 더 많거나 다른 종류의 예외를 throws 하는 것은 불가하다.
컴파일오류
- 문법 / 구문 / systax 오류
- 빨간 줄 뜬다.
- 자바 소스를 수정할 때까지 계속 발생한다.
실행오류
- 실행 조건에 따라 발생한다. ==> 프로그래밍적 해결 없다.
- 컴퓨터 전원이 나간다, 메모리가 부족하다 ==> 프로그래밍적 해결 없다.
프로그래머가 해결할 수 있는 실행오류 : 예외 = execption
- int i = 100/0; 이라거나
- String arr[] = new String[i] i = -1; 전달되는 경우
자바의 모든 예외는 execption의 자식이다.

- XXXException은 반드시 오류 처리 구문이 있어야 한다.
- RuntimeException을 상속받은 클래스는 오류 처리가 자유이다.
try catch의 수행과정

try catch finally의 수행과정

- 나중에 파일, 디렉토리, db, 네트워크를 사용해 개발할 것이다. .
- 이를 컴퓨터 자원이라고 한다.
- 만약 윈도우에서 자원 사용하는 프로그램이 하나도 없는 상태에서, 자바프로그램 파일 오픈을 허락하는데, 자바프로그램의 읽기/쓰기를 수행한 후, 윈도우 파일을 close(); 해야 한다.
FileReader fr= bnew FileReader("a.txt");
fr.read(); => 만약 여기서 에러가 발생할 경우, 실행이 중단되어 close();가 되지 않는다.
다른 파일들이 이 기능을 사용하지 못한다. 메모리 누수가 발생한다.
...
fr.close(); => 이 기능은 반드시 실행되어야 하고, 그래서 finally 블록 안에 들어가야 한다.
Multiple markers at this line
- Resource leak: 'fr' is never closed
- Unhandled exception type FileNotFoundException
직접처리 : try catch finally
간접처리 : 예외발생한 메소드의 외부 다른 메소드에서 처리하는 것 throws
throw와 throws
throws
- m1() 메소드를 실행하다가 예외가 발생하면 다른 곳으로 떠넘기겠다. 전달하겠다.
- 자신을 호출한 곳 (calling method)로 떠넘긴다.
- 메소드 선언부에 선언한다.
- AriException는 10/0일때, NumFormatException는 10/백 이런 경우에 발생하는 예외이다.
- 장점은 예외 처리의 다형성을 가질 수 있다.
void method1 (int i, String j) throws ArithmeticExceptionNumber, NumberFormatException {
System.out.println( 10/i );
System.out.println( 10/Integer.parseInt(j));
}void method2() {
try {
m1( 0, "10" ); ArithmeticExceptionNumber 발생
m1( 10, "100" );
m1( 20, "백" ); NumberFormatException 발생
} catch (ArithmeticExceptionNumber e) {
... 예외처리문장 123123
} catch (NumberFormatException e) {
... 예외처리문장 123123
}
}void method3() {
try {
m1( 0, "50" );
} catch (ArithmeticExceptionNumber e) {
... 예외처리문장 987987
} finally {
실행할 문장
}
}throw
- 의도적으로 예외를 발생시키겠다.
- 메소드 구현부에 선언한다.
- throw new ArithmeticExceptionNumber();
- 예외를 발생시킬 조건식, 발생시킬 예외 종류도 정해야한다.
- 이때까지 예외처리에 대해서는 잘 몰랐는데 배우다보니 calling method가 중요하다는 생각을 했다.
- a메소드가 throw로 예외를 넘기면 b든 c든 오류 잘 받아서 예외처리하면 되는 거니까 ... 그러면서 다형성도 생기는 거고
- 어제 웰컴백 선생님이 자꾸 calling method 얘기하셔서 대체 먼 소리인가 했는데 이제 이해간다
- 아 그리고 예외 발생하는 순간 코드가 calling method로 넘어가는 것도 유념해야겠다 자꾸 깜빡함
package chap8; class Test2 { void m1(int i) throws NumberFormatException{ if (i <= 0) { throw new NumberFormatException("자연수만 가능합니다."); //매개변수 i <= 0이면 예외를 강제로 throw 발생시킨다. //발생한 NumberFormatException 예외는 calling 메소드로 throws 된다. } // ,,, 소수 찾는 로직 ... } } public class ThrowTest { public static void main(String[] args) { try { Test2 t2 = new Test2(); t2.m1(-13); //i가 0보다 작기에 예외가 발생했다. //mi();의 예외가 넘어왔고, 처리해야 한다. //예외가 발생해서 try를 중단하고 catch로 이동한다. //그래서 t2.m1(13); 실행되지 않는다. t2.m1(13); } catch(NumberFormatException e) { // 위에서 보낸 NumberFormatException catch System.out.println("음수"); e.printStackTrace(); // throw의 자연수만 가능합니다 받음 System.out.println(e.getMessage()); } } }
class Exce extends Exception {
Exce(String message) {
super(message);
}
}class A {
void m (int i) throws Exce {
if (i <= 0) {
throw new Exce("메세지");
}
}
}class Test {
main(String[] args) {
try {
new A().m(0);
} catch(Exception e) {
syso(e.Exception );
e.printStackTrace();
}
}
}사용자 정의 예외처리
package chap8; // 이 예외클래스는 checked예외라 반드시 예외처리 해야 한다. class MyException extends Exception{ int error_code; MyException(String message, int error_code) { super(message); // 부모에게 있다. this.error_code = error_code; } public int getError_code() { return error_code; } } class Subject { void search (String input) throws MyException { String[] names = {"spring", "jsp", "servlet", "java"}; boolean isSearch = false; for(int i = 0; i < names.length; i++) { if(names[i].equals(input)) { isSearch = true; return; } } // input 변수와 names 중 하나가 일치하면 "수강신청되셨습니다" // input 변수와 names 중 하나가 일치하지 않으면 MyException 의도적 발생 if(isSearch == false) { throw new MyException(input + "과정은 개설 전입니다.", 404); } } } public class MyExceptionTest { public static void main(String[] args) { try { new Subject().search("jsp"); System.out.println("수강신청되셨습니다"); } catch (MyException e) { System.out.println(e.getError_code() + ":" + e.getMessage()); } } }
CheckedTest ClassInformationTest ExceptionTest MyExceptionTest ThrowsTest ThrowTest
'스타터스 백엔드 3기' 카테고리의 다른 글
유데미 스타터스 취업 부트캠프 3기 - 백엔드 4주차 (0) 2022.12.16 221215. 자바9. 라이브러리(String, Object) (0) 2022.12.15 자바의 내부클래스와 익명클래스의 이해 (0) 2022.12.14 221214 자바 7. 인터페이스, 내부클래스, 익명클래스, (0) 2022.12.14 221210. 자바5 (클래스 형변환) (0) 2022.12.13