예외처리란 프로그램 실행시 발생할수있는 상황들을 미리 정해놓고
예외가 발생했을경우에 대비하여 코드를 작성하여
프로그램이 정상적으로 작동하게하기위해서다.
컴파일 에러는 컴파일할때 발생하는 에러로 문법상의 오류를 말한다
런타임 에러는 컴파일후 실행할때 발생하는 에러이다
런타임 에러는 error와 exceptiond으로 나눌수있는데
error는 코드에서 처리할수없는 심각한오류를말하고
exception은 코드에서 처리할수있는 가벼운 오류를 말한다
exception 에는 IOException, ClassNotFoundException, RuntimeException등이 있는데
IOException과 ClassNotFoundException은 사용자의 입력 실수에 의해 오류가 발생하는 경우이다
IOException과 ClassNotFondException경우 컴파일시 예외처리를 해줘야한다
RuntimeException에는 ArithmeticException, NullPointerException, IndexOutOfBoundsException
등이 있는데 개발자에의해 오류가 발생하는 경우이다
직접처리
try {
예외발생 예상코드
}cath(해당 예외 클래스 e){
예외처리 코드
}
선언처리
public void aaa() throws IOException{
int i = System.in.read();
} //aaa()를 호출하면 IOException class도 같이호출되
//입력시 발생할지도모를 오류를 해결한다
----------
//public class
//main
int intArray[] = {1,2,3,4,5};
//변수를 try 안에서 선언하면 지역변수가되서 사라지게되기때문에 밖에서 선언해줘야한다
try {
System.out.println(intArray[0]);//공간이 하나이므로 1출력
System.out.println(intArray[5]);//공간이 6개이므로 에러
}catch(Exception e) {
System.out.println("예외발생");
}finally {
System.out.println("항상 실행되어야될 코드");
} //finally는 반드시 수행되는부분이다
//return이 있을경우 다음 문장을 수행하지않고 blcok을 빠져나오게되는데
//finally가 있으면 중간에 return이 있어도 반드시 수행된다
//주로 DB접속을 끈을때 사용한다
--------
//public class
//main
int intArray[] = {1,2,0,4,5};
try {
System.out.println(intArray[0]); //첫번째 배열 1이 출력
System.oot.println(intArray[4]/intArray[2]);
//세번째 배열값 0으로 나눌수없으므로 error발생
System.out.println(intARray[5]); //배열이 6개가 아니므로 error발생
String str = null;
str.toString();
//toString은 문자열을 출력하는 method인데 str은 null값이므로 error발생
}catch(ArithmeticException e) {
System.out.pintln(e.getMessage());
}catch(ArrayIndexOutOfBoundsException e) {
System.out.println(e.toString());
//발생할수있는 예상 코드가 여러개일경우 다중 catch문을 사용한다
}catch(Exception e) {
//예상치 못한 error를 상위class의 Exception을 입력
//Exception이 상위의 class이므로 가장 마지막에 적어줘야 하위class의 error check가 실행된다.
e.printStackTrace();
}System.out.println("항상 실행되어야할 코드");
//e.getMessage()를하면 에러설명을볼수있다
//e.toString()을 쓰면 자세한 에러설명을해준다
//e.printStackTrace();를 입력할경우 더 자세한 에러설명을 해준다
-----
//public class
//main
ThrowEx a = new ThrowEx();
a.throwSample(12); //10보다 크므로 error message 를 출력한다
//class ThrowEx
public void throwSample(int n) {
//예외를 발생시켰으므로 try, catch를 이용하여 처리를해야한다
try {
if(n > 10) {
throw new Exception("n 값이 10보다 크다");
//throw는 문자를이용해 예외를 발생시키겠다는 의미이다
}}catch(Exception e) {
e.printStackTrace();
}
------
//public class
//main
ThrowEx a = new ThrowEx();
try {
a.throwSample(12);
}catch(Exception e) {e.printStackTrace();}
//throws Exeption을 가진 method를
//호출했기때문에 try,catch문으로 처리를해줘야한다
//class ThrowEx
public void throwSample(int n) throws Exception{
if(n > 10) {
throw new Exception("n 값이 10보다 크다");
}} //throws Exeption은 예외를 호출한쪽으로 던진다는의미로
//이 method를 호출할때 예외처리를 해줘야한다는뜻이다
------
//public class
//main
ThrowEx a = new ThrowEx();
try {
a.throwSample(12);
}catch(Exception e) {
e.printStackTrace();
}
//class ThrowEx
public void throwSample(int n) throws IllegalArgumentException,IOException{
//예외발생이 2개일때 여러개의 예외를 호출하는 쪽으로 넘겨줌으로써 처리할수있다
//try,catch문을 중첩되게 사용해서 IOException을 처리할수도있고
//Exception을 넘겨줄때 IllegalArgumentExeption,IOException을 같이 넘겨줄수도있다
try {
int aa = System.in.read(); //입력받을땐 IOException처리를 해줘야한다
System.out.println(aa); //a를 입력할경우 아스키값 97이출력
}catch(IOException e) {
e.printStackTrace();
}//try,catch문으로 예외처리를 할수있고
//try,catch문 없이 throws로 여러개의 예외를 한번에넘겨줄수있다
if(n > 10) {
throw new IllegalArgumentException("n 값이 10보다 크다");
}}
------
//public class
//main
MyException mye = new MyException();
//method에서 예외처리를 하지않았으므로 여기서해줘야한다
try {
mye.IOExc();
}catch(IOException e) {
e.printStackTrack();
} //throws나 try,catch문 둘중하나를 입력해 예외처리를 해줘야한다
//class MyException
void ArithmeticExc() {
throw new ArithmeticException();
} //실행을해봐야 알수있으므로 예외처리를 하지않는다
void IOExc() {
throw new IOException();
} //컴파일시 예외처리를 하라고 강요되어진다
void IOExe1() {
try {
throw new IOException()
} cath (IOException e){
e.printStackTrace();
} //미리 IOException처리를 해주어야한다
------
//public class
//main
Divide di = new Divide();
di.setNumber(5, 0);
try {
di.divide(); //0으로 나누기때문에 error가 생긴다
}catch(MyException e) {
e.printStackTrace();
System.out.println(e.getMessage());
//exception!: can not divide by zero 가 출력된다
} //method에서 발생한 예외를 try,catch문을 이용해 처리한다
//class Divide
int n1, n2;
public void setNumber(int n1, int n2) {
this.n1 = n1;
this.n2 = n2;
}
public void divide() {
if(this.n2 == 0) {
throw new MyException("exception!: can not divide by zero");
} //0일경우 Myexception을 호출해 예외를 발생시켜준다
System.out.println(this.n1/this.n2);
}
//class MyException extends Exception
public MyException() {
super(); //부모의 기본생성자 호출
} //생성자를 만들어준다
public MyException(String msg) {
super(msg);
} //생성자를 overriding해준다
'java' 카테고리의 다른 글
wrapper class (0) | 2019.08.03 |
---|---|
Object class(toString(), Equals(), hashCode()) (0) | 2019.08.03 |
다형성(Polymorphism) -second (0) | 2019.08.03 |
다형성(Polymorphism) -first (0) | 2019.08.03 |
인터페이스(interface) (0) | 2019.08.03 |