5월 6일 내용정리
1.실행예외: 프로그램 실행 도중에 예외가 발생하면 JVM은 해당하는 실행 예외 객체를 생성한다.
실행 예외는 컴파일러가 예외처리 여부를 확인하지 않기 때문에 개발자가 예외처리 코드의 추가 여부를 결정해야한다.
2.일반예외: 컴파일러는 일반 예외가 발생할 가능성이 있는 프로그램을 발견하면 컴파일 오류를 발생시킨다.
따라서 개발자는 이런 프로그램에서는 예외처리코드를 반드시 추가해야한다.
3.Exception 은 모든 실행예외의 최고 조상이다.
4.classCastException 억지로 타입 변환 시도할때 발생하는 예외
5.try{예외가 발생할 가능성이 있는 문장}
catch(예외클래스 참조변수){예외가 발생할 때 처리할 문장}...catch문은 여러개 쓸수 있음
finally(예외클래스 참조변수){예외 상황이든 아니든(예외여부 관계없이)항상 실행할 문장}
6.다중 catch문을 쓸경우 조상예외클래스가 자식예외클래스보다 아래에 둬야함
왜? 컴터는 위에서 아래로 실행 하기 때문에 조상예외를 위에두면 조상예외에서 다잡아서
아래 자식예외가 실행이 안됨
7.다중 예외처리
try{예외가 발생할 가능성이 있는 문장}
catch(예외클래스1 | 예외클래스2 참조변수){예외가 발생할 때 처리할 문장}
8.자동리소스 닫기: try-with-resources
예외 발생 여부와 상관없이 사용했던 리소스 객체(각종 입출력 스트림,서버소켓,소켓,각종채널..)의 close()메서드를 호출해서 안전하게 리소스를 닫아줌
package study_0506;
public class ExceptionTest {
public static void main(String[] args) {
int[] array= {0,1,2};
try {
System.out.println("마지막원소=>"+array[3]);
System.out.println("첫번째원소=>"+array[0]); //위에 실행문에서 예외가 발생했으므로 이 실행문은 실행 안됨
}catch(ArrayIndexOutOfBoundsException e) {
System.out.println("원소가 존재하지 않습니다.");
}
System.out.println("아얏!");
}
}
9.예외떠넘기기
메서드를 호출한 곳으로 예외 떠넘기기
즉,예외발생시 현재의 메서드에서 처리하지 않고 메서드를 호출한 곳으로 가서
발생한 예외를 대신처리해 달라고 떠남기는것
package study_0506;
public class TryCatchDemo {
public static void main(String[] args) {
Reso reso =new Reso();
try(reso){
reso.show();
}catch(Exception e) {
System.out.println("예외 처리");
}
}
}
class Reso implements AutoCloseable{
void show() {
System.out.println("자원사용");
}
public void close() throws Exception{
System.out.println("자원 닫기");
}
}
10.사용자정의 예외 클래스 선언
자바표준 API에서 제공하지 않는 예외
애플리케이션 서비스와 관련된 예외
11.Exception예외 컴파일러가 체크하는 일반 예외 필수적으로 예외처리(try-catch)
12.RuntimeException예외-컴파일러가 체크하지 않는 예외, 실행예외(선택적 예외)
13.사용자정의 예외 클래스 정의
public class 변수명Exception extends Exception {
public 변수명Exception(){} //생성자-1
public 변수명Exception(String message){ //생성자-2
super(message)
}
}
14.throw:예외발생시키기
throw new 변수명Exception();
throw new 변수명Exception("예외발생 이유를 넣는다.");
15.예외 정보 얻기
getMessage():예외를 발생시킬 때 생성자 매개값으로 사용한 메세지를 리턴
throw new 변수명Exception("예외발생 이유를 넣는다."); -->여기에 있는 메세지를 리턴
16.printStackTrace()
예외 발생 코드를 추적한 내용을 모두 콘솔에 출력 프로그램을 테스트하면서 오류를 찾을 때 활용
17.개발자가 개발할 때 예외 발생 코드를 추적하기 위해 사용하면 좋음
개발이 끝난 후에는 반드시 주석 처리하거나 삭제를 한다.
package study_0506;
public class Account {
private long balance;
public Account() {}
//잔고 읽어 가져가기
public long getBalance() {
return balance;
}
//잔고 값 넣기
public void setBalance(long balance) {
this.balance = balance;
}
//입금
public void deposit(int money) {
balance+=money;
}
//출금-사용자 정의 예외 떠 넘기기
public void withdrow(int money) throws BalanceInsufficientException{
if(balance<money) {
//예외발생시키기
throw new BalanceInsufficientException(
"예금잔고부족:"+(money-balance)+"금액이 부족합니다.");
}
balance-=money;
}
}
package study_0506;
public class AccountExam {
public static void main(String[] args) {
Account myAccount =new Account();
myAccount.deposit(10000);
System.out.println("예금액:"+myAccount.getBalance());
try {
// myAccount.withdrow(1000); 출금 -1000원
myAccount.withdrow(20000);
} catch (BalanceInsufficientException e) {
//e.printStackTrace(); 에러의 자세한 사항을 알고싶을때
System.out.println("예외발생");
String message = e.getMessage();
}
}
}
package study_0506;
public class BalanceInsufficientException extends Exception{
public BalanceInsufficientException() {}
public BalanceInsufficientException(String message) {
super(message);
}
}