예외, 에러 처리
예외처리 목적 :
예외처리의 목적 예외의 발생으로 인한 실행 중인 프로그램의 비정상 종료를 막기 위해서
개발자에게 알려서 코드를 보완할 수 있도록 하게 위해서
자바에서는 상속을 이용해서 모든 예외를 표현합니다.
모든 예외 클래스는 Throwable의 자손 클래스 입니다.
Throwable
1)Error (프로그램이 종료되어야하는 심각한 문제)
컴퓨터나 JVM이 시스템 적으로 동작할 수 없는 상황을 표현
JAVA는 JVM내 힙(Heap)이라는 메모리 공간을 운영체제로 부터 할당 받아서 사용하는데, 할당 받을수 있는 최대 메모리 이상을 사용하면 JVM은 자기가 저장할 공간이 없으니 죽어버림.
이 경우 나는 에러를 out of memory error(OOM)라고 하며 프로그램이 종료.
2)Exception(Error가 아닌 모든 상황)
:프로그램이 종료되지는 않지만 이 외 문제상황을 표현하거나 다루어야 하는 경우에 사용
JAVA에 미리 정해져있는 Exception의 하위 클래스. ( 다는 아니고 대표적인 것)
1.RuntimeException : 실행 중 일어날수 있는 에러를 표현하는데 사용
2.IOException : 파일을 읽고 쓰거나, 원격에 있는 저장소로부터 데이터를 읽고 쓸 때 나는 에러를 표현
try-catch(-finally) 형식
어떤 숫자를 0으로 나눌 시, 자바에서는 잘못된 수식이라고해서 예외 발생
//try-catch(-finally) 형식
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()); // #1
} finally {
System.out.println("항상 실행되는 finally 구문");
}
}
}
}
/*
여러 catch 블럭이 올 수 있음.
이중 발생 한 예외의 종류와 일치하는 단 한개의 eatch 블럭만 수행.
좁은범위가 위쪽, 넓은 범위가 아래쪽 순서로. (잡히면 그 뒤는 수행이 안되기 때문.)
일치한 catch블럭이 없으면 예외처리 안됨.
*/
// #1 _ e.getMessage() : 모든 Exception은 예외의 이유를 설명하는 글자가 담겨 있다.
try-with-resource 형식 (https://codechacha.com/ko/java-try-with-resources/)
그냥 이런게 있다. 정도만 알고 넘어가자..그냥 파일만들어서 참고하는 예시 보여주시려고 설명하신듯...
스트림 : 데이터 소스 추상화, 데이터를 다루는데 자주 사용되는 메서드들의 정의.
스트림을 써서 하는 부분인듯...
import java.io.FileOutputStream;
import java.io.IOException;
public class Main {
public static void main(String[] args) {
try (FileOutputStream out = new FileOutputStream("test.txt")) {
// test.txt file 에 Hello Sparta 를 출력
out.write("Hello Sparta".getBytes());
out.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/*
에러가 발생하지 않더라도 에러 핸들링에 대한 코드가 필요할수 있다.
try-with-resource라는 구문을 배우려고 했다.
아까는 try 뒤에 {} 있었는데, 지금은 ()있어서 거기게 새로운 변수를 할당하는 코드가 있죠 ?
근데 이 새로운 모든 변수에 대해서 쓰는 것이 아니라 이것을 FileOutputStream의 정의를 보면
class FileOutputStream extends OutputStream
⊂ public abstract class OutputStream implements Closeable, Flushable
⊂ public interface Closeable extends AutoCloseable
( ) 안에는 Closeable 인터페이스를 구현한 클래스만 올 수 있다.
라는데.. 그 인터페이스가 뭔지 모르겠다.
쓸 때 검색해서 들어가야하나??..
강의할때는 Closeable 인터페이스, 강의자료는 AutoCloseable 인터페이스를 구현한 객체 선언하면 사용할수 있다. 라고 하시는데..
AutoClosable 인터페이스
AutoClosable 인터페이스에는 예외가 발생할 경우 close()메소드를 호출하기로 정의되어있기 때문에 사용.
한다는데.. 훔.. 모르겠다. 그 있는걸 어떻게 알지? 일일이 검색해서 사용하나?
import java.io.FileOutputStream;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException { //Exception 이 발생할수 있다는 시그니쳐가 붙고
FileOutputStream out = new FileOutputStream("test.txt"); //파일을 생성함.. (밑에 관련 설명 링크)
try {
// test.txt file 에 Hello Sparta 를 출력
out.write("Hello Sparta".getBytes());
out.flush();
} catch (IOException e) {
e.printStackTrace();
}
out.close(); //파일을 쓴다는것은 열었다는 뜻으로 닫아줘야함.
}
}
메소드에서의 예외 선언
void method() throws IndexOutOfBoundsException, IllegalArgumentException {
//메소드의 내용
}
/*
catch 문을 이용해서 예외처리를 하지 않은 경우, 메소드에 throws라는 키워드를 통해서 예외가 발생할수 있다는 것을 알려줌
그래서 그 함수를 call하는 caller쪽에서 그 에러를 핸들링 할 수 있도록
만약에 메소드를 이렇게 void method를 만드셔서 선언하셨다면 이 메소드를 호출하는 caller 쪽에서는
Exception이 발생하면 catch문이나, 다른 동작을 구현해줘야 자바는 안전한 코드라고 인정해서 실행 가능
*/
오늘한 일
1.알고리즘 테스트 (
느낀 점
너무 쓸데없는 고민을 많이하고, 생각도 많이 하고, 집착이 많다. 머리가 좋으면서 집착을 하면 괜찮겠건만, 영양가가 너무 없이 시간을 보내는것 같다. 내가 궁금해서 집착하던게 다른분께 여쭤보면 그냥 넘어갔다고 하시거나, 잘못 본 경우, 혹은 또 너무 쉽게 해결되어도 스스로가 한심스럽게 느껴진다.
진짜 문의드렸을때 설명해주셔도 이해를 못 할것 같아 한 문장으로 대답 해주시겠다 싶은거만 여쭤보러가는데....
그렇지 못한 것들은 검색하는 것도 힘들고, 내용을 봐도 이해가 안되고, 하루종일 예외처리 관련 검색을 했지만.. 머릿속에 남는 것은 없는..... 그래서 도달한 결론이 "공부하다보면 내용들 이해 되겠지." 라는게 너무 한심하게 느껴진다...
강의를 들어도 이해가 안되다보니 내용정리가 안 되서 듣다 만 기분으로 적는 것도 너무 기분 나쁘다.
내일 할 일
진짜 진짜 진짜로 자바 강의 다 듣기, 검색 금지, 집착 금지, 진짜 강의만 보기.
'TIL' 카테고리의 다른 글
| 22.11.18_TIL_내배캠 (0) | 2022.11.18 |
|---|---|
| 22.11.17_TIL_내배캠 (1) | 2022.11.18 |
| 22.11.15_TIL_내배캠 (0) | 2022.11.16 |
| 22.11.14_TIL_내배캠 (0) | 2022.11.14 |
| 22.11.13_TIL (0) | 2022.11.13 |