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