에러 & 오류

자바에서 발생하는 오류 및 해결 방안 총 정리!

Well See Coding 2024. 9. 17. 13:27
반응형

자바 스프링이나 스프링부트를 사용해 코드를 실행해다보면 각종 오류가 발생하는데 종류가 너무나도 많습니다. 해당 오류들을 정리해 보았으니 무엇이 문제인지 확인해보고 추가로 식별되는 오류는 추가해나가도록 하겠습니다!

1. 입출력 오류 (I/O Errors)

  • java.io.IOException:
    발생 원인: 입출력 작업 중 일반적인 오류가 발생할 때.
    해결 방안:
    1. 파일이나 네트워크 연결이 올바르게 설정되었는지 확인.
    2. 파일이 존재하는지, 읽기/쓰기 권한이 있는지 확인.
  • java.io.FileNotFoundException:
    발생 원인: 지정된 파일을 찾을 수 없을 때 발생.
    해결 방안: 파일 경로가 정확한지 확인하고, 파일이 존재하는지 확인.
  • java.io.EOFException:
    발생 원인: 입력 스트림의 끝에 도달했을 때 발생.
    해결 방안: 스트림이 비정상적으로 종료되었는지 확인하고, 정상적으로 읽기 종료 처리를 한다.
  • java.io.InterruptedIOException:
    발생 원인: 입출력 작업 중 스레드가 인터럽트되었을 때 발생.
    해결 방안: 스레드가 중단되지 않도록 확인하거나, 인터럽트를 처리하는 로직을 추가한다.
  • java.net.MalformedURLException:
    발생 원인: URL 형식이 잘못되었을 때 발생.
    해결 방안: URL의 형식이 RFC 2396에 맞게 구성되었는지 확인.
  • java.io.UnsupportedEncodingException:
    발생 원인: 지원되지 않는 문자 인코딩을 사용할 때 발생.
    해결 방안: JVM에서 지원하는 인코딩 형식을 사용하는지 확인.
  • java.net.SocketException:
    발생 원인: 소켓 작업 중 오류가 발생했을 때 발생.
    해결 방안: 네트워크 연결이나 소켓 설정이 올바른지 확인하고, 네트워크가 활성화되어 있는지 점검.
  • java.net.ConnectException:
    발생 원인: 네트워크 연결 실패 시 발생.
    해결 방안: 서버가 실행 중인지, 포트와 주소가 올바른지 확인.
  • java.net.BindException:
    발생 원인: 소켓이 특정 주소나 포트에 바인딩할 수 없을 때 발생.
    해결 방안: 포트가 이미 사용 중인지 확인하고, 다른 포트를 사용하도록 설정.
  • java.net.NoRouteToHostException:
    발생 원인: 호스트로 가는 경로를 찾을 수 없을 때 발생.
    해결 방안: 네트워크 경로가 올바른지, 게이트웨이 설정이 맞는지 확인.
  • java.net.PortUnreachableException:
    발생 원인: 특정 포트에 도달할 수 없을 때 발생.
    해결 방안: 대상 호스트와 포트가 열려 있는지 확인.
  • java.net.ProtocolException:
    발생 원인: 네트워크 프로토콜 규칙 위반 시 발생.
    해결 방안: 프로토콜 규칙이 올바르게 설정되었는지 확인.
  • java.net.UnknownHostException:
    발생 원인: 호스트 이름을 확인할 수 없을 때 발생.
    해결 방안: 호스트 이름이 올바른지 확인하고 DNS 설정을 점검.
  • java.net.UnknownServiceException:
    발생 원인: 요청된 서비스가 지원되지 않을 때 발생.
    해결 방안: 해당 서비스가 지원되는지 확인.
  • java.io.StreamCorruptedException:
    발생 원인: 스트림 데이터가 손상되었을 때 발생.
    해결 방안: 스트림을 올바르게 쓰고 있는지, 데이터 전송 중 오류가 발생하지 않았는지 확인.

2. 데이터베이스 오류 (Database Errors)

  • java.sql.SQLException:
    발생 원인: 일반적인 데이터베이스 오류 발생 시.
    해결 방안: SQL 쿼리나 데이터베이스 연결 상태를 확인하고 오류를 처리하는 로직을 추가.
  • java.sql.SQLDataException:
    발생 원인: 잘못된 데이터로 인해 발생.
    해결 방안: 데이터의 유효성 검사를 강화하고, 적절한 데이터 형식으로 변환.
  • java.sql.SQLIntegrityConstraintViolationException:
    발생 원인: 데이터베이스 무결성 제약 조건 위반 시 발생.
    해결 방안: 제약 조건에 맞게 데이터 입력을 관리.
  • java.sql.SQLInvalidAuthorizationSpecException:
    발생 원인: 잘못된 권한 사양으로 인해 발생.
    해결 방안: 데이터베이스 사용자 권한 설정을 확인하고 수정.
  • java.sql.SQLNonTransientConnectionException:
    발생 원인: 영구적이지 않은 연결 오류 발생 시.
    해결 방안: 데이터베이스 연결 상태를 재확인하고 연결을 복원.
  • java.sql.SQLSyntaxErrorException:
    발생 원인: SQL 구문 오류 발생 시.
    해결 방안: SQL 쿼리가 문법적으로 올바른지 확인하고, SQL 표준에 맞게 작성.
  • java.sql.SQLTimeoutException:
    발생 원인: SQL 작업 시간이 초과되었을 때 발생.
    해결 방안: 타임아웃 시간을 조정하거나, 쿼리의 효율성을 높여 시간을 단축.

3. 리플렉션 및 클래스 관련 오류 (Reflection and Class Related Errors)

  • java.lang.ClassNotFoundException:
    발생 원인: 지정된 클래스가 로드되지 않았을 때 발생.
    해결 방안: 클래스 경로에 지정된 클래스가 존재하는지 확인.
  • java.lang.NoSuchMethodException:
    발생 원인: 메서드가 클래스에 존재하지 않을 때 발생.
    해결 방안: 호출하려는 메서드의 이름과 매개변수를 정확하게 입력했는지 확인.
  • java.lang.NoSuchFieldException:
    발생 원인: 필드가 클래스에 존재하지 않을 때 발생.
    해결 방안: 필드 이름이 정확한지, 해당 필드가 클래스에 선언되어 있는지 확인.
  • java.lang.IllegalAccessException:
    발생 원인: 접근할 수 없는 클래스 또는 메서드를 호출하려 할 때 발생.
    해결 방안: 메서드나 필드의 접근 제한자를 확인하고, 접근 권한을 부여.
  • java.lang.InstantiationException:
    발생 원인: 클래스 인스턴스를 생성할 수 없을 때 (예: 추상 클래스).
    해결 방안: 추상 클래스나 인터페이스는 인스턴스화할 수 없으므로, 올바른 객체를 생성.
  • java.lang.reflect.InvocationTargetException:
    발생 원인: 리플렉션을 사용해 호출된 메서드에서 예외가 발생했을 때 발생.
    해결 방안: 호출된 메서드 내부에서 발생한 예외를 분석하고 처리.
  • java.lang.reflect.ReflectiveOperationException:
    발생 원인: 리플렉션 작업 중 일반적인 오류 발생 시.
    해결 방안: 리플렉션 작업이 올바르게 이루어졌는지 확인하고, 필요하다면 예외 처리 로직을 추가.

4. 멀티스레딩 및 동시성 오류 (Multithreading and Concurrency Errors)

  • java.lang.InterruptedException:
    발생 원인: 스레드가 중단되었을 때 발생.
    해결 방안: 스레드가 중단될 가능성이 있는 부분에서 인터럽트 상태를 확인하고 처리.
  • java.lang.IllegalThreadStateException:
    발생 원인: 스레드가 잘못된 상태에서 작업을 시도했을 때 발생.
    해결 방안: 스레드의 상태가 올바른지 확인하고, 스레드가 실행 중인지 점검.
  • java.lang.IllegalMonitorStateException:
    발생 원인: 스레드가 모니터 잠금 없이 wait() 또는 notify()를 호출할 때 발생.
    해결 방안: wait() 또는 notify() 호출 전에 적절히 동기화 블록을 설정.
  • java.util.ConcurrentModificationException:
    발생 원인: 컬렉션이 동시 수정되었을 때 발생.
    해결 방안: 동시 수정 가능성이 있는 컬렉션을 사용 시, ConcurrentHashMap과 같은 동시성 컬렉션 사용.
  • java.nio.channels.OverlappingFileLockException:
    발생 원인: 파일 잠금이 중첩되었을 때 발생.
    해결 방안: 동일한 파일에 여러 개의 잠금이 발생하지 않도록 관리.
  • java.util.concurrent.ExecutionException:
    발생 원인: 비동기 작업에서 예외가 발생했을 때 발생.
    해결 방안: 비동기 작업 내부에서 발생한 예외를 처리하고, 적절한 예외 처리 로직을 추가.

5. 형식 및 타입 오류 (Type and Formatting Errors)

  • java.lang.ClassCastException:
    발생 원인: 객체를 잘못된 타입으로 캐스팅하려고 할 때 발생.
    해결 방안: instanceof 연산자를 사용해 객체의 타입을 확인한 후에 캐스팅을 시도해야 함.
  • java.lang.NumberFormatException:
    발생 원인: 문자열을 숫자로 변환할 때, 해당 문자열이 올바른 숫자 형식을 따르지 않으면 발생.
    해결 방안: 변환하려는 문자열이 올바른 형식인지 미리 검증하거나, 예외 처리를 통해 잘못된 입력을 처리.
  • java.lang.IllegalArgumentException:
    발생 원인: 메서드에 잘못된 인자를 전달했을 때 발생.
    해결 방안: 메서드 호출 전에 전달하는 인자의 유효성을 확인. 특히, null값이나 범위를 벗어난 값을 전달하지 않도록 주의.
  • java.util.IllegalFormatException:
    발생 원인: printf()나 String.format()과 같은 메서드에 잘못된 형식 문자열을 사용했을 때 발생.
    해결 방안: 형식 문자열과 매개변수의 일치 여부를 확인하고, 올바른 형식 지정자를 사용.
  • java.util.InputMismatchException:
    발생 원인: 입력값이 예상한 형식과 맞지 않을 때 발생.
    해결 방안: 입력받기 전에 예상되는 형식과 맞는지 확인하거나, 입력값을 검증하는 로직을 추가.
  • java.util.IllegalFormatWidthException:
    발생 원인: 잘못된 형식 너비를 지정했을 때 발생.
    해결 방안: 형식 지정자의 너비 값이 적절한지 확인하고, 너무 작은 값이나 음수 값이 아닌지 체크.
  • java.util.UnknownFormatConversionException:
    발생 원인: 알 수 없는 형식 변환 지정자를 사용했을 때 발생.
    해결 방안: 형식 문자열에 올바른 형식 변환 지정자를 사용하고, 잘못된 형식 문자열이 없는지 확인.
  • java.util.MissingFormatArgumentException:
    발생 원인: 포맷에 필요한 인수가 부족할 때 발생.
    해결 방안: 형식 문자열에 필요한 만큼의 인수가 제공되었는지 확인하고, 필요한 인수가 누락되지 않도록 체크.
  • java.lang.TypeNotPresentException:
    발생 원인: 주어진 이름의 타입이 존재하지 않을 때 발생.
    해결 방안: 클래스 경로나 의존성이 올바르게 설정되었는지 확인하고, 해당 타입이 실제로 존재하는지 체크.
  • java.lang.EnumConstantNotPresentException:
    발생 원인: 열거형 상수에 존재하지 않는 상수를 참조했을 때 발생.
    해결 방안: 열거형 상수가 올바르게 정의되었는지 확인하고, 유효한 상수만 참조하도록 코드를 수정.

6. 컬렉션 및 배열 관련 오류 (Collection and Array Errors)

  • java.lang.ArrayIndexOutOfBoundsException:
    발생 원인: 배열 인덱스가 범위를 벗어났을 때 발생.
    해결 방안: 배열 인덱스를 참조할 때, 배열의 길이를 초과하지 않는지 미리 확인하고 안전한 접근 방식 사용.
  • java.lang.ArrayStoreException:
    발생 원인: 배열에 잘못된 타입의 객체를 저장하려고 할 때 발생.
    해결 방안: 배열에 삽입하려는 객체의 타입이 배열의 타입과 일치하는지 확인 후 저장.
  • java.lang.IndexOutOfBoundsException:
    발생 원인: 리스트, 배열 또는 문자열에서 인덱스가 범위를 벗어났을 때 발생.
    해결 방안: 컬렉션이나 배열에 접근할 때, 인덱스가 유효한 범위 내에 있는지 확인.
  • java.util.NoSuchElementException:
    발생 원인: 컬렉션에서 더 이상 요소가 존재하지 않음에도 불구하고, 요소에 접근하려고 할 때 발생.
    해결 방안: hasNext() 메서드로 다음 요소가 있는지 확인한 후에 접근.
  • java.util.EmptyStackException:
    발생 원인: 스택이 비어있는데 pop() 작업을 시도할 때 발생.
    해결 방안: 스택이 비어 있는지 확인한 후에 pop()을 호출.
  • java.lang.NegativeArraySizeException:
    발생 원인: 배열의 크기를 음수로 지정하려고 할 때 발생.
    해결 방안: 배열 크기가 음수가 되지 않도록 하고, 크기 값이 유효한지 확인.

7. 보안 관련 오류 (Security Errors)

  • java.lang.SecurityException:
    발생 원인: 보안 관리자에 의해 위반이 발견될 때 발생.
    해결 방안: 필요한 권한이 있는지 확인하고, 필요한 경우 보안 설정을 수정하거나 권한을 추가.
  • java.security.AccessControlException:
    발생 원인: 접근 제어가 위반될 때 발생.
    해결 방안: 접근하려는 리소스에 대한 적절한 권한이 있는지 확인.
  • java.security.InvalidKeyException:
    발생 원인: 잘못된 키를 사용하려고 할 때 발생.
    해결 방안: 올바른 형식과 길이의 키를 사용하고, 알고리즘에 맞는 키인지 확인.
  • java.security.KeyStoreException:
    발생 원인: 키 저장소 작업 중 오류가 발생할 때 발생.
    해결 방안: 키 저장소의 설정 및 경로가 올바른지 확인하고, 관련 인증서나 비밀번호가 맞는지 체크.
  • java.security.NoSuchAlgorithmException:
    발생 원인: 요청한 암호화 알고리즘이 존재하지 않을 때 발생.
    해결 방안: JVM에서 지원되는 알고리즘을 확인하고, 맞는 알고리즘을 사용.
  • java.security.SignatureException:
    발생 원인: 디지털 서명 검증 중 오류가 발생했을 때 발생.
    해결 방안: 서명 과정에서 올바른 데이터와 키가 사용되었는지 확인.
  • java.security.GeneralSecurityException:
    발생 원인: 보안과 관련된 일반적인 오류가 발생할 때 발생.
    해결 방안: 보안 작업에서 발생한 구체적인 예외를 찾아내어 원인을 분석하고 해결.

8. 메모리 및 시스템 오류 (Memory and System Errors)

  • java.lang.OutOfMemoryError:
    발생 원인: JVM이 사용할 수 있는 메모리가 부족할 때 발생.
    해결 방안: 불필요한 객체를 정리하거나 JVM의 힙 메모리 크기를 늘리고, 메모리 누수를 방지하는 코드 최적화 수행.
  • java.lang.StackOverflowError:
    발생 원인: 스택 메모리가 초과되었을 때 발생 (주로 재귀 호출이 깊을 때).
    해결 방안: 재귀 호출을 줄이거나, 재귀 깊이를 제한하고 반복문으로 변환.
  • java.lang.VirtualMachineError:
    발생 원인: JVM이 심각한 내부 오류를 겪었을 때 발생.
    해결 방안: 발생 원인이 JVM 내부의 문제인 경우가 많아, 로그를 분석하여 문제 해결 방안을 찾거나 JVM 설정을 변경.

9. 네트워크 및 통신 오류 (Network and Communication Errors)

  • java.net.ConnectException:
    발생 원인: 네트워크 연결이 실패했을 때 발생.
    해결 방안: 네트워크 연결 상태 및 서버가 실행 중인지 확인하고, 네트워크 설정을 점검.
  • java.net.NoRouteToHostException:
    발생 원인: 호스트로 가는 네트워크 경로가 없을 때 발생.
    해결 방안: 네트워크 설정 및 호스트 주소를 점검하고, 경로 설정을 다시 확인.
  • java.net.SocketException:
    발생 원인: 소켓 작업 중 오류가 발생할 때 발생.
    해결 방안: 소켓 연결이 제대로 설정되었는지 확인하고, 포트 충돌 여부 등을 점검.
  • java.net.UnknownHostException:
    발생 원인: 호스트 이름을 확인할 수 없을 때 발생.
    해결 방안: 호스트 이름이 올바른지 확인하고, DNS 설정이나 네트워크 연결을 점검.
  • java.net.HttpRetryException:
    발생 원인: HTTP 요청이 재시도되어야 할 때 발생.
    해결 방안: 서버의 상태나 네트워크 문제를 해결하고, 클라이언트 측에서 재시도 로직을 구현.

10. 직렬화 및 역직렬화 오류 (Serialization and Deserialization Errors)

  • java.io.NotSerializableException:
    발생 원인: 직렬화가 불가능한 객체를 직렬화하려고 할 때 발생.
    해결 방안: 직렬화할 객체가 Serializable 인터페이스를 구현하고 있는지 확인.
  • java.io.InvalidClassException:
    발생 원인: 클래스가 호환되지 않거나 직렬화 중 문제가 있을 때 발생.
    해결 방안: 클래스 버전이나 호환성을 확인하고, 직렬화 과정에서의 문제를 해결.
  • java.io.OptionalDataException:
    발생 원인: 직렬화된 데이터가 잘못되었을 때 발생.
    해결 방안: 직렬화된 데이터의 형식과 내용을 검증하고 올바른 형식으로 직렬화/역직렬화 수행.
  • java.io.ObjectStreamException:
    발생 원인: 직렬화 또는 역직렬화 중 발생하는 일반적인 예외.
    해결 방안: 구체적인 직렬화 예외를 확인하여 문제를 해결.
  • java.io.WriteAbortedException:
    발생 원인: 직렬화 쓰기 도중 중단되었을 때 발생.
    해결 방안: 직렬화 중 발생한 예외를 분석하여 문제를 해결하고, 직렬화 과정에서의 중단 이유를 조사.
  • java.rmi.MarshalException:
    발생 원인: 매개변수나 결과를 직렬화할 수 없을 때 발생.
    해결 방안: 직렬화할 객체의 호환성을 확인하고, 직렬화 가능한 형식만을 사용하도록 수정.

11. 파일 시스템 오류 (File System Errors)

  • java.nio.file.FileSystemAlreadyExistsException:
    발생 원인: 파일 시스템이 이미 존재할 때 발생.
    해결 방안: 파일 시스템을 중복해서 생성하지 않도록 로직을 수정.
  • java.nio.file.FileSystemNotFoundException:
    발생 원인: 파일 시스템을 찾을 수 없을 때 발생.
    해결 방안: 파일 시스템 경로나 접근 권한을 확인하고 올바르게 설정.
  • java.io.SyncFailedException:
    발생 원인: 파일 디스크 동기화 작업이 실패했을 때 발생.
    해결 방안: 디스크 또는 파일 시스템의 상태를 점검하고, 다시 시도하거나 오류 처리를 추가.

12. 버퍼 및 데이터 처리 오류 (Buffer and Data Handling Errors)

  • java.nio.BufferOverflowException:
    발생 원인: 버퍼에 쓰려는 데이터가 버퍼의 용량을 초과했을 때 발생.
    해결 방안: 버퍼의 크기를 적절히 설정하거나, 쓰기 작업 전에 버퍼의 용량을 확인.
  • java.nio.BufferUnderflowException:
    발생 원인: 버퍼에서 읽을 데이터가 충분하지 않을 때 발생.
    해결 방안: 읽기 작업 전에 버퍼에 충분한 데이터가 있는지 확인하고 읽기 작업을 수행.
  • java.nio.charset.CharacterCodingException:
    발생 원인: 문자 인코딩 또는 디코딩 중 오류가 발생했을 때 발생.
    해결 방안: 올바른 문자 인코딩을 사용하고, 지원되지 않는 문자가 없는지 확인.

13. 원격 호출 오류 (Remote Invocation Errors)

  • java.rmi.RemoteException:
    발생 원인: 원격 메서드 호출 중 일반적인 오류가 발생했을 때 발생.
    해결 방안: 네트워크 상태를 점검하고, 원격 메서드가 정상적으로 동작하는지 확인.
  • java.rmi.ServerException:
    발생 원인: 원격 서버에서 예외가 발생했을 때 발생.
    해결 방안: 서버 로그를 분석하여 예외 원인을 파악하고, 서버 쪽 문제를 해결.
  • java.rmi.ServerError:
    발생 원인: 원격 서버에서 심각한 오류가 발생했을 때 발생.
    해결 방안: 심각한 서버 오류의 원인을 분석하고, 필요할 경우 서버 설정을 변경하거나 코드를 수정.
  • java.rmi.NoSuchObjectException:
    발생 원인: 원격 객체를 찾을 수 없을 때 발생.
    해결 방안: 원격 객체가 정상적으로 등록되었는지 확인하고, 연결이 제대로 설정되었는지 점검.
  • java.rmi.ExportException:
    발생 원인: 원격 객체를 내보낼 때 오류가 발생했을 때 발생.
    해결 방안: 객체 내보내기 과정에서의 설정을 점검하고, 네트워크 상태를 확인.

14. 기타 런타임 오류 (Miscellaneous Runtime Errors)

  • java.lang.NullPointerException:
    발생 원인: null 객체를 참조하려고 할 때 발생.
    해결 방안: 객체가 null인지 확인한 후에 접근하고, Optional과 같은 기능을 활용해 안전한 접근 방식을 사용.
  • java.lang.IllegalStateException:
    발생 원인: 객체가 예상된 상태에 있지 않을 때 발생.
    해결 방안: 객체의 상태를 변경하기 전에 상태 검증을 하고, 상태 전환이 올바르게 이루어졌는지 확인.
  • java.lang.UnsupportedOperationException:
    발생 원인: 호출된 메서드가 지원되지 않을 때 발생.
    해결 방안: 해당 메서드가 올바른 방식으로 호출되었는지 확인하고, 필요한 경우 지원되는 메서드를 구현.
  • java.lang.AssertionError:
    발생 원인: assert 구문이 실패했을 때 발생.
    해결 방안: 코드의 논리적 오류를 찾고, 잘못된 가정이나 조건을 수정.
  • java.lang.ArithmeticException:
    발생 원인: 수학적 연산에서 오류가 발생했을 때 (예: 0으로 나누기).
    해결 방안: 연산 전에 값이 유효한지 확인하고, 예외 처리로 0으로 나누는 경우를 처리.
  • java.lang.UnsupportedClassVersionError:
    발생 원인: 클래스 파일의 버전이 JVM과 호환되지 않을 때 발생.
    해결 방안: JVM의 버전과 클래스 파일의 버전이 호환되는지 확인하고, 적절한 버전의 JVM을 사용.
반응형