package h_exceprion;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class ExceptionHandling {
public static void main(String[] args) {
에러
- 컴파일 에러: 컴파일 시에 발생되는 에러(빨간줄)
- 논리적 에러: 실행은 되지만, 의도와 다르게 동작하는 것(버그)
- 런타임 에러: 실행 시에 발생되는 에러
런타임에러
- 런타임 에러 발생시 발생한 위치에서 프로그램이 비정상적으로 종료된다.
- 에러: 프로그램 코드에 의해 수습될 수 없는 심각한 오류(처리 불가)
- 예외: 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류(처리 가능)
예외
모든 예외는 Exception 클래스의 자식 클래스 이다.
RuntimeException 클래스와 그 자식들은 예외처리가 강제되지 않는다.
[RuntimeException 클래스와 그 자식들을 제외한]
Exception 클래스의 자식들은 예외처리가 강제된다.
예외처리(try-catch)
예외처리를 통해 크로그램이 비정상적으로 종료되는 것을 방지할 수 있다.
try {} catch(Exception e){}
try 블럭 안의 내용을 실행 중 예외가 발생하면 catch로 넘어간다.
catch의 ()안에는 처리할 예외를 지정해 줄 수 있다.
여러 종류의 예외를 처리할 수 있도록 catch는 하나 이상 올 수 있다.
발생한 예외와 일치하는 catch블럭안의 내용이 수행된 후 try-catch를 빠져나간다.
발생한 예외와 일치하는 catch가 없는 경우 예외는 처리되지 않는다.
기본 형태
try{
int result = 10 / 0; //정수는 0으로 나눌 수 없어서 예외가 발생함-> 프로그램 종료
System.out.println(result); //발생할수 있는 예외의 객체가 생성됨
}catch(ArithmeticException | IndexOutOfBoundsException e){
// 파라미터에는 try에서 발생할 수 있는 에러를 넣어주는 것
//catch가 실행됨, 내용이 없어도 예외는 처리됨 -> 콘솔창에 아무것도 안뜸
e.printStackTrace();
//콘솔창에 에러 메세지가 뜨게 만드는 것
}catch(NullPointerException e){
}catch(Exception e){
//exception: 모든 예외의 부모 클래스 사용, 모든 예외 처리 가능
e.printStackTrace();
}
try {
Thread.sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // control 1 눌러보기
//java.lang.ArithmeticException:(발생한 클래스) / by zero(발생한 원인)
//at h_exceprion.ExceptionHandling.main(ExceptionHandling.java:39)(예외가 발생한 위치)
//예외가 여러개 발생 -> 가장 위에 있는 링크로 들어가기(항상 가장위의 문제가 아닐수 있음)
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();
}
}
}
package h_exceprion;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Finally {
public static void main(String[] args) {
finally
자동 자원 반환
try(변수 선언; 변수 선언){} catch(Exception e){}
사용 후 반환이 필요한 객체를 try의 ()안에서 선언하면 try 블럭 종료시 자동을 반환된다.
finally를 쓰기 너무 길때 사용
FileInputStream fis = null; //파일 읽기
try {
fis = new FileInputStream("d:file.txt");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
fis.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//사용 후 반납(반드시 호출 되야 함) 운영체제로 자원을 빌려왔다가 반납하는 것
}
//예외 발생 : try -> catch -> finally
//예외 미발생: try -> finally
//자동 자원 반환(JDK1.7버전부터 사용 가능)
try(FileOutputStream fos = new FileOutputStream ("d:/file.txt")){
//FileOutputStream파일을 만드는것
String str ="아무 내용이나 적어";
byte[] bytes =str.getBytes();
for(int i = 0; i < bytes.length; i++){
fos.write(bytes[i]);
}
}catch(Exception e){
e.printStackTrace();
}
}
}