자바(Java)/JAVA 2SE

자바 에러의 종류와 설명

본클라쓰 2010. 12. 1. 12:19

 이클립스의 도움과 개발 경력이 조금되면 에러 원인을 살펴보는 일이 거의 없다. 이클립스가 가장 큰 힘이 되고, 경력이 쌓일 수록 이클립스에 주의나 에러코드가 발생하기 전에 에러가 발생하겠구나 금방 알 수 있기 때문이다. 처음 접하는 분들이 참고하셨으면 한다.

 

 

● ERROR : Exception in thread "main" java.lang.NoClassDefFoundError : 파일명

클래스 파일을 찾을 수 없는 경우 발생합니다. 실행하려는 클래스 파일 이름이 제대로 되어 있는지 확인합니다.

 

ERROR : Cannot resolve symble

이해할 수 없는 클래스나 메소드, 변수명이 올경우 발생합니다. 보통 이 에러는 철자가 틀렸을 경우 많이 발생합니다. 클래스, 메소드, 변수의 철자를 확인해 봅니다. 특히, 철자를 확인할 때 대소문자 구분을 확실히 체크합니다. (자바는 대소문자를 구별합니다.)

   

ERROR : Non-static variable 변수이름 cannot by refere from a static context

static 메소드 안에서 static 으로 선언되지 않은 메소드나 변수를 참조(사용)했을 경우 발생합니다.

   

ERROR : Valiable 변수명 might not have been initialized

지역변수인 변수명의 변수가 초기화가 되어 있지 않았을 경우 발생합니다. 지역 변수를 초기화 하지 않은채 선언했을 경우 발생합니다. 변수는 선언시 반드시 초기화를 해주어야 합니다.

   

ERROR : Class 클래스명 is public, should be declared in a file named 클래스명

클래스명이 public 으로 선언되었는데 파일명과 다를 경우 발생합니다. public 으로 선언된 클래스가 있다면 반드시 그 클래스명과 파일명이 같아야 합니다. 클래스명과 파일명의 대소문자 및 철자가 같은지 비교합니다.

  

ERROR : Push(java.lang.object) in java.util.Stack cannot be applied to (int)[잘못 들어간 자료형]

메소드에서 인자를 받을 때 받을 수 있는 형이 아닌 자료형 또는 클래스형을 사용할 경우 발생합니다. 사용하는 메소드의 API를 참고하여 어떤 형을 인자로 받을 수 있는지 찾아본다. API를 보지 못할 경우는 각 자료형으로 인자를 직접 바꾸어 봅니다.

   

ERROR : java.lang.NoSuchMethodError: main Exception in thread "main"

클래스 파일 안에서 main() 메소드를 찾을 수 없는 경우 발생합니다. 자바 애플릿이 아닌 이상 자바 애플리케이션은 반드시 main() 메소드를 사용해야 합니다. main() 메소드를 빼 먹지 않았는지 확인해 보십시요. 또한 public static void main(String[] args) 형식으로 씌어졌는지도 확인해 보십시오.

 

ERROR : Unreported exception java.io.IOException ; must be caught or declared to be thrown

예외가 발생하는데 예외 처리를 해주지 않았을 경우 발생합니다. 예외를 발생하는 메소드 같은 경우 반드시 예외처리를 해주어야 합니다. 예외를 발생하거나 예외처리를 해야하는 메소드는 API를 확인해 보시면 알 수 있습니다. 그렇지 않다면 컴파일 후 지금처럼 에러가 난 예외를 예외처리해 주시면 됩니다. 또한, 예외를 처리할 때는 메소드 차원에서 throws 예외명을 이용해서 처리할 수 있고, try{} carch{} 구문을 이용해서 직접 처리해 주셔도 됩니다.

  

ERROR : Note : Calculator.java uses or overrides a deprecated API.

JDK 버전이 높아졌거나 보안등의 기타 이유로 사용이 deprecated 된 메소드를 사용한 경우. 이건 예외라기 보다는 경고 입니다. JDK가 버전이 높아지거나 보안등의 이유에 따라 예전에 만들어졌지만 필요가 없어지거나 대체된 메소드가 생겨났습니다. 그런 메소드를 deprecated 되었다고 하는데 이것은 API 상에 나와있습니다

 

ERROR : MoustEvent (클래스명) should be declared abstract; it does not define mouseDragged(java.awt.event.MoustEvent) in MouseEvent (클래스명)

implements 한 interface의 모든 메소드를 구현하지 않아서 발생됩니다. interface 는 모든 메소드가 선언만 되어 있고 구현되지 않은 추상 메소드입니다. 만약 interface 를 implements 하려면 implements한 클래스가 interface에서 선언한 모든 메소드를 구현해 주어야 합니다. 하나라도 빠질 경우 implements한 클래스도 추상 클래스로 보고 에러가 발생합니다. 에러에 구현해 주어야할 메소드명이 낭므로 그곳에 쓰여있는 메소드를 구현해 주면 됩니다.

  

ERROR : Incompatible types found : (입력한 자료형) requites : (요구하는 자료형)

입력을 했을 때 맞지 않는 자요형이나 클래스형을 입력할 경우 발생합니다.

  

ERROR : Package java.servlet(패키지명) does not exist

import 한 패키지가 존재하지 않을 경우 발생합니다. 철자와 대소문자를 먼저 확인하고 CLASSPATH 설정을 확인해 보시기 바랍니다. 또한 그곳에 패키지가 jar 파일로 있는지도 확인해 보셔야 합니다.

  

ERROR : Java.lang.NullPointerException Exception in thread "main" java.lang.NullPointerException at java.awt.Container.addlmpl

참조하거나 사용한 클래스 또는 자료형이 초기화 되지 않은 경우 발생합니다. 보통 이것은 awt나 배열 부분에서 자주 발생하는데 초기화를 해주지 않아서 많이 발생합니다. 자바의 변수들은 기본적으로 초기화를 요구합니다. 에러에 체크된 부분을 검토해 보시고 초기화를 해주십시오.

  

ERROR : ';' expected

문법상으로 써야할 것을 쓰지 않은 경우 발생합니다. 주로 ';'을 안써주거나 아님 '()' 를 열기만 하고 닫지 않은 실수를 할 경우 발생합니다.

   

ERROR : Unexpected type required : value(요구하는 타입) found : class(소스상 써준 타입)

Unexpected type 에러를 해석하면 '기대하지 않는 타입'이란 뜻을 가지고 있습니다. 즉, 원하는 타입(required)이 아닌데 잘못된 타입을 써준 경우 발생합니다. 에러 체크된 부분의 타입을 required 에서 나타난 타입으로 변경해 주시면 됩니다.

  

ERROR : java.alng.ArrayIndexOutOfBoundsException at (클래스.메소드) Exception in thread "main"

배열의 범위를 넘어선 값을 넣었을 경우 발생합니다. 위의 에러는 특이하게 컴파일은 이상없이 되지만 실행을 하면 발생하는 에러입니다. 배열의 범위를 넘어설 경우에 발생하므로 에러난 위치의 배열의 참조 범위를 확인해보시고 선언해둔 배열의 범위에 맞게 조정해 주시면 됩니다.

 

ERROR : Illegal start of expression

선언자를 잘못 집어 넣은 경우 발생합니다. 보통 선언자가 맞지 않거나 쓰일데가 아닌데 선언자를 줄 경우에 많이 발생합니다. 특히 메소드안에서 static 선언자를 쓴 경우에는 직격으로 볼 수 있죠. 에러가 난 부분의 선언자를 제거하거나 맞는 것인지 다시 확인해 보세요.

  

ERROR : java.io.InputStream is abstract; cannot be instantiated

abstract 로 선언된 클래스를 직접 new 명령어를 이용하여 인스턴스화 할 경우 발생합니다. abstract 로 선언된 클래스를 직접 new 명령어를 이용하여 인스턴스화 할 경우에 발생하는 에러입니다. 추상 클래스는 직접 new 명령어를 이용하여 인스턴스화 할 수 없습니다.

   

ERROR : Local variable name (변수명) is accessed from within inner class; needs to be declared final

Local Class 의 변수를 final로 선언하지 않은 경우 발생합니다. Local Class 의 변수는 참조변수의 참조값 변동을 방지하기 위하여 final 선언자를 붙여주어야 합니다. 변수에 final 선언자를 붙이면 변수는 값을 변동할 수 없는 상우처럼 쓰이며 만약 이 값을 참조할 경우 자바는 이 값을 넘기는게 아니라 이 값을 복사본으로 참조값으로 넘기게 됩니다. 그러므로 Local Class에서 참조값 변동없이 변수를 참조할 수 있게 되는 것입니다.

   

ERROR : Inner classed cannot have static declarations

내부 클래스 안에서 static 선언자를 쓴 경우 발생합니다. 내부 클래스 안에서는 static 선언자를 쓸 수 없습니다. 내부 클래스 안에서 사용된 static 선언자를 제거해 주세요.

   

ERROR : Reference to List is ambiguous, both class java.util.List (클래스) in java.util (패키지) and class java.awt.List(클래스) in java.awt(패키지) match

클래스 사용시 다른 패키지내에 동일 이름의 클래스들이 있어서 참조가 모호할 경우 발생합니다. import 한 패키지 중에 같은 이름을 사용하는 클래스를 클래스 이름 만으로 생성함으로서 참조가 모호해질 경우 발생하는 에러입니다. 이와 같은 경우 import 를 하나 제거 하거나 아님 java.util.List 이런식으로 직접 그 클래스의 패키지를 같이 써줌으로써 모호성을 제거할 수 있습니다.

  

ERROR : (메소드명) in (클래스명) cannot override (메소드명) in (클래스명) attemption to use incompatiable return type

클래스를 상속받고서 메소드를 오버라이드 하고자 할 때 잘못한 경우 발생합니다. 클래스를 상속받고서 메소드를 오버라이드 하고자 할 때 지켜야할 규칙이 있습니다. 메소드 이름이 같아야 하고, 메소드의 파라미터 개수, 데이터형이 같아야합니다. 또한, 메소드의 리턴형이 같아야 하며, 상위 메소드와 동일하거나 더 구체적인 Exceptin 을 발생시켜야 합니다. 상위 메소드와 동일하거나 접근범위가 더 넣은 접근 제한자를 사용해야 합니다.

  

ERROR : getPathBetweenRows (메소드) has protected access in javax.swing.JTree(클래스)

protected 로 선언된 메소드를 상속 없이 직접 불러쓸 경우 발생합니다. protected로 선언되어 있는 메소드는 상속하거나 같은 pcakage에 있을 때만 쓸 수 있습니다. 상속해서 다시 public 메소드로 값을 받던지 아니면 public 메소드 중에서 비슷한 기능을 하는 메소드가 있는지 찾아서 바꿔주어야 합니다.

   

ERROR : Invalid method declaration; return type required

리턴 타입을 쓰지 않아 메소드의 선언이 잘못된 경우에 발생하는 에러이므로 에러가 발생한 메소드를 확인해보고 리턴 타입에 맞게 적어주어야 합니다.

 

ERROR : Error occured during initialization of VM java.lang.ExceptionInitializerError

static 으로 선언된 변수 중 초기화가 안되어 있는 것이 있는 경우 발생합니다.

   

ERROR : Error opening registry key 'software\javaSoft\java Runtime Environment' Error : coulc not find java.dll

중복 설치 등으로 인해 레지스트리 키 값이 잘못되어 있는 경우 발생합니다. 중복 설치 등으로 인해 레지스트리 키 값이 잘못되어 있는 경웨 발생하는 에러이므로 레지스트리 편집기를 열어서 HKEY_LOCAL_MACHINE -> SOFTWARE ->JavaSoft 에 3개의 키가 있는데 그 중에서 첫번째 키인 java 런타임 환경을 마우스 오른쪽 버튼으로 클릭하여 Java Runtime Environment 로 이름을 바꿔주시면 됩니다.

  

ERROR : Error Registry Key 'Software\JavaSoftware\Java Runtime Environment\CurrentVersion' has value '1.1', but '1.3'is requried. Error: could not find java.dll

중복 설치 등으로 인해 레지스트리 키값의 자바 버전이 잘못되어 있는 경우 발생합니다. 레지스트리 편집기를 열어서 HKEY-LOCAL-MACHINE -> SOFTWARE -> JavaSoft ->Java Runtime Environment 의 Current versin 의 값을 1.3으로 되어 있는지 확인해 주시면 됩니다.

  

ERROR : java.lang.ClassNotFoundExceptin: org.gjt.mm.mysql.Driver(드라이버명)

JDBC로 데이터 베이스에 연결하는 중 드라이버를 찾지 못할 경우 발생합니다. 각 데이터 베이스에 맞는 드라이버가 제대로 다운로드 되었는지 확인해 보고 드라이버의 위치가 클래스 패스에 잡혀 있는지 확인합니다.

  

ERROR : Method println(java.lang.String) (메소드) not found in class java.io.PrintStream (클래스명)

자신이 사용한 클래스의 메소드가 맞지 않는 경우 발생합니다. 자신이 사용한 클래스의 메소드가 맞지 않는 경우에 발생하는 에러이므로 API를 통해서 사용하고자 하는 클래스와 메소드를 다시 한번 확인해 봅니다.