교재 목차
Chapter08. 예외처리
Chapter09. java.lang 패키지와 유용한 클래스
Chapter08. 예외처리 (Exception Handling)
1. 예외란?
1-1. 예외 (Exception)
프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류
- 에러(error) : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
- 에러의 종류
- 컴파일 에러 : 컴파일 시 발생하는 에러
- 런타임 에러 : 실행 시 발생하는 에러
- 논리적 에러 : 실행은 되지만 의도와 다르게 동작하는 것
- 예외 클래스의 계층구조
- exception 클래스들 : 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외
- runtimeexception 클래스들 : 프로그래머의 실수로 발생하는 예외
1-2. 예외처리의 필요성
프로그램 실행 중 발생할 수 있는 예상치 못한 상황에 대응하여 프로그램의 정상적인 흐름을 유지해야 한다. 이를 통해 프로그램의 안정성과 신뢰성을 높일 수 있다.~~
1-3. 예외처리
예외처리의 정의 : 프로그램 실행 시 발생할 수 있는 예외에 대비한 코드를 작성하는 것
예외처리의 목적 : 프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것
try-catch
try {
//예외발생할 가능성이 있는 문장
}catch(Exception1 e1) {
//Exception1이 발생했을 경우, 이를 처리하지 위한 문장을 적는다.
//보통 이곳에 예외메세지를 출력하고 로그로 남김.
}catch(Exception2 e2) {
//Exception2이 발생했을 경우, 이를 처리하지 위한 문장을 적는다.
}catch(ExceptionN eN) {
//ExceptionN이 발생했을 경우, 이를 처리하지 위한 문장을 적는다.
}finally{
//예외발생여부에 관계없이 상항 수행되어야 하는 문장을 적는다.
}
https://cheershennah.tistory.com/147 [Today I Learned. @cheers_hena 치얼스헤나:티스토리]
try-catch 흐름
- try 블럭 내에서 예외가 발생한 경우
- 발생한 예외와 일치하는 catch 블럭이 있는지 확인한다.
- 일치하는 catch 블럭을 찾게 되면, 그 catch 블럭 내의 문장들을 수행하고 전체 try-catch문을 빠져나가서 그 다음 문장을 계속해서 수행한다. 만일 일치하는 catch블럭을 찾지 못하면, 예외는 처리되지 못한다.
- try 블럭 내에서 예외가 발생하지 않은 경우
printStackTrace()
예외 발생 당시의 호출스택(call stack)에 있었던 메서드의 정보와 예외 메시지를 화면에 출력한다.
=> 가장 자세한 예외 정보 제공
getMessage()
발생한 예외 클래스의 인스턴스에 저장된 메시지를 얻을 수 있다.
2. 예외 발생시키기
2-1. 예외 발생시키기
⑴ 먼저, 연산자 new를 이용해서 발생시키려는 예외 클래스의 객체를 만든다
⑵ 키워드 throw를 통해 예외를 발생시킨다
2-2. 메서드에 예외 적용하기
메서드 선언부에 예외 클래스 적기
void method() throws Exception1, Exception2 {
...
}
자손타입의 예외까지도 발생할 수 있음을 주의!
try-catch문을 사용해 중간에 예외처리를 한다.
오버라이딩 시에는 단순히 선언된 예외의 개수가 아니라 상속관계까지 고려해야 한다.
// try-catch문을 사용하지 않았을때
public static void method1() throws Exception {
method2();
}
public static void method2() throws Exception {
throw new Exception();
}
// 사용하는 메서드들의 예외처리가 main 메서드까지 전달되어야 한다.
public static void main(String[] args) throws Exception {
method1();
}
// try-catch문을 사용할 때
public static void method1() {
try {
method2();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void method2() throws Exception {
throw new Exception();
}
// 중간에 예외처리가 되었으므로 thorws Exception을 선언하지 않아도 된다.
public static void main(String[] args) {
method1();
}
finally 블럭
예외 발생 여부와 상관없이 실행
2-3. 자동 자원 반환
파일을 열고 읽거나 쓴 후에 반드시 파일을 닫아야 하는데, 이 구문을 사용하면 블록 종료시 자동으로 filereader가 닫히도록 되어있다는 것이 장점이다. 이 구문은 AutoCloseable 인터페이스르 구현한 객체만 사용할 수 있다.
- try-with-resources 활용처
- 파일입출력
- 데이터베이스 연결
try (FileReader fr = new FileReader("path/to/file.txt")) {
int i;
while ((i = fr.read()) != -1) {
System.out.print((char) i);
}
} catch (IOException e) {
e.printStackTrace();
}
2-4. 사용자 정의 예외 만들기
표준 API가 제공하는 예외 클래스가 아닌 사용자가 직접 정의하여 사용하는 예외
- 사용자 정의 예외는 반드시 java.lang.Exception 클래스를 상속받아 정의해야한다.
- 사용자 정의 예외는 JVM에서 예외를 발생시켜 주지 않으므로 직접 예외를 생성해야한다.
- 예외 생성 하기 : throw new 사용자정의예외()
- 입출력 시 사용자 정의 예외처리 예시
class elementException extends Exception {
public elementException(String a) {
super(a);
}
}
public class Test {
public static int sum() throws elementException {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
if (a<0 || b<0) {
throw new elementException("음수 값 입력 금지");
}
return a+b;
}
public static void main(String[] args) {
try {
System.out.printf("합 : %d", sum());
System.out.println("sum 함수 실행 완료");
} catch (elementException e) {
System.out.println(e.getMessage());
}
System.out.println("try catch 문 실행 완료");
}
public static void main(String[] args) {
System.out.printf("합 : %d", sum());
System.out.println("sum 함수 실행 완료");
}
## 출력 결과
3
-1
Exception in thread "main" elementException: 음수 값 입력 금지
at Test.sum(Test.java:16)
at Test.main(Test.java:22)
https://velog.io/@bosl95/%EC%9E%90%EB%B0%94%EC%9D%98-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%A0%95%EC%9D%98-%EC%98%88%EC%99%B8
2-5. 예외 되던지기 (exception re-throwing)
한 메서드에서 발생할 수 있는 예외가 여럿인 경우
몇 개는 try-catch문을 통해서 메서드 내에서 자체적으로 처리하고,
그 나머지는 선언부에 지정하여 호출한 메서드에서 처리하도록 함으로써, 양쪽에서 나눠서 처리되도록 할 수 있다.
그리고 단 하나의 예외에 대해서도 예외가 발생한 메서드와 호출한 메서드,
양쪽에서 처리하도록 할 수 있다.
이것은 예외를 처리한 후에 인위적으로 다시 발생시키는 방법을 통해서 가능한데, 이것을 예외 되던지기(exception re-throwing)라고 한다.
2-6. 연결된 예외 (chained exception)
한 예외가 다른 예외를 발생시킬 수도 있다.
A가 B의 예외를 발생시킨다면, A를 B의 ‘원인 예외(cause exception)’라고 한다.
- 발생한 예외를 그냥 처리하지 않고 서로 연결시키는 이유?
- 여러가지 예외를 하나의 큰 분류의 예외로 묶어서 다루기 위해서이다.
- checked 예외를 unchecked 예외로 바꾸기 위해서이다.
- 상속을 사용하지 않는 이유?
- 번거로움, 구조적 엉킴, 조상관계 설정 시 어떤 자식에서 예외가 발생했는지 알기 어려움
Chapter09. java.lang 패키지와 유용한 클래스
1. java.lang 패키지
1-1. java.lang 패키지 특징 (jdk11 기준)
프로그래밍에 가장 기본이 되는 클래스를 포함, import 필요없음
1-2. 유용한 클래스
- java.lang.Object
- java.lang.String
- java.lang.StringBuffer
- java.lang.StringBuilder
- java.lang.Math
- java.lang.wrapper
프로그램에 따라 기본 타입의 데이터를 객체로 취급 해야하는 경우가 있음.
8개의 기본 타입에 해당하는 데이터를 객체로 포장해주는 클래스를 wrapper 클래스라고 한다.
참고
오토박싱(AutoBoxing) - new 키워드를 사용하지 않고 Character 인스턴스 생성 가능
오토언박싱(AutoUnBoxing) - charValue() 메서드 사용없이 인스턴스에 저장된 값을 바로 참조 가능
- 기본 타입과 래퍼 클래스 간의 다양한 연산 가능
- 인스턴스에 저장된 값의 동등 여부 판단은 equals 메서드를 사용해야만 함
- wrapper 클래스도 객체이기 때문에 동등 연산자(==)를 사용하게 되면, 두 인스턴스의 값을 비교하는 것이 아니라 두 인스턴스의 주소값을 비교하게 된다.
integer num = new Integer(17); // 박싱
int n = num.intValue(); // 언박싱
System.out.println(n);
Character ch = 'X'; // Character ch = new Character('X'); : 오토박싱
char c = ch; // char c = ch.charValue(); : 오토언박싱
System.out.println(c);
17
X
2. 기타 유용한 클래스
2-1. 유용한 클래스
- java.util.Objects
- java.util.Random
- java.util.regex
- java.util.Scanner
- java.util.StringTokenizer
- java.math.BigInteger
- java.math.BigDecimal
- java.math.MathContext
'개념' 카테고리의 다른 글
[JAVA의 정석] Chapter11 (1) | 2024.09.08 |
---|---|
[JAVA의 정석] Chapter10 (0) | 2024.09.08 |
[JAVA의 정석] Chapter07 (2) | 2024.09.08 |
[JAVA의 정석] Chapter06 (2) | 2024.09.07 |
[JAVA의 정석] Chapter04 -05 (5) | 2024.09.07 |