본문 바로가기
꿀팁 정보

Java 자주 발생하는 에러 및 해결방법

by sk9028 2025. 10. 6.
728x90
반응형

 

 

Java 개발을 하다 보면 누구나 에러 메시지를 맞닥뜨리게 됩니다. 특히 초급 개발자는 컴파일 에러와 런타임 에러의 차이부터 헷갈리기 마련이고, 실무에서는 환경 설정, 라이브러리 충돌, NullPointerException 등으로 인해 예상치 못한 상황을 겪기도 합니다.

이번 글에서는 실제 현업에서 자주 발생하는 Java 에러를 원인과 해결책, 코드 예제까지 함께 정리하여, 개발자분들이 빠르게 문제를 진단하고 해결하는 데 도움이 되도록 하겠습니다.


1. NullPointerException (NPE)

원인

Java에서 가장 많이 발생하는 런타임 에러 중 하나입니다. 참조 변수가 null인데 해당 객체의 메서드나 필드에 접근하려고 할 때 발생합니다.

예제 코드

 
public class Main { public static void main(String[] args) { String name = null; System.out.println(name.length()); // NullPointerException 발생 } }

해결 방법

  1. 객체 초기화 여부 확인
  2. Optional 활용 (Java 8 이상)
  3. 방어 코드 작성
 
if (name != null) { System.out.println(name.length()); }

2. ArrayIndexOutOfBoundsException

원인

배열이나 리스트의 인덱스를 잘못 참조했을 때 발생합니다.

예제 코드

 
int[] arr = {1, 2, 3}; System.out.println(arr[3]); // 인덱스 초과 → ArrayIndexOutOfBoundsException

해결 방법

  • 인덱스가 배열 범위 내에 있는지 체크
  • for-each 구문 활용
 
for (int num : arr) { System.out.println(num); }

3. ClassNotFoundException / NoClassDefFoundError

원인

  • ClassNotFoundException: 특정 클래스를 Class.forName() 등으로 동적으로 로딩하려 할 때 classpath에 해당 클래스가 없을 경우.
  • NoClassDefFoundError: 컴파일 시점에는 존재했지만, 실행 시점에 클래스 파일이 누락된 경우.

해결 방법

  1. 빌드 경로 및 classpath 점검
  2. 라이브러리(JAR) 파일 포함 여부 확인
  3. Maven/Gradle 의존성 확인

4. IllegalArgumentException

원인

메서드에 유효하지 않은 인자가 전달될 때 발생합니다.

예제 코드

 
Thread t = new Thread(); t.setPriority(20); // 허용 범위는 1~10 → IllegalArgumentException

해결 방법

  • 입력값 검증 추가
  • 메서드 문서(API 문서)를 확인하여 올바른 범위 전달

5. NumberFormatException

원인

문자열을 숫자로 변환할 때 숫자 형식이 맞지 않으면 발생합니다.

예제 코드

 
String str = "10A"; int num = Integer.parseInt(str); // NumberFormatException

해결 방법

  • 변환 전에 정규식 검사
 
if (str.matches("\\d+")) { int num = Integer.parseInt(str); }

6. StackOverflowError

원인

재귀 호출이 종료 조건 없이 무한 반복될 때 스택 메모리가 가득 차며 발생합니다.

예제 코드

 
public class Main { public static void recursive() { recursive(); // 종료 조건 없음 } public static void main(String[] args) { recursive(); // StackOverflowError } }

해결 방법

  • 재귀 호출에 반드시 종료 조건 추가
  • 반복문으로 변경 가능한 경우 루프 활용

7. OutOfMemoryError (OOM)

원인

JVM 힙 메모리가 부족할 때 발생합니다. 대규모 데이터 로딩, 무한 객체 생성, 메모리 누수에서 자주 발생합니다.

해결 방법

  1. JVM 옵션으로 힙 크기 조정 (-Xmx1024m)
  2. 불필요한 객체 참조 해제
  3. 스트림 처리, 페이징 기법 도입

8. ConcurrentModificationException

원인

컬렉션을 순회하면서 동시에 수정할 때 발생합니다.

예제 코드

 
List<String> list = new ArrayList<>(); list.add("A"); list.add("B"); for (String s : list) { if ("A".equals(s)) { list.remove(s); // ConcurrentModificationException } }

해결 방법

  • Iterator의 remove() 사용
  • CopyOnWriteArrayList 사용
 
Iterator<String> it = list.iterator(); while (it.hasNext()) { if ("A".equals(it.next())) { it.remove(); } }

9. FileNotFoundException

원인

존재하지 않는 파일을 열려고 할 때 발생합니다.

해결 방법

  • 파일 경로 확인
  • try-catch 문으로 예외 처리
 
try (FileReader fr = new FileReader("test.txt")) { // 파일 읽기 } catch (FileNotFoundException e) { e.printStackTrace(); }

10. SQLException

원인

DB 연결 실패, 잘못된 SQL 문, 권한 문제 등.

해결 방법

  1. JDBC URL, 사용자, 비밀번호 확인
  2. SQL 문법 검증
  3. DB 연결 해제 여부 확인
 
try (Connection conn = DriverManager.getConnection(url, user, pwd)) { Statement stmt = conn.createStatement(); stmt.executeQuery("SELECT * FROM users"); } catch (SQLException e) { e.printStackTrace(); }

그 외 자주 발생하는 오류

  • IllegalStateException: 객체의 현재 상태에서 호출 불가능한 메서드 실행.
  • IOException: 입출력 과정 중 오류 발생.
  • ArithmeticException: 0으로 나누기 같은 산술 오류.
  • SecurityException: 보안 매니저에 의해 차단된 동작 수행 시.

글 마무리

Java 에러는 대부분 원인 파악공식 문서 확인만으로도 빠르게 해결할 수 있습니다. 중요한 건 에러 메시지를 무서워하지 않고, 에러 로그를 분석하는 습관을 들이는 것입니다.

실무에서는 IDE가 제공하는 디버깅 기능과 로그 분석 툴을 적극적으로 활용하면 에러 해결 속도가 훨씬 빨라집니다. 이번 글에서 정리한 예제들은 실제 제가 프로젝트에서 경험한 사례이므로, 비슷한 상황에서 곧바로 적용하실 수 있을 겁니다.

혹시 이외에도 자주 겪는 Java 에러가 있다면 댓글로 공유해주시면, 함께 해결법을 정리해 보겠습니다.

728x90
반응형

댓글