Java 고급문법_1_Exception

소정·2023년 1월 31일
0

Java

목록 보기
18/23
post-custom-banner

1.예외처리(Exception)

예외 발생하는 순간 코드 다운 예외처리는 이런 앱이 실행중에 멈춰버리는 문제가 발생하지 않도록 하는 기법
예외가 없도록 하는것이 아니라 예외가 발생해도 아래 코드들이 실행되도록 하는 것
if문법으로 예외상황을 방지하는 것도 방법이지만 모든 상황을 대처하진 못함 또한 경우에 따라 일당 실행해봐야 예외인지 아닌지 파악할 수 있는 경우도 있음 (ex. 네트워크 접속) 이럴때 사용하는 문법이 예외처리


try {
코드 문제 없을 때 실행
} catch (예외클래스 참조변수명){
코드 문제 있을때 실행
} finally {
여기는 오류 상관없이 무조건 실행
}


Exception은 예외처리의 최상위 클래스

다중 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 넣을 수 없습니다");
} 

finally

문법적으론 있던 없던 상관없음 그럼에도 쓰는 이유
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("여기는 무조건 실행");
}



Exception의 종류는 크게 두가지로 분류

1. UnChecked Exception

예외처리를 해도 되고 안해도 되는 예외들.. 서버 다운은 되지만 실행조차 안하는 에러는 아님
ex) InputMismatchException,NullPointerException...

2. Checked Exception

무조건 예외 처리를 하지 않으면 예외가 발생하는 예외들
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("파일없음");
		}
		
		
	}

}



throws

예외를 떠넘기는 문법, 경우에 따라서는 예외가 발생하는 코드에서 직접 처리가 애매할 수 있다 이럴때 코드쓴 곳에서 예외를 처리하지 않고 이 메소드를 호출하는 쪽에서 예외처리 한다

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

코드를 통해서 강제로 예외를 발생시키는 문법

사용법
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 제작

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);		
	}
	
}

profile
보조기억장치
post-custom-banner

0개의 댓글