- 강의
- 49강(big picture) ~ 52강(예외처리)
품질 좋은 코드
- 성능이 좋은 코드
- 데이터와 사용자가 늘어나도 한정된 리소스를 통해 활용 가능
- 버그와 예외 방어하는 안전한 코드
- 악의적 요청(해킹) 대응
- 특정 시스템의 사고 발생 대처
- 가독성과 코드 재사용성이 좋은 코드
- 요구사항 변경 대응 ↑
- 협업에 좋음
버그 처리
- 자바 입출력
- 로컬 파일 입출력
- 프로토컬을 사용한 외부 입출력(ex. API)
- 버그(Throwable 클래스)
- 오류(error)
- 통제 불가능
- 실행하는 컴퓨터 자체의 문제
- JVM 오류
- 예외(exception)
- 통제 가능
- Check Exception : 무조건 처리해야하는 예외
- Uncheck Exception : 처리하지 않아도 되는 예외
- 발생 원인
- 개발자 코드 실수
- 코드상으로는 구현되지만 비즈니스적으로(논리적으로) 맞지 않은 요청
- 외부 환경 변화 ex) 외부 인프라 사고 발생, 읽고 있는 file 수정
- 오류(error)
- Error와 Exception 던지기
- class에 Throwable 상속받아서 구현 가능
- 에러나 예외를 미룰 경우에 메서드에 throws 키워드 사용하기
- throw new [발생시킬 에러 또는 예외]();
class MyThrowable extends Throwable {
...
}
class CustomerThrower
public void anotherMethod() throws MyThowable {
throw new MyThrowable();
}
]
Try-Catch-Finally문
- try-catch-finally 예외처리
- try문 : 예외가 발생할 것 같은 구문
- catch문
- 예외가 발생할 때 동작하는 구문
- 여러 개의 Catch문 사용 가능
- finally문
- 예외가 발생 여부와 상관없이 동작하는 구문
- 리소스 해제할 때 사용
- 필수 X
- try-catch 다중 예외처리
- 여러 개의 catch문을 사용해서 여러 예외를 처리하는 방법
- Catch문에 Exception(상위 클래스)를 이용해서 모든 예외 잡기
- | 연산자를 이용해서 여러 개의 예외를 한꺼번에 잡기
try {
// FileNoutFoundException 발생
FileInputStream fs = new FileInputStream("src/test.txt");
// ArithmeticException 발생
int i = 0;
int data = 10 / i;
// NullPointException 발생
String str = null;
System.out.println(str.toUppterCase());
// ArrayIndexOutOBoundsException 발생
int[] arr = new int[10];
System.out.println(arr[10]);
} catch (FileNotFoundException e) {
System.out.println("FileNotFoundException 발생");
e.printStackTrace();
} catch(NullPointException | ArithmeticException e) {
System.out.println("NullPointException 또는 ArithmeticException 발생");
e.printStackTrace();
} catch(Exception e) {
System.out.println(e);
e.printStackTrace();
} finally {
fs.close(); // 리소스 해제
System.out.println("무조건 실행되는 finally 구문");
}
- 리눅스 명령어
- lsof -c java | grep test.txt : 열려있는 java가 사용하는 리소스 중 test.txt 가 있는지 검색검색
- lsof : 열려있는 파일 나열
- grep : 텍스트 검색 명령어, 특정 패턴과 일치하는 파일 검색 명령어
- try-with-resource과 AutoCloseable
- AutoCloseable : 자원 리소스 해제를 하지 않아도 자동으로 리소스를 해제하는 인터페이스
- FileInputStream이 AutoCloseable을 상속받아서 구현된 클래스
- try()의 () 안에 작성하면 try-catch문 종료 시 자동으로 리소스 해제됨
- AutoCloseable : 자원 리소스 해제를 하지 않아도 자동으로 리소스를 해제하는 인터페이스
try(FileInputStream fs = new FileInputStream("src/test.txt")) {
}
} catch(Exception e) {
System.out.println(e);
e.printStackTrace();
}
예외
예외 미루기
- 메서드를 호출하는 곳에서 예외를 처리할 수 있도록 하는 방법
- method에 thorows 키워드를 통해서 미룰 예외 선언
- 사용 이유 : 예외를 한꺼번에 예외를 처리하기 위해서
- 주의사항
- main 메서드에는 예외 미루기 사용 X
- main 메서드가 가장 최종적으로 사용되는 메서드이므로 예외 미루기를 할 경우에는 예외 처리 불가능
class CustomerThrower
public static void main(String args[]) {
try() {
anotherMethod();
} catch(IOException e) {
e.printStackTrace();
}
}
public static void anotherMethod() throws IOException {
System.out.println("예외 미루기");
}
]
예외 던지기
- 예외 발생시키기
- 함수 반환형과 상관없이 예외 던지기 가능
- 예외 던지기가 되면 아래의 구문은 동작X
- if문과 예외 미루기와 함께 사용
- 방법 : throw new ArithmeticException("에러 메세지 던지기");
- throw를 통해서 예외 던지기
- new를 통해서 객체 생성
- 예외 클래스의 생성자에 메세지 담기
사용자 정의 예외 던지기
- 사용자가 직접 정의한 예외 발생시키기
- 여러 예외가 발생할 수 있는 상황에 대비해서 사용자가 직접 예외를 정의함으로써 상황에 맞춘 예외 발생 가능
- RuntimeException을 상속받아 정의하기
// 사용자 정의 예외 던지기
public class PositiveNumberException extends RuntimeException {
public PositiveNumberException(String message) {
super(message);
}
}
public class Main {
public static void main(String[] args) {
int age = -1;
if(age < 0) throw new PositiveNumberException("나이는 0 이상");
}
}
실무에서 예외처리 사용
- 예외 발생 로그 기록 남기기
- 예외 발생 알림 설정
'슈퍼코딩 > 주특기(JAVA)' 카테고리의 다른 글
2024.05.13(월) 슈퍼코딩 신입연수원 7주차 Day 1 후기 - Enum, Optional, DataTime (0) | 2024.05.13 |
---|---|
슈퍼코딩 신입연수원 6주차 후기 (0) | 2024.05.11 |
2024.05.09(목) 슈퍼코딩 신입연수원 6주차 Day 4 후기 - Collection(List, Set, Map), Hash, Tree (0) | 2024.05.09 |
2024.05.08(수) 슈퍼코딩 신입연수원 6주차 Day 3 후기 - Wrapper, Generic (0) | 2024.05.08 |
2024.05.07(화) 슈퍼코딩 신입연수원 6주차 Day 2 후기 - JVM 메모리, GC, Object, 기본 클래스 (0) | 2024.05.07 |