java 예외

개미Coder
|2024. 4. 25. 15:16
반응형

## 예외와 예외 클래스

-컴파일 에러(Comfile-time error)  : 컴파일할 때 발생하는 에러
-런타임 에러(Runtime error)  : 실행할 때 발생하는 에러 (프로그램 종료)
-논리적 에러(Logical error)  : 작성 의도와 다르게 동작 (프로그램이 종료되지 않는다.)

-JAVA의 런타임 에러
 # 에러 (error)  : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
 # 예외 (exception) : 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류

컴퓨터 하드웨어의 오동작 또는 고장으로 인해 응용프로그램 실행 오류가 발생하는 것을 
자바에서는 에러 (error) 라고 한다. 
에러는JVM 실행에 문제가 생겼다는 것이므로 JVM 위에서 실행되는 프로그램을 아무리 견고하게 만들어도 
결국 실행 불능이 된다.  개발자는 이런 에러에 대처할 방법이 전혀 없다. 
자바에서는 에러 이외에 예외 (exception)라고 부르는 오류가 있다. 
예외란 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류를 말한다. 
예외가 발생되면 프로그램은 곧바로 종료된다는 점에서는 에러가 동일하다. 
그러나 예외는 예외 처리 (Exception Handling)를 통해 프로그램을 종료하지 않고 
정상 실행 상태가 유지되도록 할 수 있다.

예외는 두 가지 종류가 있다. 하나는 일반 예외 (Exception)이고, 다른 하나는 실행 예외 (RuntimeException)이다. 
일반 예외는 컴파일러 체크 예외라고도 하는데, 자바 소스를 컴파일하는 과정에서 
예외 처리 코드가 필요한지 검사하기 때문이다. 
만약 예외 처리 코드가 없다면 컴파일 오류가 발생한다.   
실행 예외는 컴파일하는 과정에서 예외 처리 코드를 검사하지 않는 예외를 말한다. 
컴파일 시 예외처리를 확인하는 차이일 뿐, 두 가지 예외는 모두 예외 처리가 필요하다. 
자바에서는 예외를 클래스로 관리한다. JVM은 프로그램을 실행하는 동안 예외가 발생하면 
해당 예외 클래스로 객체를 생성한다. 그리고나서 예외 처리 코드에서 예외 객체를 이용할 수 있도록 해준다. 
모든 예외 클래스들은 다음과 같이 java.lang.Exception 클래스를 상속받는다.

 

 

# 오류의 종류

-에러 (Error)

-하드웨어의 잘못된 동작 또는 고장으로 인한 오류

-에러가 발생되면 프로그램 종료

-정상 실행 상태로 돌아갈 수 없음

 

-예외 (Exception)

-사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인한 오류

-예와가 발생되면 프로그램 종료

-예외 처리 추가하면 정상 실행 상태로 돌아갈 수 있음

 

-원래 예외 처리되면 프로그램이 당장 멈추는데, 예외가 날 것 같은 부분에 미리 적용시키는 것이다.

(이 부분에서 오류가 날 것 같다고 생각하면 그 부분을 예외처리 해주는 것 - 전문지식 필요)

 

 

# 예외의 종류

#일반(컴파일 체크) 예외 (Exception)

-예외 처리 코드 없으면 컴파일 오류 발생

 

#실행 예외(RuntimeException)

-예외 처리 코드를 생략하더라도 컴파일이 되는 예외

-경험 따라 예외 처리 코드 작성 필요

 

 

 

-Object는 class를 만들면 자동으로 상속하게 되어있다. (그래서 내가 만든 메서드들이 아닌데도, 사용을 할 수 있게 된다.)

 

 

# NullPointerException(객체 값이 없는데 객체를 사용할 때)

자바 프로그램에서 가장 빈번하게 발생하는 실행 예외는 java.lang.NullPointerException 일 것이다. 
이것은 객체 참조가 없는 상태, 즉 null 값을 갖는 참조 변수로 객체 접근 연산자인 도트(.)를 사용했을 때 발생한다. 
객체가 없는 상태에서 객체를 사용하려 했으니 예외가 발생하는 것이다.

 

NullPointerException 오류

 

 

 

 

 

# ArraylndexOutOfBoundsException(인덱스 배열 범위를 넘어설 때)

배열에서 인텍스 범위를 초과하여 사용할 경우 실행 예외인 java.lang.Array IndexOutOfBoundsExceptio이 발생한다. 
예를 들어 길이가 3인 int[] arr = new int[3] 배열을 선언했다면,
배열 항목을 지정하기 위해 arr[0] ~ arr[2]를 사용할 수 있다. 
하지만 arr[3]을 사용하면 인덱스 범위를 초과했기 때문에 ArraylndexOutOfBoundsException이 발생한다.

 

 

ArrayIndexOutOfBoundsException 오류

 

 

 

# NumberFormatException(숫자로 변환 될 수 없는 문자가 있으면 생긴다)

프로그램을 개발하다 보면 문자열로 되어 있는 데이터를 숫자로 변경하는 경우가 자주 발생한다. 
문자열을 숫자로 변환하는 방법은 여러 가지가 있지만 가장 많이 사용되는 코드는 다음과 같다.

int result = integer.parseInt(str);
double result = Double.parseDouble(str);


Integer와 Double은 포장(Wrapper) 클래스라고 하는데, 
이 클래스 의 정적 메소드인 parsexxx() 메소드를 이용하면 문자열을 숫자로 변환할 수 있다. 
이 메소드들은 매개값인 문자열이 숫자로 변환될 수 있다면 숫자를 리턴하지만 
숫자로 변환될 수 없는 문자가 포함되어 있다면 java.lang.NumberFormatException을 발생시킨다.

 

NumberFormatExceptionExample 오류

 

 

 

 

# ClassCastException(타입 변환에 실패할 때)

타입 변환( Casting ) 은 상위 클래스와 하위 클래스 간에 발생하고 구현 클래스와 인터페이스 간발생한다.
이러한 관계가 아니라 면클래스는 다른클래스로 타입 변환할 수 없다. 
억지로타입 변환을 시도할 경우 ClassCastException이 발생한다. 

 

 

ClassCastException 오류

 

 

 

 

# ArithmeticException(수를 0으로 잘못 나눌 때)

 

-수를 0으로 나눈경우에 생기는 오류

ArithmeticException 오류

 

 

 

 

 

# 예외 처리 코드

 

 

-try - catch - finally 블록을 이용해서 예외 처리 코드를 작성한다. (try와 catch는 반드시 사용해야 한다, finally는 써도 되고, 안써도 되는 옵션임)

-예외가 발생하면 try -> catch로 넘어가고, 예외가 발생하지 않으면, try->finally로 건너뛴다.

-여기서 finally는 예외가 발생하던, 발생하지 않던, 항상 실행되는 블록이다.

-한 마디로 예외가 생기면 catch로 가고 안생기면 건너뛰어버린다.

 

 

-catch에서 각각의 오류명을 지정해서 발생될 시에 catch에서 지정한 예외 처리 문구들이 실행이 된다.

(말 그대로 catch catch 오류를 catch catch)

 

 

1. 예외 발생 처리 try-catch-finally 정상적으로 catch에서 예외가 발생되어서 구문이 출력된다.

여기서 실행문으로 만들어 놓은 코드는 건너뛰어 버리고, 바로 catch 구문이 실행된다.

 

 

2. 예외 발생 처리를 해놔도 예외가 뜨지 않아서 finally만 실행이 된다.

 

 

 

3. catch에 실행할 구문에서 e.getMessage()를 쓰면, NullPointerException 클래스에서의 오류 message를 출력해준다.

 

e.toSting()


e.printStackTrace() : 보편적으로 많이 사용한다.

 

if문을 사용하면 이렇게..

 

 

 

# try와 catch를 꼭 사용해야 하는 메서드도 있다.

 

 

 

 

# Array 배열에 대한 Exception 예외 예제(오류를 중첩시켜서 A 오류 또는 B 오류가 발생시 해당 구문을 실행시킨다고 설정해 줄 수 있다.)

 

 

 

 

-정적 메서드 안에 try catch문을 넣어서 예외 처리

package chapter09.example02;

public class ExceptionExample {

	public static void findClass(String classname) {
		try {
			Class.forName(classname);
			System.out.println("입력하신 " + classname + " 클래스는 존재하는 클래스입니다.");
		} catch (ClassNotFoundException e) {
			System.out.println("입력하신 " + classname + " 클래스는 존재하지 않는 클래스입니다.");
			e.printStackTrace();
		}
	}
}
package chapter09.example02;

public class EXceptionExampleMain {

	public static void main(String[] args) {

		ExceptionExample.findClass("java.lang.System");
		ExceptionExample.findClass("java.lang.String");
		ExceptionExample.findClass("java.lang.Integer");
		ExceptionExample.findClass("java.lang.good");
		
	}
}

 

 

#예외 떠넘기기

 

예외 떠넘기기의 목적


모듈화와 코드의 가독성 향상: 예외 처리 로직을 한 곳에 집중시켜 코드의 가독성과 유지 보수성을 향상시킬 수 있습니다.


예외 처리의 일관성: 동일한 예외에 대한 처리를 상위 레벨에서 일관되게 처리할 수 있습니다.


오류 처리의 중앙집중화: 여러 메소드에서 발생할 수 있는 예외를 상위 메소드에서 일괄적으로 처리할 수 있어 오류 처리 로직을 중앙집중화할 수 있습니다.

 

 

 

-기존에는 Class.forName에 오류가 떠야하는데, throws를 사용해서 예외를 떠넘겨서 이것을 실행시키는 곳에 오류가 발생한다.

반응형

'java(2)↗' 카테고리의 다른 글

java String 클래스  (0) 2024.04.29
java 자바 API 다양한 클래스들  (0) 2024.04.26
java 인터페이스  (0) 2024.04.24
java 다형성  (0) 2024.04.23
java 상속  (0) 2024.04.23