-
- 예외처리란(Exception, Error Handling)
- 코드를 완벽하게 짰다고 해서 항상 프로그램이 성공적으로 도는 것은 아닙니다. 다양한 예외 상황이 발생할 수 있는데요. 이것에 대응하기 위해서 예외 처리 코드가 필요합니다.
- 예외처리의 목적
- 예외의 발생으로 인한 실행 중인 프로그램의 비정상 종료를 막기 위해서
- 개발자에게 알려서 코드를 보완할 수 있도록 하게 위해서
- 자바에서는 상속을 이용해서 모든 예외를 표현합니다. 모든 예외 클래스는 Throwable의 자손 클래스 입니다.
- Throwable 에는 크게 두 종류의 자식 클래스가 있습니다.
- Error 는 프로그램이 종료되어야 하는 심각한 문제를 표현합니다. 대부분 컴퓨터나 JVM이 시스템적으로 동작할 수 없는 상황을 표현합니다
- 💡 Java는 JVM내의 Heap이라는 메모리 공간을 운영체제로부터 할당 받아 사용합니다. 할당 받을 수 있는 최대 메모리 이상을 사용하면, JVM이 다운될 수 밖에 없습니다. 이 경우 OutOfMemoryError가 나면서 프로그램이 종료됩니다. 자바의 대표적인 에러 상황으로 줄여서 OOM이라고도 합니다.
- Exception 은 프로그램이 종료되지는 않지만 예외나 문제상황을 표현하기 위해 사용합니다.
- 자바에 미리 정의 되어있는 예외 클래스 들이 있습니다. 기본적으로 이미 있는 것을 사용하시되, 필요한 것으로 표현할 수 없거나 구체적인 목적을 가진 예외를 정의하고 싶다면, Throwable 또는 그 하위에 있는 예외 클래스를 상속받아서 자신만의 예외 클래스를 정의할 수 있습니다. (아래 사진은 자바의 기본 예외 클래스들 중 대표적인 것들의 상속 관계도 입니다.)
- 여러분이 표현하려는 예외 상황은 대부분 Exception 종류일 것입니다.
- 실행도중 발생하는 Exception은 RuntimeException을 상속받아서 정의하세요.
- 파일을 읽고 쓰거나, 원격에 있는 저장소로부터 데이터를 읽고 쓸 때 나는 에러를 표현하려면 IOException을 상속받아서 정의하세요.
예외처리(Error Handling, Exception Handling)
Error는 프로그램이 종료되어야하는 심각한 문제를 표현.
그래서 종류가 많지 않아.
대부분 컴퓨터나 jvm이 시스템적으로 동작할 수 없는 상황을 표현하는데 사용.
ex)JAVA는 jvm 내에 힙(Heap)이라는 메모리 공간을 운영체제로 부터 할당받아 사용
할당받을 수 있는 최대 메모리 이상을 사용하면
jvm은 자기가 저장할 공간이 없으니까 죽어버릴 수 밖에 없는 것.
=>out of memory error라면서 프로그램 종료
자바의 대표적인 에러상황으로 실무자들이 줄여서 OOM이라고 얘기함.
에러가 아닌 모든 것들은 사실 excption.
catch이하는 앞에서 잡히면 뒤에서 잡지 않기 때문에
더 좁은 범위 먼저 작성(상속관계에서 자식에 해당)
public class Main {
public static void main(String[] args) {
int number = 10;
int result;
for(int i=10; i>=0; i--){
try{
result = number/i;
System.out.println(result);
}catch (Exception e){
System.out.println("Exception 발생: "+ e.getMessage());
}finally {
System.out.println("항상 실행되는 finally 구문");
}
}
}
}
=>1
항상 실행되는 finally 구문
1
항상 실행되는 finally 구문
1
항상 실행되는 finally 구문
1
항상 실행되는 finally 구문
1
항상 실행되는 finally 구문
2
항상 실행되는 finally 구문
2
항상 실행되는 finally 구문
3
항상 실행되는 finally 구문
5
항상 실행되는 finally 구문
10
항상 실행되는 finally 구문
Exception 발생: / by zero
항상 실행되는 finally 구문
import java.io.FileOutputStream;
import java.io.IOException;
public class Main {
public static void main(String[] args) {
try (FileOutputStream out = new FileOutputStream("test.txt")) {
out.write("Hello Sparta".getBytes());
out.flush();
} catch (IOException e) {
System.out.println("IOException 발생: " + e.getMessage());
e.printStackTrace();
}
}
}
=>test라는 파일 생성.(내용은 Hello sparta)
여기서 배우려고 한 건 try-with-resource
위에 걸 try-catch문으로 작성하면
import java.io.FileOutputStream;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException{
FileOutputStream out = new FileOutputStream("test.txt");
try {
out.write("Hello Sparta".getBytes());
out.flush();
} catch (IOException e) {
System.out.println("IOException 발생: " + e.getMessage());
e.printStackTrace();
}
out.close();
}
}
file은 파일을 열었다는 뜻. 그러면 항상 닫아줘야 함.
<퀴즈>
class ArrayCalculation {
int[] arr = { 0, 1, 2, 3, 4 };
public int divide(int denominatorIndex, int numeratorIndex) throws ArithmeticException, ArithmeticException {
return arr[denominatorIndex] / arr[numeratorIndex];
}
}
public class Main {
public static void main(String[] args) {
ArrayCalculation arrayCalculation = new ArrayCalculation();
System.out.println("2 / 1 = " + arrayCalculation.divide(2, 1));
try{
System.out.println("1 / 0 = " + arrayCalculation.divide(1, 0)); // java.lang.ArithmeticException: "/ by zero"
} catch (ArithmeticException arithmeticException){
System.out.println("잘못된 계산입니다. "+arithmeticException.getMessage());
}
try {
System.out.println("Try to divide using out of index element = "
+ arrayCalculation.divide(5, 0)); // java.lang.ArrayIndexOutOfBoundsException: 5
}catch (ArrayIndexOutOfBoundsException arrayIndexOutOfBoundsException){
System.out.println("잘못된 index 범위로 나누었습니다. 타당 index 범위는 0부터"+(arrayCalculation.arr.length -1+"까지 입니다."));
}
}
}
강의 자료 : https://www.notion.so/80db7f3685304ab3ac749e0e9cd29b30#1ec7e992c46b4e2c9f0c69d2fe41929e
[스파르타코딩클럽] 자바 문법 뽀개기
매 주차 강의자료 시작에 PDF파일을 올려두었어요!
www.notion.so
'항해99 > Java 문법 뽀개기' 카테고리의 다른 글
자바문법뽀개기(16) - 컬렉션(리스트, 셋, 맵) (0) | 2022.09.27 |
---|---|
자바문법뽀개기(15) - 날짜와 시간 다루기 (0) | 2022.09.27 |
자바문법뽀개기(13) - 객체지향 퀴즈 (0) | 2022.09.27 |
자바문법뽀개기(12) - 객체지향언어(추상클래스, 인터페이스) (0) | 2022.09.26 |
자바문법뽀개기(11) - 객체지향언어(접근제어자) (2) | 2022.09.26 |