기초JAVA 17강 - 예외처리

Whatever·2021년 10월 1일
0

기초 JAVA

목록 보기
17/26

에러

  • 컴파일 에러 : 컴파일 시에 발생되는 에러(빨간줄)
  • 논리적 에러 : 실행은 되지만, 의도와 다르게 동작하는 것(버그)
  • 런타임 에러 : 실행 시에 발생되는 에러

런타임 에러

  • 런타임 에러 발생시 발생한 위치에서 프로그램이 비정상적으로 종료된다.
  • 에러 : 프로그램 코드에 의해 수습될 수 없는 심각한 오류(처리 불가)
  • 예외 : 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류(처리 가능)

예외

  • 모든 예외는 Exception 클래스의 자식 클래스이다.
  • RuntimeException 클래스와 그 자식들은 예외처리가 강제되지 않는다.
  • [RuntimeException 클래스와 그 자식들을 제외한]
    Exception 클래스의 자식들은 예외처리가 강제된다.예외처리(try-catch)
  • 예외처리를 통해 프로그램이 비정상적으로 종료되는 것을 방지할 수 있다.
  • try {} catch(Exception e) {}
  • try 블럭 안의 내용을 실행 중 예외가 발생하면 catch로 넘어간다.
  • catch의 ()안에는 처리할 예외를 지정해줄 수 있다.
  • 여러 종류의 예외를 처리할 수 있도록 catch는 하나 이상 올 수 있다.
  • 발생한 예외와 일치하는 catch 블럭안의 내용이 수행된 후 try-catch를 빠져나간다.
  • 발생한 예외의 일치하는 catch가 없는 경우 예외는 처리되지 않는다.
try{
            int result = 10 / 0;
            System.out.println(result);//예외가 발생하면 예외의 객체가 생성됨
        }catch(ArithmeticException | IndexOutOfBoundsException e){
        //그 객체의 파라미터가 실행되는 것  |로 이어주면 두 개의 예외 처리 가능
            e.printStackTrace();//콘솔 창에 아까 발생했던 예외가 나타남
        }catch(NullPointerException e){

	}catch(Exception e){//모든 예외클래스의 부모클래스를 넣음 
               - 모든 예외를 하나로 처리할 수 있다(다형성)
		e.printStackTrace();
	}
	
	try {
		Thread.sleep(1);
	} catch (InterruptedException e) {
		e.printStackTrace();//Ctrl + 1 : 도움말 
        - 예외가 났을 때 빨간줄 위에서 단축키 -> try + catch 나오면 예외처리하기
	} 

test1();
    }

private static void test1() {
	test2();
	
}

private static void test2() {
	System.out.println(10 / 0);
여러 개의 예외가 발생했을 때 - 대부분 가장 위에 뜨는 줄에 들어가면 됨.
        try {
            new FileInputStream("");
콘솔창에 나오는 예외 중 위에서부터 보면서 가장 첫번째로 나오는 내가 만든 예외를 찾는다.
        } catch (FileNotFoundException e) {
 TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
    

finally

  • 필요에 따라 try-catch 뒤에 finally를 추가할 수 있다.
  • finally는 예외의 발생여부와 상관없이 가장 마지막에 수행된다.
    => 주로 close를 호출하고 싶을 때 사용
    자동 자원 반환
  • try(변수 선언; 변수 선언) {} catch(Exception e) {}
  • 사용 후 반환이 필요한 객체를 try의 {}안에서 선언하면 try 블럭 종료시 자동으로 반환된다.
    => finally를 쓰기 너무 길 때 사용

FileInputStream fis = null; // 파일 읽기 - 운영체제의 허락을 받아서 여는 것

	try {
		fis = new FileInputStream("d:/file.txt");
	
	} catch (FileNotFoundException e) {
		e.printStackTrace();
	} finally{
		try {
			fis.close();
		} catch (Exception e) {
			e.printStackTrace();
		}//반납 - 반드시 호출해야하는 메서드
	}
	
	//예외 발생 : try -> catch -> finally
	//예외 미발생 : try -> finally
	
	//자동 자원 반환(JDK1.7)
	try(FileOutputStream fos = new FileOutputStream("d:/file.txt")){//파일을 만드는 클래스 
		//try가 끝날 때 자동으로 close를 호출해줌.
		String str = "아무내용이나 적어봅시다...";
		
		byte[] bytes = str.getBytes();
		
		for(int i = 0; i <bytes.length; i++){
			fos.write(bytes[i]);
		}
	}catch(Exception e){
		e.printStackTrace();
	}
	
	
}

// 예외를 발생시킬 때 throw라는 예약어 사용
        try {
            throw new IOException();
        } catch (IOException e) {
            e.printStackTrace();
        } // 예외를 강제로 발생시키는 방법

	// NullPointerException : 변수에 null이 들어있어서 발생된다.

	// String str = null;
	// System.out.println(str.equals(""));//String 객체가 들어있어야만 equals가 실행됨. -
	// 변수를 찾아서 왜 null이 들어갔는지 찾기

	// IndexOutOBoundsException : 배열의 인덱스를 벗어나서 발생된다.
	int[] a = new int[10];

	for (int i = 0; i <= a.length; i++) {
		System.out.println(a[i]);
	}
}
// 단축키
// Alt + 방향키 : 한 줄을 이동시킴(블럭지정하면 여러줄도 가능)
// Ctrl + Alt + 방향키 : 한 줄 복사
// Ctrl + F : 찾기, 단어검색 / Replace : 어떤 단어 입력하고 바꾸기
// Ctrl + Shift + R : 파일 이름으로 파일 찾기


public class ThrowsException {

public static void main(String[] args) {
	try {
		method();
	} catch (IOException e) {
		e.printStackTrace();
	}
	
}

private static void method() throws IOException {
	//예외선언 : 이 메서드를 호출했을 때 예외가 발생할 가능성이 있다 알려주는 것
	//메서드 뒤에 throws를 입력하고 예외종류를 입력
	throw new IOException(); //선언된 예외는 처리하지 않아도 됨. 
        예외처리는 누가?-> 메서드를 호출한 곳에서
}

}

0개의 댓글

관련 채용 정보