Do it! 자바 완전 정복 - 14. 예외 처리

선뀰·2024년 6월 28일
0

JAVA

목록 보기
25/25

예외

프로그램을 작성하는 과정하는 과정에서 실수를 하거나 사용자가 잘못된 값을 입력하면 오류가 발생할 수 있다. 예외라고 한다.

예외 처리

연산 오류, 숫자 포맷 오류 등과 같이 상황에 따라 개발자가 해결할 수 있는 오류를 말한다.
오류 자체를 수정할 수 있다는 것이 아니라 오류가 발생했을 때 차선책을 선택하는 것을 말한다.

예외 클래스의 상속 구조

일반 예외 : 컴파일 전에 체크

  • InterruptedException
    Thread.sleep(1000); 일정 시간 동안 해당 쓰레드를 일시정지 상태로 만드는 Thread 클래스의 정적 메서드이다. 일반 예외가 발생할 수 있기 때문에 반드시 예외 처리를 해야 한다.

  • ClassNotFoundException
    Class.forName("패키지명.클래스명") 클래스를 동적으로 메모리에 로딩하는 메서드
    Class 타입의 객체를 리턴한다.

public class A { // class가 없을 때 예외 발생 가능 -> NotFoundException처리해야 한다. 
	public static void main(String[] ar) {
    	Class cls=Class.forName("java.lang.Object");
    }
}
  • IOException
public class A {
	public static void main(String[] ar) {
    	InputStreamReader isr=new InputStreamReader(System.in);
        isr.read(); // 입출력을 실행할 때 예외 발생 가능 IOException 처리가 필요하다.
    }
}
  • FileNotFoundException
public class A {
	public static void main(String[] ar) {
    	FileInputStream fis=new FileInputStream("text.txt");
    }
} // File이 없을 때 예외 발생 가능하다. FileNotFoundException 처리해야 한다.
  • CloneNotSupportedException
    Object 클래스를 상속한다. Object 클래스의 메서드 중 clone()은 자신의 객체를 복
class B {
	@Override
    protected Object clone() throws CloneNotSupportedException {
    	return super.clone();
    }
}
public class A {
	public static void main(String[] ar) {
    	B b1 = new B();
        B b2 = (B) b1.clone();
    }
}

A클래스의 내부에서 clone() 메서드를 호출하기 위해 B 클래스에서 clone() 메서드를 오버라이딩 한다. class B가 Clonable 인터페이스를 구현하지 않으면 CloneNotSupportedException이 발생한다.

Add throws declaration과 Surround with try/catch 중에서 선택할 수 있는 창이 나타난다.
두 번째 항목을 선택하면 예외 처리 구문을 쉽게 추가할 수 있다.

실행 예외 : 실행할 때 체크

문법 오류가 발생하지 않는다. 예외 처리 없이 컴파일과 실행이 가능하지만, 실행 중 예외가 발생하면 프로그램은 강제 종료된다.

  • ArithmeticException
    산술 or 연산이다. 연산 자체가 불가능할 때 발생하는 실행 예외이다.
public class A {
	public static void main(String[] ar) {
    	System.out.println(3 / 0); // 연산되는 분모가 0이므로 예외가 발생한다.
    }
}
  • ClassCastException
    다운캐스팅이 불가능한 상황에서 다운캐스팅을 시도할 때 발생한다.
class A {}
class B extends A {}

public class Test {
	public static void main(String[] ar) {
    	A a=new A();
        B b = (B) a; //Class 캐스팅이 불가능하면 ClassCastException 발생
    }
}
  • ArrayIndexOutOfBoundsException
    배열의 인덱스를 잘못 사용했을 때 발생한다.
public class A {
	public static void main(String[] ar) {
    	int[] a = { 1, 2, 3 };
        System.out.println(a[3]); // 인덱스의 범위를 넘어섰을 때 오류가 발생한다.
    }
}
  • NumberFormatException
    문자열을 정숫값으로 변환하고자 할 때
    Integer.parseInt("문자열"), 실숫값으로 변환하고자 할 때 Double.parseDouble("문자열")을 사용해야 한다.
public class A {
	public static void main(String[] ar) {
    	int num = Integer.parseInt("10!"); // Number(숫자)가 아닌 것을 숫자로 바꿀 때 예외가 발생한다. 
    }
}

정숫값 및 실숫값을 문자열로 변환할 때는 String.valueOf(정숫값) 또는 String.valueOf(실숫값)을 사용한다.

문자열을 불리언으로 변환하기

Boolean.parseBoolean("true"); // true
Boolean.parseBoolean("false"); // false
문자열을 불리언값으로 변경할 때는 문자열이 "true"인지만 확인하면 된다.
비어 있는 문자열도 false값으로 변환한다.

  • NullPointerException
    참조 변수가 실제 객체를 가리키고 있지 않은 상황에서 필드나 메서드를 호출할 때 발생한다.
    null은 위칫값을 저장하는 참조 변수의 초깃값으로만 사용할 수 있고, 현재 가리키고 있는 객체가 없다는 것을 의미한다.

public class A {
public static void main(String[] ar) {
String a = null;
System.out.println(a.charAt(2));
}
}

profile
공부 기록

0개의 댓글