코딩 기록들
[Java Programming] 10.1 예외처리 본문
- 프로그램이 동작하는 과정 중 잘못된 입력 값이 전달되거나
- 읽어야 하는 파일이 존재하지 않거나 (다음 파트 내용)
- 배열의 인덱스를 잘못 전달했거나
- Null 인스턴스에 접근을 하려했거나 등등의 이유로 오류가 발생하는데,
--> 이것을 “예외” 라고 함
--> 예외가 발생한경우 자바 프로그램은 JVM(실행중인 어플리케이션 죽여버림)에 의해 강제종료됨
- 예외처리 : 어플리케이션이 죽지않게 코드를 방어적으로 쓰는것
- 예외가 발생하더라도 프로그램이 종료되지 않도록 하는 방법이면서 + 예외가 발생하지 않도록 하는 방어코딩의 방법
(예외가 발생하더라도 jvm에서 강제종료 시키지 않고, 프로그래밍이 핸들링하도록 하게 하는것)
* NullPointerException *
String adress = null;
System.out.println(address.contains("서울")); //NullPointerException
-> null값인 메모리에 접근하려 했다
* NumberFormatException *
String name = "홍길동";
if(name.matches("^[0-9]+$")){ //name이 0~9까지의 숫자로 시작해서 끝난다면
int number = NumberUtil.convertToInt(name);
System.out.println(number); // 예외가 발생하지 않고 정상적인 흐름으로 넘어감 (출력x, 예외x, 다음코드로 넘어감)
* ArrayIndexOutOfBoundException *
int[] scoreArray = new int[3]; // index = 0,1,2
scoreArray[3] = 3; //존재하지 않는 3번인덱스에 3을 할당하면
//ArrayIndexOutOfBoundException 발생
자바에서 자주 발생하는 예외 (많이 발생하는 순서)
- 배열의 인덱스 범위를 벗어남 : 찾으려는 인덱스가 존재하는지 먼저 확인 함 (length를 구해 내가 접근하려는 인덱스가 범위내에 있는지 물어보고, 방어)
ex) 0보다 작거나 배열길이-1 보다 클 경우
- List의 인덱스 범위를 벗어남 : 찾으려는 인덱스가 존재하는지 먼저 확인
ex) 나이적을때 50을 "쉰" 이라고 적을 경우
--> 이렇게 먼저 확인하는 코드를 “Validation Logic” 이라고 하며 “입력값 검증“ 이라고 표현
예외를 읽는 방법
(stack trace) : 가장 마지막에 있는게 먼저 호출된 것
- 예외내용은 내가만든 파일중에서 상단에있는걸로 보기
if를 활용한 예외처리
- 가장 현명한, 심플한 방법
- 접근하려고하는 인스턴스가 null 값을 가질지 아닐지 확인해줌
this.prodcutArray = null; // nullpointerexception 발생함
if (this.productArray != null) {
this.productArray[0] = new Product();
this.productArray[0].setName("제로펩시");
this.productArray[0].setPrice(1600);
this.productArray[0].setQuantity(50);
if (this.productArray.length > 1) {
this.productArray[1] = new Product();
this.productArray[1].setName("제로콜라");
this.productArray[1].setPrice(1500);
this.productArray[1].setQuantity(30);
}
if (this.productArray.length > 2) { // 이걸 실행하게되면 예외 발생하지 않음
this.productArray[2] = new Product();
this.productArray[2].setName("제로스프라이트");
this.productArray[2].setPrice(1400);
this.productArray[2].setQuantity(20);
}
IfStringIndexOutOfBoundsException 예제
- "\\" 는 이스케이프코드가 포함된것. " \ " 1글자임
- lastIndexOf : 문자의 마지막 인덱스
1.logoFilePath 인스턴스에서 logo.png만 추출해 출력
- substring + indexOf + lastIndexOf 함께 사용해서 풀기
- 1. // 의 마지막위치 찾아서 -> 2. 그다음 모든것들 출력하는 방법
String logoFilePath = "C:\\images\\logo.png";
int lastIndexOfBackSlash = logoFilePath.lastIndexOf("\\") + 1;
String filename = logoFilePath.substring(lastIndexOfBackSlash);
System.out.println(filename);
2.logoFilePath 인스턴스에서 "images"만 추출해 출력
int indexOfBackSlash = logoFilePath.indexOf("\\") + 1;
int lastIndexOfBackSlash1= logoFilePath.lastIndexOf("\\");
String word1 = logoFilePath.substring(indexOfBackSlash, lastIndexOfBackSlash);
System.out.println(word1);
int indexOfImages = logoFilePath.indexOf("images");
String directoryName = logoFilePath.substring(indexOfImages, lastIndexOfBackSlash -1);
System.out.println(directoryName);
3.logoFilePath 인스턴스에서 user_images 만 추출해 출력(없지만, 동작하도록 예외처리)
if(logoFilePath.contains("user_images")){
int indexOfUserImages = logoFilePath.indexOf("user_images");
//if (indexOfUserImages >= 0) { // 이게 -1이라면 이값은 없는값이다.
directoryName = logoFilePath.substring(indexOfUserImages, lastIndexOfBackSlash -1);
// indexOfUserImages = -1 이 나옴(값이 없으므로) -> -1 이라는 인덱스는 존재하지않기때문에 예외발생
System.out.println(directoryName);
}
4.logoFilePath 인스턴스에서 확장자("png") 만 추출해 출력 (-> 점의 마지막 인덱스 구하기!)
int point = logoFilePath.lastIndexOf(".")+1;
String word3 = logoFilePath.substring(point);
System.out.println(word3);
5.donwloadFilePath 인스턴스에서 파일의 확장자를 추출해 출력
// 윈도우는 반드시 확장자가 있지만, 리눅스 등등은 확장자가 없는 파일이 존재함
String downloadFilePath = "C:\\images\\logo";
if(downloadFilePath.contains(".")) {
int lastIndexOfDot = downloadFilePath.lastIndexOf(".") + 1; //확장자는 . 의 유무로 찾기 때문
String extensionName = downloadFilePath.substring(lastIndexOfDot);
System.out.println(extensionName);
}
'Java' 카테고리의 다른 글
[Java Programming] 10.3 사용자 예외 발생시키기 (1) | 2024.01.30 |
---|---|
[Java Programming] 10.2 예외처리 (try~catch, finally, throw) (2) | 2024.01.30 |
[Java Programming] 9.2 익명 클래스 (0) | 2024.01.29 |
[Java Programming] 9.1 추상화, 인터페이스 (1) | 2024.01.29 |
[Java Programming] 8.2 다형성 (메소드 오버라이딩) (0) | 2024.01.26 |