오늘은 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가 갑자기 바뀐다거나... 아마도..?
'dev > java' 카테고리의 다른 글
자바 AOP - CGLIB에 사용되는 ASM을 알아보자 - Java AOP #3 (0) | 2021.02.16 |
---|---|
자바 AOP - JDK Dynamic Proxy 사용해보기 - Java AOP #2 (0) | 2021.02.15 |
java.net.MalformedURLException 원인 및 에러 해결 방법 (0) | 2020.11.03 |
자바 개발자를 위한 이클립스 단축키 top 30 (4) | 2020.10.26 |
NumberFormatException 원인과 에러/예외 해결 방법 (1) | 2020.01.12 |
RuntimeException란 무엇인가? (1) | 2020.01.10 |
java.lang.IllegalAccessException 에러 해결 방법 (0) | 2019.12.23 |
java.lang.IndexOutOfBoundsException Index: 0, Size: 0 에러 해결 방법( ArrayIndexOutOfBoundsException, StringIndexOutOfBoundsException) (0) | 2019.12.14 |