자바의 예외는 크게 3가지로 나눌 수 있다.
[image 1. 자바에서 에러, 예외 관련된 클래스들의 계층구조]
Throwable 클래스를 기준으로 Error, Exception 클래스로 나뉘어 진다다. 왼쪽에 보이는 Error는 말 그대로 에러와 관련된 클래스이다. 그리고 오른쪽에 보이는 Exception 도 말 그대로 예외와 관련된 클래스이다. 자바에서는 실행 시(runtime) 발생할 수 있는 프로그램 오류를 에러(error)와 예외(exception) 두 가지로 구분하였다.
에러는 시스템에 비정상적인 상황이 발생했을 경우에 발생한다. 예를들어, 메모리 부족(OutofMemoryError)이나 스택오버플로우(StackOverflowError)와 같이 복구할 수 없는 것을 말한다.
이러한 에러는 개발자가 예측하기도 쉽지 않고 처리할 수 있는 방법도 없다.
예외는 프로그램 실행 중에 개발자의 실수로 예기치 않은 상황이 발생했을 때이다. 예를들어 배열의 범위를 벗어난(ArrayIndexOutOfBoundsException), 값이 null이 참조변수를 참조(NullPointerException), 존재하지 않는 파일의 이름을 입력(FileNotFoundException) 등등이 있다. 이러한 것들은 그냥 보아도 프로그램에 심각한 오류여서 복구할 수 없는 수준은 아니라는 것을 알 수 있다.
예외에는 2가지로 나눌 수 있다.
체크 예외(Checked Exception), 언체크 예외(Unchecked Exception)
위의 자바 에러 클래스의 계층 구조를 보았을 때 RuntimeException의 하위 클래스들이 Uncheck Exception 이라 하고 RuntimeException의 하위 클래스가 아닌 Exception 클래스의 하위 클래스들을 Checked Exception이라고 한다.
존재하지 않는 파일의 이름을 입력(FileNotFoundException)
실수로 클래스의 이름을 잘못 적음(ClassNotFoundException)
배열의 범위를 벗어난(ArrayIndexOutOfBoundsException)값이 null이 참조변수를 참조(NullPointerException)
예외란 프로그래머가 작성한 로직에 의해 발생된다. 그렇다면 프로그래머가 예외를 발생시킬수도 있을까? 있다. 추가적으로 예외에 대한 책임을 전가할수도 있다. 이게 바로 throw와 throws이다.
throw
에러를 고의로 발생시킬 때 사용한다.
예외를 강제로 발생시킨 후, 상위 블럭이나 catch문으로 예외를 던진다.
throws
자신을 호출한 상위 메소드로 에러를 던지는 역할을 한다.
예외가 발생하면 상위메서드로 예외를 던진다.
일반적으로 throws를 사용하면 try, catch 구문이 생성되지 않는 것을 확인할 수 있는데, 이 이유는 throws구문에 의해 예외에 대한 처리를 호출부로 위임하기 때문이다.
throw를 통해 예외를 발생시키고 throws는 이 예외를 밖으로 던져버리고 있다.
class A{
}
public class Test {
public static void main(String[] args) {
A a = new A();
System.out.println(a); // String s = String.valueOf(x); -> s가 주소 뿌림
}
}
println의 class에 진입하면, printStream
의 class에 String s = String.valueOf(x);
의 형태로 선언이 되어있다. valueOf(x)
~ String
class로 올라가면 toString
을 선언하고 있다. toString
을 포함하고 있는 Object class에 toString의 함수가 선언되어 있는데, return getClass().getName() + "@" + Integer.toHexString(hashCode());
으로 반환한다. 이는 클래스 getClass()
의 이름getName()
을 출력하고 이와 구분하는 문자 @
를 기준으로 정수의 형태인 hashCode를 Hex문자열Integer.toHexString(hashCode())
을 반환한다.
이름 : 김다정
나이 : 20
주소 : 서울시 관악구
학교 : 동양서울대학교
학과 : 전산정보학과
8학기 학점을 순서대로 입력하세요
1학기 학점 → 3.37
2학기 학점 → 3.89
3학기 학점 → 4.35
4학기 학점 → 3.76
5학기 학점 → 3.89
6학기 학점 → 4.26
7학기 학점 → 4.89
8학기 학점 → 3.89
8학기 총 평균 평점은 4.0375점입니다.
package Test;
//- 클래스 Person
//* 필드 : 이름, 나이, 주소 선언
public class Person {
protected String name;
protected int age;
protected String address;
public void print() {
System.out.println("이름 : " +name);
System.out.println("나이 : "+age);
System.out.println();
System.out.println("주소 : "+address);
}
}
package Test;
import java.util.Scanner;
//- 클래스 Student
//* 필드 : 학교명, 학과, 학번, 8개 평균평점을 저장할 배열로 선언
//* 생성자 : 학교명, 학과, 학번 지정
//* 메소드 average() : 8개 학기 평균평점의 평균을 반환
public class Student extends Person {
private String schoolName;
private String major;
private int studentID;
private double[] avgGrade = new double[8];
public Student(String name, int age, String add, String schName, String mj, int sID) {
this.name = name;
this.age = age;
this.address = add;
this.schoolName = schName;
this.major = mj;
this.studentID = sID;
print();
}
public double average() {
double sum = 0;
double avg = 0;
for (double d : avgGrade) {
sum += d;
}
avg = sum / avgGrade.length;
return avg;
}
public void setGrade() {
Scanner sc = new Scanner(System.in);
System.out.println(avgGrade.length + "학기 학점을 순서대로 입력하세요.");
for (int i = 0; i < avgGrade.length; i++) {
avgGrade[i] = sc.nextDouble();
System.out.println((i + 1) + "학기 학점 -> " + avgGrade[i]);
}
System.out.println(avgGrade.length + "학기 총 평균 평점은 " + average() + "점 입니다.");
sc.close();
}
@Override
public void print() {
// TODO Auto-generated method stub
super.print();
System.out.println("학교 : " + schoolName);
System.out.println("학과 : " + major);
System.out.println("학번 : " + studentID);
}
}
package Test;
public class Test {
public static void main(String[] args) {
// - 클래스 Person과 Student
// - 프로그램 테스트 프로그램의 결과 : 8개 학기의 평균평점은 표준입력으로 받도록한다.
// 이름 : 김다정
// 나이 : 20
//
// 주소 : 서울시 관악구
// 학교 : 동양서울대학교
// 학과 : 전산정보학과
// 학번 : 20132222
// ----------------------------------------
int i = 8;
Student student = new Student("김다정", 20, "서울시 관악구", "동양서울대학교", "전산정보학과", 20132222);
student.print();
System.out.println();
student.setGrade();
// 8학기 학점을 순서대로 입력하세요
//
// 1학기 학점 → 3.37
// 2학기 학점 → 3.89
// 3학기 학점 → 4.35
// 4학기 학점 → 3.76
// 5학기 학점 → 3.89
// 6학기 학점 → 4.26
// 7학기 학점 → 4.89
// 8학기 학점 → 3.89
//
// ----------------------------------------
//
// 8학기 총 평균 평점은 4.0375점입니다.
}
}