2014-06-12 16 views
8

Tôi đã đọc nhiều bài viết về ArrayStoreExceptions, hầu hết trong số họ rơi vào một trong các loại:Làm thế nào tôi có thể khắc phục sự cố một ArrayStoreException

  • hiểu lầm cơ bản (đặt một lớp cơ sở vào một tuyên bố mảng của lớp trẻ)
  • hiểu lầm tương tự khi nhận được lỗi này chuyển đổi từ danh sách sang các mảng
  • "hiệp biến" vấn đề mảng vs Generics

xung quanh mỏ không rơi vào bất kỳ các danh mục này. Có one other case, OP nghi ngờ một loại lỗi nào đó chỉ xuất hiện trên Unix. Tôi nghĩ rằng tôi đang có trường hợp đó và tôi không chắc chắn làm thế nào để có được gần gũi hơn với vấn đề này.

Tôi đã phá vỡ các mã xuống càng nhiều càng tốt, nó trông như thế này:

System.out.println("Declaring RecordValues array"); 
RecordValues[] rv = new RecordValues[3]; 
System.out.println("This array is meant for "+rv.getClass().getComponentType()); 
System.out.println("Adding user defaults which is: "+userdefaults.getClass().getName()); 
System.out.println("Its parent is: "+userdefaults.getClass().getSuperclass().getName()); 
rv[0] = userdefaults; 
System.out.println("Adding templvalues which is: "+tmplvalues.getClass().getName()); 
rv[1] = tmplvalues; 
System.out.println("Adding sessionvalues which is: "+tmplvalues.getClass().getName()); 
rv[2] = sessionvalues; 

Và nó ra:

[ant:createwo] Declaring RecordValues array 
[ant:createwo] This array is meant for class org.kp.mbe.arscli.datamap.RecordValues 
[ant:createwo] Adding user defaults which is: org.kp.mbe.arscli.datamap.UserValues 
[ant:createwo] Its parent is: org.kp.mbe.arscli.datamap.RecordValues 
:createwo FAILED <-- 
... 
Caused by: java.lang.ArrayStoreException: org.mbe.arscli.datamap.UserValues 

UserValues ​​là một tiểu loại RecordValues. Tôi đã tạo một số thử nghiệm đơn giản bằng cách sử dụng các lớp được đề cập nhưng không thể sao chép lỗi. Ngoài ra (đây là một phần thực sự kỳ lạ), điều này đã được làm việc trong hơn sáu tháng. Tôi đã thực hiện các thay đổi ở các phần khác của công cụ nhưng không có gì ở gần các thư viện này. Nó đột nhiên xuất hiện.

Tôi tự hỏi điều gì khác có thể gây ra ArrayStoreException. Tôi chắc chắn 100% rằng UserValues ​​là một lớp con của RecordValues, ngay sau khi tôi cố gắng thêm nó vào mảng, nó không thành công. Host là 64bit RH linux, phiên bản java OpenJDK 1.7.0.45.

Tôi biết ArrayStoreException đang nói gì với tôi, câu hỏi của tôi là làm cách nào để tôi có thể thực hiện thêm bước này trong khắc phục sự cố? Nếu UserValues ​​IS A RecordValues, tôi sẽ đi đâu từ đây ??

+1

Nó có thể liên quan đến các trình tải lớp khác nhau và các phiên bản khác nhau của lớp không? Thử thêm một kiểm tra 'instanceof', ví dụ: 'if (userdefaults instanceof RecordValues) {/ * in ra một cái gì đó * /}' – Taylor

+0

Ngoài ra, bạn chắc chắn về sự khởi tạo của 'RecordValues ​​[] rv = new RecordValues ​​[3];' là chính xác, và không được thực hiện gián tiếp? bởi instantiation tôi có nghĩa là những thứ sau khi '=') – Taylor

+0

Bạn nhấn móng tay trên đầu, tôi cập nhật trong câu trả lời. – AndyJ

Trả lời

1

Sau khi đăng, tôi đã lên trên mảng và thay đổi này vào một danh sách đó, trong khi vẫn thất bại, đã đưa ra một nhiều cụ thể hơn vấn đề:

Caused by: java.lang.LinkageError: loader constraint violation: when 
resolving method 
"org.mbe.arscli.datamap.ValueResolver.resolve(Ljava/util/List;)Lorg/mbe/arscli/datamap/RecordValues;" 
the class loader (instance of org/apache/tools/ant/loader/AntClassLoader5) of the current class, 
org/build/ant/CreateRemedyWo, and the class loader (instance of java/net/URLClassLoader) for resolved class, 
org/mbe/arscli/datamap/ValueResolver, have different Class objects for the type)Lorg/mbe/arscli/datamap/RecordValues; used in the 
signature 

Như @Taylor đoán, điều này đã được gây ra bởi nhiều trình nạp lớp thông qua gradle. Mặc dù tôi đã không thay đổi mã này trong một thời gian dài, gần đây tôi đã thay đổi các khai báo phụ thuộc trong tệp xây dựng. May mắn thay, lỗi tôi nhận được từ Danh sách chính xác hơn lỗi từ Array!

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