코딩 기록들

[Java Programming] 10.1 예외처리 본문

Java

[Java Programming] 10.1 예외처리

코딩펭귄 2024. 1. 30. 13:05

- 프로그램이 동작하는 과정 중 잘못된 입력 값이 전달되거나

- 읽어야 하는 파일이 존재하지 않거나 (다음 파트 내용)

- 배열의 인덱스를 잘못 전달했거나

- 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 발생

 

자바에서 자주 발생하는 예외 (많이 발생하는 순서)
1. NullPointerException - Null Instance에 접근하려 함
- (".") 을 통해 레퍼런스타입에 접근하지만, 이 레퍼런스 값이 null값인 경우 
-1st :  Null Instance에 접근하려 함- >  2nd : InstanceNull인지 먼저 확인 함(if로) -> null아니라면 해당코드 실행
2. ArrayIndexOutOfBoundsException -  배열의 인덱스 범위를 벗어남

- 배열의 인덱스 범위를 벗어남 : 찾으려는 인덱스가 존재하는지 먼저 확인 함 (length를 구해 내가 접근하려는 인덱스가 범위내에 있는지 물어보고, 방어)

  ex) 0보다 작거나 배열길이-1 보다 클 경우

3. IndexOutOfBoundsException - List의 인덱스 범위를 벗어남

 

- List의 인덱스 범위를 벗어남 : 찾으려는 인덱스가 존재하는지 먼저 확인

4. NumberFormatException
숫자가 아닌 문자를 숫자로 변환하려 함 : 문자가 숫자형태인지 확인 함

  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);
	}