[프래피티]

자바의 예외

everydeveloper 2024. 5. 17. 12:07

Exception은 무엇이고, 자바에서의 Exception 처리 방식에 대해 설명해주세요.

exception은 프로그램 실행 중 발생하는 예외적인 상황을 나타내는 객체입니다.

주로 프로그램의 정상적인 흐름을 방해하는 오류를 의미하며, 자바에서는 이러한 예외를 처리할 수 있는 매커니즘을 제공합니다.

try-catch블록

finally 블록

throw 키워드

throws 키워드

Exception 계층 구조

error: 시스템 레벨의 심각한 문제

exception: 애플리케이션 예외로, 정상 흐름을 유지할 수 있습니다.

Runtimexception:예외 처리가 필요 없습니다.

프로그램의 안정성과 신뢰성을 높이는 중요한 기법입니다.

자바에서 checked 예외와 unchecked 예외의 차이점은 무엇이며, 어떤 상황에서 어떤 예외를 사용하는 것이 바람직한가요?

Checked 예외는 컴파일 단계에서 Check 되는 예외로 외부자원과의 상호 작용이나 반드시 예외처리가 필요한 상화에서 사용하며 unChecked 예외는 프로그래머의 실수로 인한 예외 상황이나 예외 처리가 필수가 아닌 경우에 사용합니다. 이 두가지 예외를 적절히 사용함으로써 코드의 안정성과 가독성을 높일 수 있습니다.

Checked 예외를 사용할 때의 장단점과 Unchecked 예외를 사용할 때의 장단점에 대해 설명해주세요. 어떤 상황에서 Checked 예외를, 어떤 상황에서 Unchecked 예외를 선택해야 하는지에 대해 알아보세요.

Checked 예외를 사용할 때의 장단점

컴파일러 강제 처리, 명시적인 예외 처리가 장점이고, 단점으로는 코드의 복잡성 증가, 개발자가 작업량이 증대 된다는 점이 있습니다. Unchecked 예외를 사용할때의 장단점으로는 장점은 간결한 코드, 유연한 예외처리, 단점으로는 예외 누락 가능성과 예외 추적 어려움이 있습니다. 따라서 추천하는 것으로는 checked예외는 파일 입출력과 데이터베이스 연결 등 외부 자원과의 상호작용에서 발생할 수 잇는 예외를 처리할 때 사용하고 배열 인덱스 초과, null 포인터 참조는 코드 논리로 예방하는 것이 더 효율적 입니다.

Checked 예외와 Unchecked 예외를 실무에서 사용할 때, 코드의 가독성과 유지보수성에 어떤 영향을 미치는지에 대해 조사해보고 설명해보세요. (특히 대규모 시스템 개발에서의 경우를 고려해보세요)

대규모 시스템 개발 시 예외 처리는 코드의 가독성과 유지보수성에 중요한 영향을 미칩니다.

구체적인 예외 사용, 예외 메시지 상세화, 리소스 정리, 전역 예외 처리기 사용

Checked 예외 사용 예시, 파일 입출력 가 있고

Unchecked 예외 사용 예시에는

데이터 검증, 배열 인덱스 초과가 있습니다.

대규모 시스템 개발에서 Checked 예외와 Unchecked 예외를 어떻게 구분하여 사용해야 하는지에 대해 다시 고려하고 학습해보시기 바랍니다. 예시를 구체적으로 들어 설명해주세요.

Unchecked 예외 처리
스프링 부트에서의 전역 예외 처리기 예시
@ControllerAdvice
public class GlobalExceptionHandler {

@ExceptionHandler(SQLException.class)
public ResponseEntity handleSQLException(SQLException ex, WebRequest request) {
ErrorDetails errorDetails = new ErrorDetails(new Date(), ex.getMessage(), request.getDescription(false));
return new ResponseEntity<>(errorDetails, HttpStatus.INTERNAL_SERVER_ERROR);
}

@ExceptionHandler(Exception.class)
public ResponseEntity handleGlobalException(Exception ex, WebRequest request) {
ErrorDetails errorDetails = new ErrorDetails(new Date(), ex.getMessage(), request.getDescription(false));
return new ResponseEntity<>(errorDetails, HttpStatus.INTERNAL_SERVER_ERROR);
}
}

배열 인덱스 초과

public class ArrayUtils {
public int getElement(int[] array, int index) {
if (index < 0 || index >= array.length) {
throw new ArrayIndexOutOfBoundsException("Index out of bounds: " + index);
}
return array[index];
}
}
Checked 예외 처리
데이터베이스 연결

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DatabaseManager {
public Connection getConnection() throws SQLException {
String url = "jdbc:mysql://localhost:3306/mydatabase";
String user = "username";
String password = "password";
return DriverManager.getConnection(url, user, password);
}
}

데이터베이스 연결 메서드에서 SQLException을 어떻게 처리해야 하는지 자세히 설명해주세요. Checked 예외인 SQLException의 처리 방법에 대해 추가적으로 공부해보세요.

SQLException은 checked 예외로 반드시 예외 처리를 해야 하며
구체적 예시는

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DatabaseManager {
public Connection getConnection() {
String url = "jdbc:mysql://localhost:3306/mydatabase";
String user = "username";
String password = "password";
Connection connection = null;
try {
connection = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
System.err.println("Database connection failed: " + e.getMessage());
e.printStackTrace();
}
return connection;
}
}

예외를 상위 메서드로 전파 (throws 키워드 사용)

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DatabaseManager {
public Connection getConnection() throws SQLException {
String url = "jdbc:mysql://localhost:3306/mydatabase";
String user = "username";
String password = "password";
return DriverManager.getConnection(url, user, password);
}
}

public class Main {
public static void main(String[] args) {
DatabaseManager dbManager = new DatabaseManager();
try {
Connection connection = dbManager.getConnection();
// Use the connection
} catch (SQLException e) {
System.err.println("Database connection failed: " + e.getMessage());
e.printStackTrace();
}
}
}
사용자 정의 예외로 래핑하여 전파
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DatabaseManager {
public Connection getConnection() throws CustomDatabaseException {
String url = "jdbc:mysql://localhost:3306/mydatabase";
String user = "username";
String password = "password";
try {
return DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
throw new CustomDatabaseException("Database connection failed", e);
}
}
}

public class CustomDatabaseException extends Exception {
public CustomDatabaseException(String message, Throwable cause) {
super(message, cause);
}
}
전역 예외 처리기 사용

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice
public class GlobalExceptionHandler {

@ExceptionHandler(SQLException.class)
public ResponseEntity handleSQLException(SQLException ex) {
return new ResponseEntity<>("Database error: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}

중요한 이유 안정성 향상, 사용자 경험 개선, 디버깅 용이성, 코드 유지보수성이 있습니다.

'[프래피티]' 카테고리의 다른 글

자바에서 자주 쓰는 자료구조 2  (0) 2024.05.17
자바에서 자주 쓰는 자료구조1  (0) 2024.05.17
자바 어노테이션  (0) 2024.05.17
Checked Exception과 Unchecked Exception  (0) 2024.05.17
자바의 ENUM  (0) 2024.05.16