2023. 9. 10. 20:24ㆍJava
예외(Exception )처리
*컴파일 에러
컴파일 단계에서 발견하여 컴파일러가 에러 메시지 출력 ex) 문법 구문 오류
*런타임 에러
컴파일에는 문제가 없더라도 실행시 발생하는 에러
오류(Error)와 예외(Exception)이 있다.
오류와 예외
- Error(오류) : 수습할 수 없는 심각한 오류
ex) 메모리 부족, 스택오버플로우 등 발생하여 프로그램이 죽는것은 프로그래머가 제어할 수 없음.
- Exception(예외) 예외 처리를 통해 수습할 수 있는 덜 심각한 오류
예외 종류
1) RuntimeException
- RuntimeException을 상속받고 있는 Exception
- 런타임 시에 발생하는 예외 (Exception처리를 안해줘도 컴파일 시에는 에러가 없다.)
ex)
- 배열의 범위를 벗어남 (ArrayIndexOutOfBoundsException)
- 값이 null인 참조 변수의 멤버를 호출 (NullPointerException)
2) CheckedException (컴파일 시 예외 발생)
- RuntimeException을 상속받고 있지 않은 기본적인 Exception
- 반드시 예외를 처리해야함
- 외적인 요인에 의해 발생하는 컴파일 시 발생하는 예외
ex)
- 존재하지 않는 파일의 이름을 입력 (FileNotFoundException)
- 실수로 클래스의 이름을 잘못 기재 (ClassNotFoundException)
- 입출력 (IOException)
예외 처리 방법
1. try-catch
try 구문에서 예외가 발생되면
예외 클래스에 맞는 catch문으로 가서 catch 블록 안에 있는 코드를 처리한다.
try{
// 로직
}catch (Exception클래스명 변수명){
// 예외 처리 코드
}finally{
// 예외와 관계없이 무조건 실행되는 코드
}
=> printStackTrack() 메서드 : catch문 안에서 실행하면 한꺼번에 예외처리를 하여도 세세한 예외 상황을 추적할 수 있다.
2. throw & throws
- throw - 개발자가 의도적으로 예외를 발생시키는 것
public static void main(String[] args) {
try{
throw new Exception(); //강제로 Exception 객체 생성
}catch (Exception e){
e.printStackTrace(); //예외 발생
}
- throws - 메소드 내에서 예외처리를 하지않고 해당 메소드를 사용한 곳에서 예외 처리를 하도록 예외를 전가하는 것
리턴타입 메소드명 (매개변수선언1, ... ) throws Exception클래스명1, Exception클래스명2 .. {
...
}
public void exception1{
try{
ex1(); //메소드 호출
}catch (ClassNotFoundException e){ //호출한 곳에서 예외 처리
System.out.println("클래스가 존재하지 않습니다.");
}
}
public void ex1() throws ClassNotFoundException{
Class clazz = class.forName("java.lang.String2"); //예외 발생
}
Enum
요일이나 계절처럼 한정된 개수의 값들을 하나로 묶어서 사용하고 싶을 때, 열거 타입을 사용
상수 데이터들의 집합
* Enum 메소드 종류
메소드 | 설명 | 리턴 타입 |
name() | 열거 객체의 문자열을 리턴 | String |
ordinal() | 열거 객체의 순번을 리턴(0부터 시작) | int |
compareTo() | 열거 객체를 비교해서 순번 차이를 리턴 | int |
valueOf(String name) | 문자열을 입력받아서 일치하는 열거 객체를 리턴 | enum |
values() | 모든 열거 객체들을 배열로 만들어 리턴 | enum[] |
* Enum 특징
Type-Safety
정해진 값만 변수에 할당할 수 없다는 문제점 (No Type-Safety) => 미리 정의된 Enum안에 선언된 상수만 전달될 수 있다.
* Enum 사용법
1. 생성자를 가질 수 있다. (단, 생성자는 private)
public enum Gender {
// 상수뒤에 괄호가 있으면 Enum의 생성자를 호출한 것
MALE("XY"),
FEMALE("XX");
private String chromosome ; //염색체
private Gender(String chromosome){
this.chromosome = chromosome;
}
//object가 가지고 있는 toString()메소드를 오버라이딩하여
//enum안에 선언된 메소드나 변수를 사용
@Override
public String toString() {
return "Gender{" +
"chromosome='" + chromosome + '\'' +
'}';
}
public void print(){
System.out.println("염색체 정보 : "+chromosome);
}
}
public class GenderTest {
public static void main(String[] args) {
Gender gender = Gender.MALE;
System.out.println(gender);
gender.print();
//결과 :
//Gender{chromosome='XY'}
//염색체 정보 : XY
}
}
2. Enum 상수 간의 비교가 가능하다
>,<와 같은 비교연산자는 사용할 수 없고 == 이나 compareTo()를 사용하여 비교할 수 있다.
3. Enum은 인터페이스를 구현하고, 해당 인터페이스를 오버라이딩하여 구현할 수 있다.
public interface Printer {
public void print();
}
public enum Color implements Printer{
RED("FF0000"),
GREEN("00FF00"),
BLUE("0000FF");
private String rgb;
private Color(String rgb){
this.rgb = rgb;
}
@Override
public void print() {
System.out.println("rgb : "+rgb);
}
}
public class ColorTest {
public static void main(String[] args) {
Color color = Color.RED;
color.print();
// 결과
//rgb : FF0000
}
}
4. Enum은 추상메소드를 가질 수 있다. 추상메소드를 가질 경우엔 상수를 정의할 때 추상메소드를 함께 구현해 줘야한다.
public enum Country {
KOREA{
public void print(){
System.out.println("대한민국");
}
},
USA{
@Override
public void print() {
System.out.println("미국");
}
};
public abstract void print();
}
5. Enum객체는 Enum상수가 처음 호출되거나 참조될 때 생성된다.
'Java' 카테고리의 다른 글
11. 회원관리 프로그램 (0) | 2023.09.10 |
---|---|
9. 컬렉션 프레임 워크와 제네릭 (0) | 2023.09.04 |
8. 익명 클래스와 람다식 (0) | 2023.09.04 |
7. 자바 리플렉션 (Reflection) (0) | 2023.09.04 |
6. 불변 객체 (Immutable Object) & Final (0) | 2023.09.03 |