-사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류
-예외가 발생하면 프로그램은 곧바로 종료된다는 점에서 에러와 비슷하지만 예외는 예외처리를 통해 프로그램을 종료하지 않고 정상 실행 상태가 유지되도록 할 수 있음
-일반 예외(컴파일러 체크 예외) : 실행전에 문법 오류를 컴파일 과정에서부터 차단
-실행 예외(컴파일러 넌 체크 예외) : 컴퓨터가 실행 전 걸러내지 못하는 실행 과정에서 발생한 오류
jvm은 프로그램을 실행하는 도중에 예외가 발생하면 해당 예외 클래스로 객체를 생성함
그리고 나서 예외 처리 코드에서 예외 객체를 이용할 수 있도록 해줌
모든 예외 클래스는 다음과 같이 java.lang.Exception 클래스를 상속받
일반 예외와 달리 실행 예외 클래스는 RuntimeException 클래스를 기준으로 구별
(RuntimeException의 하위 클래스가 아니면 일반 예외 클래스이고, 하위 클래스이면 실행 예외 클래스, 클래스 상속 관계에서 부모에 RuntimeException이 있다면 실행 예외 클래스)
실행 예외는 자바 컴파일러가 체크하지 않기 때문에 오로지 개발자의 경험에 의해서 예외 처리 코드를 작성해야 함 만약 개발자가 실행 예외에 대해 예외 처리 코드를 넣지 않았을 경우, 해당 예외가 발생하면 프로그램은 곧바로 종료됨
실행예외 예시들
-자바 프로그램에서 가장 빈번하게 발생하는 실행 예외
-객체 참조가 없는 상태, 즉 null값을 갖는 참조 변수로 객체 접근 연산자인 도트(.)를 사용했을 때 바생
-객체가 없는 상태에서 객체를 사용하려 했으니 예외가 발생하는 것
ex
public class NullPointerExceptionExample{
public static void main(String[] args){
String data = null;
System.out.println(data.toString());
}
}
실행결과
프로그램에서 예외가 발생하면 예외 메세지가 Console 뷰에 출력되면서 프로그램이 종료됨
Console 뷰에 출력되는 내용에는 어떤 예외가 어떤 소스의 몇 번째 코드에서 발생했는지 정보가 들어 있음
-배열에서 인덱스 범위를 초과할 경우 실행 예외인 Java.lang.ArrayIndexOutOfBoundsException이 발생함
public class ArrayIndexOutOfBoundsExceptionExample {
public static void main(String[] args){
String data1 = args[0];
String data2 = args[1];
System.out.println("args[0] = " + data1);
System.out.println("args[1] = " + data2);
}
}
실행결과
프로그램을 개발하다 보면 문자열로 되어 있는 데이터를 숫자로 변경하는 경우가 자주 발생함
문자열을 숫자로 변환하는 방법은 여러가지가 있지만 주로 Integer.parseInt(String s)와 Double.parseDouble(String s) 메소드를 가장 많이 사용
Integer와 Double은 포장(Wrapper) 클래스라고 하는데, 이 클래스의 정적 메소드인 parseXXX() 메소드를 이용하면 문자열을 숫자로 변환할 수 있다.
이 메소드들은 매개값인 문자열이 숫자로 변환될 수 있다면 숫자를 리턴하지만 숫자가 변환될 수 없는 문자가 포함되어 있다면 java.lang.NumberFormatException을 발생시킨다.
public class NumberFormatExceptionExample {
public static void main(String[] args) {
String data1="100";
String data2="a100";
int value1 = Integer.parseInt(data1);
int value2 = Integer.parseInt(data2); //NumberFormatException 발생
int result = value1+value2;
System.out.println(data1+"+"+data2+"="+result);
}
}
실행결과
코드가 하위 유형이 아닌 유형에 대한 참조를 캐스팅하려고 시도했음을 알리는 확인되지 않은 예외
package com.javatest.java;
public class ClassCastExceptionExample {
public static void main(String[] args) {
Dog dog = new Dog();
changeDog(dog);
Cat cat = new Cat();
changeDog(cat); //Cat객체를 매개값으로 주어서 Dog 타입으로 반환할 수 없음
}
public static void changeDog(Animal animal) {
//if(animal instanceof Dog){
Dog dog = (Dog)animal; //ClassCastException 발생 가능
//}
}
}
class Animal{}
class Dog extends Animal{}
class Cat extends Animal{}
실행결과