class Calculator{
int left, right;
public void setOprands(int left, int right){
this.left = left;
this.right = right;
}
public void divide(){
// 계산 결과 오류 발생: / by zero
try{ // try { 예외 예측되는 로직 }
System.out.print("계산결과는 ");
System.out.print(this.left/this.right);
System.out.print(" 입니다.");
} catch ( Exception e) { // 에러발생시 실행됨
// 매개변수(Exception e)로는 에러에 대한 정보를 담고있는 객체
// 데이터타입은 Exception이라는 클래스
System.out.println("오류 발생: "+ e.getMessage());
//Exception이라는 클래스 안에 .getMessage() 메소드가 포함되어있음
}
}
}
public class Main {
public static void main(String[] args) {
Calculator c1 = new Calculator();
c1.setOprands(10, 0);// error: 10을 0으로 나누려고해서
c1.divide();
}
}
// 실행결과
java.lang.ArithmeticException: / by zero
class Calculator{
int left, right;
public void setOprands(int left, int right){
this.left = left;
this.right = right;
}
public void divide(){
try {
System.out.print("계산결과는 ");
System.out.print(this.left/this.right);
System.out.print(" 입니다.");
} catch(Exception e){
System.out.println("\n\ne.getMessage()\n"+e.getMessage());
System.out.println("\n\ne.toString()\n"+e.toString());
System.out.println("\n\ne.printStackTrace()");
e.printStackTrace();
}
System.out.println("end"); // 오류 발생시, catch 실행 후 catch 바깥의 로직도 이어서 실행됨
}
}
class Main {
public static void main(String[] args) {
Calculator c1 = new Calculator();
c1.setOprands(10, 0);
c1.divide();
}
}
class A{
private int[] arr = new int[3];
A(){
arr[0]=0;
arr[1]=10;
arr[2]=20;
}
public void z(int first, int second){
try{
System.out.println(arr[first] / arr[second]);
}
catch(ArithmeticException e){ // 예외 경우 1
System.out.println("ArithmeticException e");
}
catch(ArrayIndexOutOfBoundsException e){ // 예외 경우 2
System.out.println("ArrayIndexOutOfBoundsException e");
}
catch(Exception e){ // 위 두 catch에 해당안되는 건 다 이거로 처리 (마지막에 써야!)
System.out.println("Exception");
}
}
}
class Main {
public static void main(String[] args) {
A a = new A();
a.z(10, 0); // 배열 범위3를 넘어가는 경우
a.z(1, 0); // 0으로 나누려는 경우 (Math오류)
a.z(2, 1);
}
}
class A{
private int[] arr = new int[3];
A(){
arr[0]=0;
arr[1]=10;
arr[2]=20;
}
public void z(int first, int second){
try {
System.out.println(arr[first] / arr[second]);
} catch(ArrayIndexOutOfBoundsException e){
System.out.println("ArrayIndexOutOfBoundsException");
} catch(ArithmeticException e){
System.out.println("ArithmeticException");
} catch(Exception e){
System.out.println("Exception");
} finally { // 매번 항상 실행
System.out.println("finally");
}
}
}
class Main {
public static void main(String[] args) {
A a = new A();
a.z(10, 0);
a.z(1, 0);
a.z(2, 1);
}
}
실행 결과
ArrayIndexOutOfBoundsException
finally
ArithmeticException
finally
2
finally
예를 들어 데이터베이스를 사용한다면 데이터베이스 서버에 접속해야 한다. 이때 데이터베이스 서버와 여러분이 작성한 에플리케이션은 서로 접속상태를 유지하게 되는데 데이터베이스를 제어하는 과정에서 예외가 발생해서 더 이상 후속 작업을 수행하는 것이 불가능한 경우가 있을 수 있다. 예외가 발생했다고 데이터베이스 접속을 끊지 않으면 데이터베이스와 연결 상태를 유지하게 되고 급기야 데이터베이스는 더 이상 접속을 수용할 수 없는 상태에 빠질 수 있다. 접속을 끊는 작업은 예외 발생여부와 상관없기 때문에 finally에서 처리하기에 좋은 작업이라고 할 수 있다. 말하자면 finally는 작업의 뒷정리를 담당한다고 볼 수 있다.