예외 발생하는 순간 코드 다운 예외처리는 이런 앱이 실행중에 멈춰버리는 문제가 발생하지 않도록 하는 기법
예외가 없도록 하는것이 아니라 예외가 발생해도 아래 코드들이 실행되도록 하는 것
if문법으로 예외상황을 방지하는 것도 방법이지만 모든 상황을 대처하진 못함 또한 경우에 따라 일당 실행해봐야 예외인지 아닌지 파악할 수 있는 경우도 있음 (ex. 네트워크 접속) 이럴때 사용하는 문법이 예외처리
try {
코드 문제 없을 때 실행
} catch (예외클래스 참조변수명){
코드 문제 있을때 실행
} finally {
여기는 오류 상관없이 무조건 실행
}
다중 catch도 개수가 많아지면 사용하기 힘들고 예외클래스이름을 정확히 알아야 쓸수 있음
모든 예외 클래스들의 부모 클래스인 Exception 참조변수로 예외처리를 하면 어떤 종류의 예외든 받을 수 있다(업캐스팅)
대신 세세하겐 대응 못함 보통 다중 catch와 최상위 클래스를 적절하게 섞어 쓰는 것이 좋다
int c,d;
try {
c = sc.nextInt();
d = sc.nextInt();
System.out.println(c/d);
} catch (InputMismatchException e) {
System.out.println("숫자만 입력");
} catch (Exception e) {
System.out.println("두번째는 0 넣을 수 없습니다");
}
문법적으론 있던 없던 상관없음 그럼에도 쓰는 이유
1. 개발자에게 의도적으로 try에 관련있음을 보여주기 위해 사용함
2. catch문을 생략 할 수 있게 해줌 -> 코드간결
int x=5;
try {
System.out.println(10/x);
System.out.println("계산 성공");
} catch (Exception e) {
System.out.println("계산 실패");
} finally { //문법적으론 있던 없던 상관없음 개발자에게 의도적으로 try에 관련있음을 보여주기 위해 사용함
System.out.println("여기는 무조건 실행");
}
예외처리를 해도 되고 안해도 되는 예외들.. 서버 다운은 되지만 실행조차 안하는 에러는 아님
ex) InputMismatchException,NullPointerException...
무조건 예외 처리를 하지 않으면 예외가 발생하는 예외들
ex) MalformedURLException, FileNotFoundException
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
//1. Checked Exception
//대표적인 종류
//네트워크 연결 객체생성
//URL url = new URL("http://www.naver.com");
//Unhandled exception type MalformedURLException : 예외처리 안해주면 무조건 에러
try {
URL url = new URL("http://www.naver.com"); //주소오류 http://이없으면 오류
System.out.println("서버 주소 성공");
} catch (MalformedURLException e) {
System.out.println("서버 주소가 이상");
}
//파일 입출력
File file = new File("D:\\aaa.test");
//파일과 연결하는 무지개 로드(Stream)
//stream : 데이터를 주고받는 통로
//FileInputStream fis = new FileInputStream(file);
//Unhandled exception type FileNotFoundException
try {
FileInputStream fis = new FileInputStream(file);
} catch (FileNotFoundException e) {
System.out.println("파일없음");
}
}
}
예외를 떠넘기는 문법, 경우에 따라서는 예외가 발생하는 코드에서 직접 처리가 애매할 수 있다 이럴때 코드쓴 곳에서 예외를 처리하지 않고 이 메소드를 호출하는 쪽에서 예외처리 한다
class 자체에 예외처리 키워드를 붙이면 운영체제에서 처리한다 => 권장하지않음
import java.net.MalformedURLException;
import java.net.URL;
public class Main2 {
public static void main(String[] args) throws Exception{ //여기로 던진건 운영체제가 받음
ccc();
try {
int num = divide(10,0);
System.out.println("num : "+num);
} catch (Exception e) {
System.out.println("divide 메소드의 throws된 예외를 대신 처리");
}
System.out.println();
//강제로 예외처리를 해야만하는 CheckedException 사용
try {
aaa();
} catch (MalformedURLException e) {
e.printStackTrace();
}
try {
ccc();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ddd();
}
static void ddd() throws Exception {
//Exception으로 던지면 언체크드가 오는지 체크드가 오는지 모르니까 무조건 예외처리 해야됨
}
//throws는 폭탄 떠넘기듯이 예외도 마구 떠넘길 수 있다
static void bbb() throws MalformedURLException{
aaa();
}
static void ccc() throws MalformedURLException{
bbb();
}
static void aaa() throws MalformedURLException{
//이 곳에서 해야할 예외처리 떠넘김 -> 얘를 쓰는 쪽에
URL url = new URL("http://www.goolgle.com");
}
//두 수를 나눗셈 연산하여 결과를 리턴해주는 기능 메소드
//static인 main에선 static만 쓸수 있다
// static int divide(int x, int y) { //오류 에러가 발생 시 리턴타입이 맞지않음
// try {
// return x/y;
// } catch (ArithmeticException e) {
// return ???;
// }
// }
//경우에 따라서는 예외가 발생하는 코드에서 직접 처리가 애매할 수 있다
//이럴때 이곳에서 예외를 처리하지 않고
//이 메소드를 호출하는 쪽으로 예외를 던져버리는 문법
// throws
static int divide(int x, int y) throws ArithmeticException {
return x/y;
}
}
코드를 통해서 강제로 예외를 발생시키는 문법
사용법
throw new 예외클래스명();
public class Main {
public static void main(String[] args) {
//throw
//코드를 통해서 강제로 예외를 발생시키는 문법
try {
System.out.println("aaa");
//강제 예외발생 - 억지로 catch문으로 이동
throw new Exception();
} catch (Exception e) {
System.out.println("예외발생");
}
//메소드 생성 후 강제 예외처리
int n;
try {
n = aaa(10,2);
n = aaa(10,15);
System.out.println("n = "+n);
} catch (Exception e) {
System.out.println("계산결과가 음수");
System.out.println("예외메세지 : "+ e.getMessage()); //생성자에 전해 받은 값 Hi 출력
}
}
static int aaa(int a, int b) throws Exception {
//음수가 나오면 에러라고 할때
if(a<b) {
throw new Exception("Hi"); //강제로 예외를 발생
} //Exception() => 생성자 사용 가능
return a-b;
}
}
Exception을 상속받아 나만의 예외처리 클래스를 제작하여 사용할 수 있다
개발자가 정의한 예외 객체는 기본생성자를 선언하고 super문으로 Exception의 생성자를 호출하여 예외 메세지를 정한다~!
class MyException extends Exception{
//내가 만든 생성자에 super()로 Exception의 생성자 호출 public MyException(String msg) { super(msg); }
}
public class Main3 {
public static void main(String[] args) {
try {
n = bbb(10,2);
n = bbb(10,15);
System.out.println("n = "+n);
} catch (Exception e) {
System.out.println("계산결과가 음수");
System.out.println("예외메세지 : "+ e.getMessage());
}
}
static int bbb(int a, int b) throws Exception{
//음수가 나오면 에러라고 하고 싶을때..
if(a<b) {
throw new MyException("Hi~~"); //강제로 예외를 발생시키기
}
return a-b;
}
}
//나만의 Exception 클래스 제작
class MyException extends Exception{
//생성자
public MyException(String msg) {
super(msg);
}
}