목차
● 1. Error & Exception.
● 2. 예외(Exception)
● 3. 예외처리(1) try & catch
● 4. 예외처리(2) try & catch
● 5. 예외 처리 catch문 유용한 메서드
● 6. 예외 종류( CheckedException & UnCheckedException )
● 7. final구문
● 8. throws구문
1. Error & Exception
자바에서는 문제를 크게 Error, Exception 두 가지로 구분을 한다.
1. Error
개발자가 직접 처리할 수 없는 문제를 의미한다. ( 메모리, 운영체제, 하드웨어, 외부적인 요인으로 생기는 문제 )
즉, 작업을 하는 환경의 문제가 생긴 것을 의미하며 이러한 것은 프로그램상 해결방법이 존재하지 않는다.
2. Exception
개발자가 직접 처리할 수 있는 문제를 의미한다.( 프로그램상 코드의 문제가 발생하는 것을 Exception(예외)라고한다. )
쉽게 말해 자바로 직접 코드를 짜다가 의도한 것과 다른 상황에 직면했을 때 생기는 문제를 예외라고 하는 것입니다.
예시 ) File을 읽어오는 코드를 짰는데 해당 파일이 존재하지 않는다거나, 예상못한 값을 외부에서 입력 받을때 생기는 문제
이러한 예상 못한 문제가 터졌을 때 알려주는 것이 자바에서 Exception 입니다.
2. 예외(Exception)
// 가장 간단하면서 대표적인 코드로 예시를 보여주겠습니다.
public static void main(String[] args) {
System.out.println(2/0); // 결과 : ArithmeticException( 숫자관련 예외 )
// 자바에서는 0을 나누게 되면 예외가 발생한다.(오류)
}
// 해당 오류의 결과로 아래와 같이 콘솔에 찍히게 된다.
Exception in thread "main" java.lang.ArithmeticException: / by zero
at xxx.xxxx.xxxxxxxx.main(ExceptionApp.java:2)
코드의 예시에서 콘솔의 결과를 확인해보면 java.lang.ArithmeticException와 같이 패키지 경로의 클래스의
디렉토리를 명시를 해주고 있다. 이 처럼 콘솔에 찍히는 모든 예외(오류)자체도 자바에서 만들어진 클래스
즉, JRE에 포함된 내장 라이브러리 라고 생각하면 될 것 이다.
이러한 예외 클래스는 개발자가 확장하여 사용자 정의 예외를 만들 수도 있게 된다.
3. 예외 처리 ( 1 )
예외를 처리하는 이유는 자바에서 만들어진 예외가 발생하면 프로그램상 중단이 돼기 때문에 웹 앱의 경우 프로그램의
중단으로 많은 사용자의 피해가 갈 수 있으므로 이러한 예외를 처리함으로 써 지속적으로 프로그램이 동작할 수 있게
만들어주는 것이 이유가 될 수 있다. ( 서비스의 안정성과 신뢰성을 저해할 수 있으므로 미연에 방지를 하는 것 )
public static void main(String[] args) {
try {
System.out.println(2/0);
} catch(ArithmeticException e) {
System.out.println("해당 예외가 발생했을때 대체 역할");
}
System.out.println("다음 코드");
}
// 출력결과
// 해당 예외가 발생했을때 대체 역할
// 다음 코드
// 즉, 예외발생을 처리함으로 써 프로그램의 중단없이 다음 코드로 넘어갈 수 있게된다.
예외 처리라는 것은 단순하게 예외를 처리하는 것이다.
try ~ catch
자바에서 제공하는 try ~ catch문을 통해 예외를 처리할 수 있다. 예시 코드를 보면 try안에 예외가 발생할
구문이 들어간 것을 확인할 수 있을 것이다. 이 처럼 예외가 발생할 수 있는
코드는 try안에 넣어 주면 된다. catch구문을 보면 catch(ArithmeticException e)인 것을 볼 수 있다.
앞에 ArithmeticException는 클래스 이름이며 예외가 발생할 클래스의 이름을 넣어주고 뒤에 e는 변수명이다.
이러한 과정을 통해 예외를 처리함으로 써 다음코드인 System.out.println("다음 코드"); 구문의 실행이 가능하다.
즉, 예외발생을 처리함으로 써 프로그램의 중단없이 다음 코드로 넘어갈 수 있게되는 것이다.
4. 예외 처리 ( 2 )
예외를 한개만 보여줘서 와닿지 않을 수 있어서 하나의 예외를 더 다뤄보도록 하겠습니다.
public static void main(String[] args) {
int[] scores = {100, 200, 300};
System.out.println(scores[3]); // 배열의 3번째 인덱스 접근 후 출력
// 배열의 크기는 3칸이 맞는데 인덱스로 보면 0 , 1 , 2 이기때문에 3의 크기의 칸은 존재하지 않는다.
}
// 출력 결과
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
at xxxxx.xxx.ExceptionApp.main(ExceptionApp.java:3)
코드 예시를 보면 ArrayIndexOutOfBoundsException라는 예외클래스가 호출이 된 것을 알 수 있습니다.
이 코드의 문제는 배열의 크기의 맞지않는 값을 출력하려고 했기에 오류가 발생한 것 입니다.
이러한 예외 또한 처리하는 방법은 동일합니다.
public static void main(String[] args) {
int[] scores = {100, 200, 300};
try {
System.out.println(scores[3]);
} catch(ArrayIndexOutOfBoundsException e) {
System.out.println("배열의 index크기를 넘었습니다.");
}
System.out.println("다음 코드");
}
// 출력결과
// 배열의 index크기를 넘었습니다.
// 다음 코드
출력결과를 살펴보면 잘 나오는 것을 확인 할 수 있다.
5. 예외 처리 catch문 유용한 메서드
1. e.printStackTrace() => 예외가 발생할 경우 전체적인 예외의 대한 상세적인 오류 메시지를 알려주는 메서드이다.
2. e.getMessage() => 예외발생의 이유를 알려주는 메서드이다.
6. 예외 종류 ( CheckedException & UnCheckedException )
1. Checked Exception
컴파일러가 체크를 해주는 Exception이다.
즉, 런타임 실행을 안하더라도 사전에 코드상에서 오류를 알려준다. ( 예외처리하면 된다. )
컴파일 단계에서 알려주는 Exception의 대표적인 예 ) IOException과 상속받는 FileNotFoundException 등등이 존재한다.
2. UnChecked Exception
컴파일러가 체크를 안해주는 Exception이다.
즉, 런타임 과정에서 코드상 오류가 발생하여 나타나는 오류로써 대표적으로 위에서 보았던ArrayIndexOutOfBoundsException, ArithmeticException 등등이 존재한다. 이 두 Exception은 RuntimeException의 객체를
상속을 받는 클래스이다. 즉, RuntimeException은 런타임시에 나타나는 오류라는 점을 알 수 있습니다.
7. final구문
자바로 프로그래밍을 하다보면 종종 외부에서 리소스를 받아서 사용하는 경우가 비일비제하다.
이럴때는 대표적으로 자바에서 IOException 예외가 발생하곤 한다.
이렇게 외부에서 리소스를 받아서 사용하는데 리소스를 붙잡는 경우가 존재한다. 대표적으로 데이터베이스의 Connection과 같은 DB의 연결을 프로그램이 종료 될때까지 유지를 시키고는 한다. 이럴때 close메서드를 통해 예외처리 구문에서
끊어줄 때 사용하는 것이 final구문이다.
public static void main(String[] args) {
FileWriter f = null; // finally구문에서 받으려고 외부에 공유가 가능한 변수를 선언 및 초기화
// try에 선언하면 지역변수가 되어서 finally 구문 내부에서 변수를 못받는다.
try {
f = new FileWriter("data.txt"); // 파일 생성 구문
f.write("Hello"); // 여기서 바로 catch문으로 가기때문에 밑에 구문을 실행을 안함.
// f.close(); => 즉, close가 안된다.
} catch(IOException e) {
e.printStackTrace();
} finally {
if(f != null) { // f가 null이 아닐 경우 즉, 값이 존재하는 경우에만 실행을 해주겠다.
try {
f.close(); // close메서드를 통해 파일과의 연결을 닫아준다.
// try의 Exception이 발생 하던 안하던 무조건 finally구문을 실행을 하게 된다.
} catch(IOException e) { // f.close() 또한 예외처리가 발생할 수 있으므로 처리.
e.printStackTrace();
}
}
}
}
8. throws 구문
throws 이것을 사용하는 이유는 개발자가 자신이 만든 메서드가 다른 사람이 호출할때 예외가 발생 할 메서드라는게 판단이되면 해당 예외객체를 "throws 예외클래스" 를 넣어 알려줄 수 있다.
// Main클래스 >
public static void main(String[] args) {
Test t = new Test();
try {
t.calculate(3, 0) // => 3 / 0 => ArithmeticException 뜰 예정
} catch (ArithmeticException e) {
System.out.println("0을 나누면 안됩니다!!");
}
}
// Test클래스 >
public int calculate(int number1, int number2) throws ArithmeticException {
return number1 / number2;
}
// 이런식으로 타 객체의 메서드를 호출 할 때 throws키워드와 발생할 예외 (ArithmeticException)를
// 명시를 해줄 수 있다.
'Java' 카테고리의 다른 글
[Java] 변수 초기화에 대한 이해 (0) | 2024.11.05 |
---|---|
[Java] Annotation 이란? ( 애노테이션 ) (0) | 2024.11.05 |
[Java] JVM 동작 원리 (0) | 2024.10.23 |
[Java] 클래스와 객체의 정의 (9) | 2024.10.05 |
[Java] 상속 ( Extends ) (1) | 2024.05.01 |