2011-08-16 11 views
51

Otrzymuję wyjątek i nie mogę znaleźć przyczyny.java.lang.IllegalAccessError: próbowałem uzyskać dostęp do metody

Wyjątek pojawia się:

java.lang.IllegalAccessError: tried to access method Connected.getData(Ljava/lang/String;)Ljava/sql/ResultSet; from class B

Metoda jest publiczna.

public class B 
{ 
    public void myMethod() 
    { 
    Connected conn = new Connected(); // create a connected class in order to connect to The DB 
    ResultSet rs = null; // create a result set to get the query result 
    rs = conn.getData(sql); // do sql query 
    } 
} 

public class Connected 
{ 
public ResultSet getData(String sql) 
{ 
    ResultSet rs = null; 
    try 
    { 
    prepareConnection(); 
    stmt = conn.createStatement(); 
    stmt.execute(sql); 
    rs = stmt.getResultSet(); 
    } 
    catch (SQLException E) 
     { 
    System.out.println("Content.getData Error"); 
    E.printStackTrace(); 
     } 
return rs; 
} 

Używam Apache Tomcat 5.5.12 i JAVA 1.6

Odpowiedz

56

Jesteś prawie na pewno stosując inną wersję klasy w czasie wykonywania do jednego można się spodziewać. W szczególności klasa środowiska wykonawczego będzie inna niż klasa kompilowana przeciwko (inaczej spowodowałoby to błąd w czasie kompilacji) - czy ta metoda jest już dostępna? Czy masz stare wersje klas/słoików w twoim systemie?

Jak Javadocs dla IllegalAccessError stanie,

Normally, this error is caught by the compiler; this error can only occur at run time if the definition of a class has incompatibly changed.

Zdecydowanie spojrzeć na ścieżce klas i sprawdzić, czy posiada ona żadnych niespodzianek.

+3

@yossi: Jak to rozwiązałeś? Przekompiluj plik i umieść go w ścieżce klas? Ciekawe, czy zdekompilowałeś oryginalną klasę i zobaczysz, co w niej było. – Victor

+0

Kiedy to zrobiłem, zapisałem plik z prywatną funkcją publiczną, więc redaktor zobaczył wszystko w porządku w pliku .jsp, ale nie uruchomiłem ponownie głównego programu, więc nie skompilowałem nowego wersja. –

+0

Otrzymuję ten błąd z właśnie zainstalowanego pakietu maven. Zaktualizowałem projekt i wyczyściłem go, ale wszystko wydaje się zmieniać ... – softwareplay

5

Jeśli getData jest chroniony, spróbuj go upublicznić. Problem może wystąpić w JAVA 1.6 i nieobecny w 1.5x

Mam to dla twojego problemu. Illegal access error

75

Zdarza się to podczas uzyskiwania dostępu do metody o pakowaniu w pakiet klasy, która jest w tym samym pakiecie, ale znajduje się w innym słoiku i programie ładującym klasy.

This było moim źródłem, ale link jest teraz uszkodzony. Poniżej pełny tekst z google cache:

Packages (as in package access) are scoped per ClassLoader.

You state that the parent ClassLoader loads the interface and the child ClassLoader loads the implementation. This won't work because of the ClassLoader-specific nature of package scoping. The interface isn't visible to the implementation class because, even though it's the same package name, they're in different ClassLoaders.

I only skimmed the posts in this thread, but I think you've already discovered that this will work if you declare the interface to be public. It would also work to have both interface and implementation loaded by the same ClassLoader.

Really, if you expect arbitrary folks to implement the interface (which you apparently do if the implementation is being loaded by a different ClassLoader), then you should make the interface public.

The ClassLoader-scoping of package scope (which applies to accessing package methods, variables, etc.) is similar to the general ClassLoader-scoping of class names. For example, I can define two classes, both named com.foo.Bar, with entirely different implementation code if I define them in separate ClassLoaders.

Joel

+1

Mam ten problem na 'commons-collections-3.2.1.jar' pod JBoss EAP 5.3 z Struts 1.1, ponieważ ten JAR jest już w JBoss biblioteki, ale również zostały spakowane w moje aplikacje. Usunąłem plik JAR z mojej aplikacji, która rozwiązała problem. –

+2

Właśnie uratowałeś mi DUŻO czasu i nerwów. Bardzo dobrze! – msteiger

+0

Otrzymuję ten błąd dla publicznej statycznej metody, która teraz ma drugi argument. Stary plik jar już nie istnieje, odkąd go zastąpiłem. Jakieś pomysły? – Markus

1

To zdarzyło się do mnie, gdy miałem klasę w jednym słoiku próbuje uzyskać dostęp do prywatnej metody w klasie innego słoika. Po prostu zmieniłem metodę prywatną na publiczną, zrekompilowałem i wdrożono, a potem wszystko działało dobrze.

0

Z perspektywy Android: Metoda nie jest dostępny w wersji api

I był już ten problem przede wszystkim dlatego używałem coś, co nie jest dostępna/przestarzałe w tej wersji Androida

Niewłaściwy sposób:

Notification.Builder nBuilder = new Notification.Builder(mContext); 
nBuilder.addAction(new Notification.Action(android.R.drawable.ic_menu_view,"PAUSE",pendingIntent)); 

Prawy sposób:

Notification.Builder nBuilder = new Notification.Builder(mContext); 
nBuilder.addAction(android.R.drawable.ic_media_pause,"PAUSE",pendingIntent); 

tutaj Powiadomienie.Akcja nie jest dostępna przed API 20 i mój min wersja była API 16

0

tylko dodatkiem do rozwiązany odpowiedź:

To może być problem z Instant funkcji Run Android Studio, dla na przykład, jeśli zdałeś sobie sprawę z tego, że nie zapomniałeś dodać linii kodu: finish() do swojej aktywności po otwarciu kolejnej, a już ponownie otworzyłeś działanie, którego nie powinieneś już otwierać (co rozwiązano pod finish()), to dodajesz finish() i Instant Uruchomi się, a następnie aplikacja ulegnie awarii, ponieważ logika została zerwana.


TL: DR;

To niekoniecznie jest problemem kod, tylko Instant Run problemem

2

ja otrzymuję ten błąd w aplikacji Wiosna Boot gdzie @RestController ApplicationInfoResource miał zagnieżdżone klasy ApplicationInfo.

Wygląda na to, że Spring Boot Dev Tools używał innego programu ładującego klasy.

Wyjątkiem byłem coraz

2017-05-01 17:47:39.588 WARN 1516 --- [nio-8080-exec-9] .m.m.a.ExceptionHandlerExceptionResolver : Resolved exception caused by Handler execution: org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.IllegalAccessError: tried to access class com.gt.web.rest.ApplicationInfo from class com.gt.web.rest.ApplicationInfoResource$$EnhancerBySpringCGLIB$$59ce500c

rozwiązanie

przeniosłem zagnieżdżony klasy ApplicationInfo do osobnego pliku .java i pozbył się problemu.

Powiązane problemy