초급JAVA 13 - 예외처리

voilà!·2021년 11월 7일
0

초급JAVA

목록 보기
24/24

에러

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

런타임 에러

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

예외

  • 모든 예외는 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){ //모든 예외의 부모클래스인 Exception e를 추가(다형성)
			e.printStackTrace();
		}
		
		try {
			Thread.sleep(1);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		
		test1();		
	}

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

	private static void test2() {
//		System.out.println(10/0); 여러개의 예외가 발생하면 가장 첫줄을 들어간다.
		try {
			new FileInputStream(""); //FileInputStream : 파일 경로 읽는 메서드, 파라미터에 경로 넣어줘야 함
			// 에러 발생시키기 위해 파라미터에 ""넣음
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}
}

finally

  • 필요에 따라 try-catch 뒤에 finally를 추가할 수 있다.
  • finally는 예외의 발생여부와 상관없이 가장 마지막에 수행된다.

자동 자원반환

  • try(변수선언;변수선언){} catch(Exception e){}
  • 사용 후 반환이 필요한 객체를 try의 ()안에서 선언하면 try 블럭 종료 시 자동으로 반환된다.
		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")){ //d드라이브에 파일 생성
			String str = "집에 가고 싶어요...";
			
			byte[] bytes = str.getBytes();
			
			for(int i = 0; i < bytes.length; i++){
				fos.write(bytes[i]);
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		
		
	}

ThrowException 예외 발생시키기

try {
			throw new IOException();
		} catch (IOException e) {
			e.printStackTrace();
		} //강제로 예외 발생시키기
		
//		NullPointerException : 변수에 null이 들어있어서 발생된다
		
//		String str = null;
//		System.out.println(str.equals(""));

//	    IndexOutOfBoundsException : 배열의 인덱스를 벗어나서 발생된다.
		int[] a = new int[10];
		
		
		for(int i = 0; i <= a.length; i++){
			System.out.println(a[i]);
		}
		
		//파일 이름으로 파일 찾기 : 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개의 댓글