2011-08-16 33 views
51

Tôi nhận được một ngoại lệ và tôi không thể tìm thấy lý do của nó.java.lang.IllegalAccessError: cố gắng truy cập vào phương thức

Ngoại lệ tôi nhận được là:

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

Phương pháp này là công khai.

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; 
} 

tôi đang sử dụng apache tomcat 5.5.12 và JAVA 1,6

Trả lời

56

Bạn đang gần như chắc chắn sử dụng một phiên bản khác nhau của lớp trong thời gian chạy đến một trong những bạn mong đợi. Cụ thể, lớp thời gian chạy sẽ khác với lớp thời gian chạy mà bạn đã biên dịch (nếu không điều này sẽ gây ra lỗi biên dịch) - có phương pháp đó bao giờprivate? Bạn có phiên bản cũ của các lớp/lọ trên hệ thống của bạn bất cứ nơi nào?

Khi javadocs cho IllegalAccessError nhà nước,

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.

tôi chắc chắn muốn nhìn vào classpath của bạn và kiểm tra xem nó giữ bất kỳ bất ngờ.

+3

@yossi: Vậy bạn đã giải quyết nó như thế nào? Biên dịch lại soruce và đặt nó trong classpath của bạn? Chỉ cần tò mò nếu bạn giải mã lớp gốc và saaw những gì đã ở trong đó. – Victor

+0

Khi tôi có điều này, tôi đã lưu tệp bằng chức năng riêng tư được đặt ở chế độ công khai và vì vậy, trình chỉnh sửa đã thấy mọi thứ đều ổn trong tệp .jsp nhưng tôi đã không khởi chạy lại chương trình chính để nó chưa thực sự biên dịch phiên bản. –

+0

Tôi nhận được lỗi này từ gói maven vừa được cài đặt. Tôi đã cập nhật dự án và dọn dẹp nó nhưng mọi thứ dường như thay đổi .. – softwareplay

5

Nếu getData được bảo vệ, hãy thử đặt chế độ công khai. Vấn đề có thể tồn tại trong JAVA 1.6 và không có trong 1.5x

Tôi nhận được sự cố này. Illegal access error

75

Điều này xảy ra khi truy cập một gói phạm vi phương pháp của một lớp trong cùng một gói nhưng nằm trong một bình khác và trình nạp lớp.

This là nguồn của tôi, nhưng liên kết đã bị hỏng. Sau đây là toàn bộ văn bản từ bộ nhớ cache của google:

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

Tôi đã gặp vấn đề này trên 'commons-collections-3.2.1.jar' dưới JBoss EAP 5.3 với Struts 1.1 vì JAR này đã có trong JBoss thư viện nhưng cũng được đóng gói trong các ứng dụng của tôi. Tôi đã xóa JAR khỏi ứng dụng của tôi đã giải quyết được sự cố. –

+2

Bạn vừa cứu tôi Rất nhiều thời gian và thần kinh. Rất đẹp! – msteiger

+0

Im nhận được lỗi này cho một phương pháp tĩnh công cộng mà bây giờ có một đối số thứ 2. Tệp jar cũ không còn tồn tại vì tôi đã thay thế nó. Bất kỳ ý tưởng? – Markus

1

Điều này xảy ra với tôi khi tôi có một lớp học trong một cố gắng truy cập phương thức riêng tư trong lớp từ một lọ khác. Tôi chỉ đơn giản là thay đổi phương thức riêng thành công khai, biên dịch lại và triển khai, và nó đã hoạt động tốt sau đó.

0

Từ quan điểm Android: Phương pháp không có sẵn trong phiên bản api

tôi đã nhận được số này chủ yếu là do tôi đã sử dụng một số điều mà không phải là có sẵn/tán thành trong phiên bản Android

Wrong cách:

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

Đúng cách:

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

tại đây Thông báo.Hành động không có sẵn trước khi API 20 và phiên bản tối thiểu của tôi là API 16

0

Chỉ cần một sự bổ sung cho câu trả lời giải quyết:

này CÓ THỂ là một vấn đề với tính năng Run tức thì Android Studio, cho Ví dụ, nếu bạn nhận ra rằng bạn quên thêm dòng mã: finish() vào hoạt động của bạn sau khi mở một hoạt động khác và bạn đã mở lại hoạt động bạn không nên mở lại (đã giải quyết xong finish()), sau đó bạn thêm finish() và Instant Chạy xảy ra, sau đó ứng dụng sẽ sụp đổ vì logic đã bị hỏng.


TL: DR;

này không nhất thiết phải là một vấn đề mã, chỉ cần một Instant Chạy vấn đề

2

tôi đã nhận được lỗi này trên một ứng dụng xuân Boot nơi một @RestController ApplicationInfoResource có một lớp lồng nhau ApplicationInfo.

Có vẻ như Spring Boot Dev Tools đang sử dụng trình tải lớp khác.

Ngoại lệ tôi đã nhận được

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

Giải pháp

Tôi di chuyển các lớp lồng nhau ApplicationInfo vào một tập tin java riêng biệt và đã thoát khỏi những vấn đề.

Các vấn đề liên quan