ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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

Designed by Tistory.