JavaRush /Java Blog /Random-KO /번역: Java를 처음 접하는 사람들을 괴롭히는 6가지 Java 예외.
profeg
레벨 18

번역: Java를 처음 접하는 사람들을 괴롭히는 6가지 Java 예외.

Random-KO 그룹에 게시되었습니다

자바 초보자를 괴롭히는 6가지 자바 예외

(원본) (Java와 영어 둘 다 처음이라 비판과 도움을 받으면 기쁠 것입니다) 이전과 현재 모두 다시 한 번 설명해야 할 몇 가지 일반적인 예외로 인해 문제를 겪고 있는 많은 Java 초보자를 만났습니다. 나는 다른 수석 Java 개발자들도 초보자가 이러한 예외를 처리하도록 돕기 위해 동일한 문제를 겪고 있다고 생각합니다. 그래서 나는 내 발전을 위해 이 글을 썼다. 이 기사에 자유롭게 의견을 제시하거나 아래 목록에 예외를 추가하세요.
1. NoClassDefFoundError
이는 Java 프로그래밍 세계에서 대부분의 신규 Java 개발자가 직면하게 되는 ""메인" 스레드의 예외 NoClassDefFoundError" 와 같은 메시지가 포함된 예외 중 하나입니다 . 초보자는 "Hello world!"를 표시하는 프로그램을 작성하고 명령줄로 이동하여 "java ..."를 입력하고 Enter 키를 누른 다음 BAM! =). 그리고 프로그램이 "Hello world!"를 인쇄하도록 하는 방법을 알아냅니다. 모니터에서는 시간이 좀 걸립니다. NoClassDefFoundError는 JVM(Java Virtual Machine)이 시작 시 클래스에 액세스하려고 시도하고 컴파일 시 동일한 클래스가 발견되었음에도 불구하고 해당 클래스를 찾을 수 없을 때 발생합니다. 이 예외는 "java" 명령을 사용하여 프로그램을 실행하려고 할 때 클래스 경로가 제대로 설정되지 않은 경우에 가장 자주 발생합니다. 다음은 이 예외가 발생하는 이유에 대한 설명입니다.
  • 클래스는 -classpath에서 사용할 수 없습니다.
  • CLASSPATH 환경 변수가 재정의되었습니다. Windows 명령 "set"을 사용하여 존재 여부와 정확성을 확인할 수 있습니다.
문제에 대한 해결책은 여기에 더 자세히 설명되어 있습니다.
또한 CLASSPATH 환경 변수와 인터프리터 키 -classpath 간의 차이점을 이해해야 합니다. 전문가들은 CLASSPATH 사용을 권장하지 않습니다 . 가장 좋은 방법은 -classpath 키를 인터프리터에 전달하는 것입니다.
2. ClassNotFoundException
ClassNotFoundException은 프로그래밍을 시작하자마자 초보자에게 악몽이 되는 또 다른 예외입니다. 흥미롭게도 일반 Java 개발자는 ClassNotFoundException과 NoClassDefFoundError 예외를 혼동하는 경우 가 많습니다 . 따라서 이 두 가지 예외의 차이점은 주니어 직위 면접에서 가장 자주 묻는 질문 중 하나로 남아 있습니다 . ClassNotFoundException은 JVM이 특정 클래스를 로드하려고 시도하고 클래스 경로에서 해당 클래스를 찾지 못할 때 발생합니다 . 새로운 Java 개발자가 처음으로 이를 접하게 되는 일반적인 장소 중 하나는 JDBC 라이브러리를 사용하여 데이터베이스에 연결하는 것입니다. 거기서 Class.forName("JDBCdriver")와 같은 코드를 사용하여 드라이버를 로드하려고 합니다. ClassNotFoundException에 대한 좋은 기사는 여기에 있습니다 . 이 문제를 해결하는 가장 효과적인 방법은 Java 클래스로더 의 개념을 이해하는 것 입니다. Win/Unix 환경에서 Java 클래스 경로를 구성하는 방법을 읽을 수 있습니다 . Java 문서 에 명시된 대로 다음과 같은 경우에는 예외가 발생합니다.
  • Class.forName 메소드를 사용하여 클래스를 로드하려고 하는데 .class 파일이 클래스 경로에 없습니다. 이는 여기에 나열된 세 가지 시나리오 중 가장 일반적인 시나리오입니다.
  • 클래스 로더가 loadClass를 사용하여 클래스를 로드하려고 할 때.
  • 클래스 로더가 findSystemClass를 사용하여 클래스를 로드하려고 할 때.
3. 널포인터예외
이 예외는 처음 두 개보다 초보자가 이해하기 더 쉽습니다. 게다가 이 예외는 쉽게 식별할 수 있습니다 . 예외가 발생하면 예외에 대한 메시지는 해당 예외가 발생한 프로그램의 줄 번호를 나타냅니다. 이 예외는 JVM이 객체에 액세스하려고 시도하거나 객체에 대한 메서드를 호출하려고 시도하고 객체에 대한 참조 대신 null을 수신할 때 발생합니다. Java 문서에는 다음과 같은 이유도 명시되어 있습니다.
  • 유효하지 않은 개체의 메서드에 액세스하거나 변경합니다. (즉, JVM 객체에 대한 참조 대신 null이 됩니다)
  • 유효하지 않은 배열의 길이를 가져옵니다. (예를 들어 초기화되지 않음)
  • Object 유형의 존재하지 않는 배열 요소에 액세스하려고 했습니다. (즉, 객체 참조 대신 배열 요소에 null이 포함된 경우)
이 예외를 방지하는 가장 간단한 방법은 NULL이 아닌 검사를 사용하는 것입니다. 그러나 조만간 이는 Java 개발 관행이 되어 모든 곳에서 NULL이 아닌 검사를 발견하게 될 것입니다.흥미롭게도 NULL이 아닌 검사를 모든 곳에 삽입하는 것은 좋은 프로그래밍 스타일로 간주되지 않습니다 . 그리고 NULL이 아닌 검사를 사용하는 주된 이유는 개발자가 실패나 오류가 발생한 경우 null 객체를 전달하기를 원하기 때문입니다. 대신, 프로그래머 는 오류 발생 시 프로그램이 어떻게 작동할지에 대한 기본 논리로 null 값이 아닌 빈 개체를 반환하는 데 사용해야 하는 좋은 프로그래밍 방식 입니다 . 그러나 이 프로그래밍 방식을 채택하는 것은 보기보다 어렵습니다.
우리 리소스에 이에 대한 좋은 기사가 있습니다.
4. 클래스캐스트예외
이는 초보자에게 친숙한 또 다른 예외로, 개체의 하위 클래스가 아닌 클래스에 개체를 캐스팅하려고 할 때 발생합니다. 다시 말하지만, 이는 이해하고 식별하기가 매우 쉽고 수정하기 쉽습니다. 런타임 시 개체 유형을 알 수 없는 경우 이 예외를 방지하는 한 가지 방법은 "InstanceOf" 를 사용하여 개체가 특정 클래스의 인스턴스인지 확인하는 것입니다.
5. ArrayIndexOutOfBoundsException
이 예외는 설명이 필요 없으며 JVM이 음수(-1) 또는 배열 크기보다 크거나 같은 인덱스가 존재하지 않는 배열 요소에 액세스하려고 시도할 때 발생합니다. 이해하고 정의하고 수정하는 것은 매우 쉽습니다 . 예를 들어 루프를 생성할 때 for (i = 0; i <= cmd_stack.length; i++) System.out.println(cmd_stack[i]); 배열의 인덱스는 0부터 시작하고 길이 메서드는 요소 수를 반환하며 그 숫자는 마지막 인덱스 값보다 1이 크기 때문에 예외가 발생합니다. 올바른 사용 for (i = 0; i < cmd_stack.length; i++) System.out.println(cmd_stack[i]);
6. IllegalArgumentException
이 예외는 덜 일반적이며 이해, 식별 및 해결이 매우 쉽습니다. 이는 JVM이 존재하지 않는 메소드 또는 유효하지 않은 인수가 있는 메소드를 호출하려고 할 때 발생합니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION