티스토리 뷰


오늘은 IllegalAccessError 예외 대해서 알아보자. 말 그대로 실행되는 시점에 메소드가 없거나 필드가 없는 경우에 발생하는데 대개 컴파일 시점에 잡히기 때문에 자주 만나는 예외는 아니다. 

Java java.lang.IllegalAccessError

하나하나 알아보자. 

1. IllegalAccessError 원인

 

자주 만날수는 없지만 원인을 알아보자. 

package test;

public class test {
	public static void main(String[] args) {
        System.out.println(test2.a);
        System.out.println(test3.a);
        
        test2.printA();
        test3.printA();   
    }
}
class test2{
	static String a = "바보";
	static void printA() {
		System.out.println(a);
	}
}

class test3{
	private static String a = "바보2";
	private static void printA() {
		System.out.println(a);
	}
}

이걸 자바 일반적으로 개발을 하게 되면 컴파일 시점에 이미 접근이 되지 않기 때문에 컴파일 에러로 잡혀서 그런 에러를 만날수가 없다. 

 

상황을 강제로 만들어보자. 

 

이클립스로는 재현이 불가하다. 

 

윈도우에서 cmd를 열고 

 

내 작업 폴더로 들어간다. 

D:\workspace\eclipse\2019-03\test\src\test>javac -cp . *

이런식으로 cmd 경로에 모두 컴파일 해준다. 

D:\workspace\eclipse\2019-03\test\src>java test.test
바보
바보2
바보
바보2

그 다음 잘 실행 되는지 cmd 창에서 해본다. 

 

그 다음 메모장으로 test3 을 열어서 public 메소드, 필드를 private로 수정한 뒤에 다시 컴파일 해준다. 이걸 하기 위해 메모장으로 자바를 열다니 ㅎㅎㅎ 아... 몇년 만인가...

이게 얼마만에 메모장 코딩인지...

 

그 다음 다시 test3을 컴파일한다. 

D:\workspace\eclipse\2019-03\test\src\test>javac -cp . test3.java

 

이제 test를 실행해본다. 발생한다!

D:\workspace\eclipse\2019-03\test\src>java test.test
바보
Exception in thread "main" java.lang.IllegalAccessError: tried to access field test.test3.a from class test.test
        at test.test.main(test.java:6)

a 필드에 접근할수가 없어서 발생한다. 다시 메모장을 열어 a 필드는 public으로 수정하고 다시 실행해보자. 

D:\workspace\eclipse\2019-03\test\src>java test.test
바보
바보2
바보
Exception in thread "main" java.lang.IllegalAccessError: tried to access method test.test3.printA()V from class test.test
        at test.test.main(test.java:8)

 

이제 확실히 알 수 있었다. IllegalAccessError는 컴파일 시점에는 접근이 가능했던 필드나 메소드가 실행단계에서 접근이 되지 않을 때 발생하는 Error가 되시겠다. 

java.lang.Object
	java.lang.Throwable
		java.lang.Error
			java.lang.LinkageError
				java.lang.IncompatibleClassChangeError
					java.lang.IllegalAccessError

원인을 알아보기가 다소 까다로웠지만 한번쯤 따라해보면서 확실히 이해하고 넘어가는것도 나쁘지 않을 것 같다. 

 

당연히 해결하기 위해서는 접근이 가능하도록 해야하는데 대개 참고하는 라이브러리의 버전이 갑자기 바뀐 경우들이 많을 것 같다. 해당 프로젝트의 jar가 갑자기 바뀐다거나... 아마도..?

 

댓글
최근에 올라온 글
최근에 달린 댓글