2015-05-04 17 views
6

Tôi đang mã hóa trong IntelliJ IDEA. Khi gỡ lỗi ứng dụng của tôi, tôi không thể sử dụng một số triển khai phương pháp mặc định trong Đồng hồ.Trình gỡ lỗi Java không thể gọi một số phương pháp triển khai mặc định

Dưới đây là một ví dụ đặc:

public class Friendship { 
    interface Friend { 
     default void sayHiTo(Friend friend) { 
      System.out.println("Hi, " + friend.hashCode()); 
     } 

     default int amountOfHands() { 
      return 2; 
     } 
    } 

    public static class BasicFriend implements Friend { 

     int numberOfFaces() { 
      return 1; 
     } 
    } 

    public static void main(String[] args) { 
     System.out.println("Put a breakpoint here"); 
    } 
} 

Trong main() phương pháp tôi đặt một breakpoint và thiết lập ba đồng hồ:

// Default interface method with dependency 
new BasicFriend().sayHiTo(new BasicFriend()) 

// Default interface method without dependency 
new BasicFriend().amountOfHands() 

// Class method 
new BasicFriend().numberOfFaces() 

Chiếc đồng hồ đầu tiên ném NoSuchMethodException phàn nàn rằng phương pháp Friendship$BasicFriend.sayHiTo() không tồn tại .

Đồng hồ thứ hai chạy thành công, nhưng kỳ lạ nó báo cáo một đối tượng được đóng hộp {[email protected]} "2" thay vì chỉ nguyên thủy 2.

Đồng hồ thứ ba báo cáo số nguyên thủy 1, đúng như mong đợi.

Tại sao đồng hồ đầu tiên không hoạt động? Đây có phải là một lỗi? Đây thực sự là IDE liên quan? Có phải vì một số lỗ hổng khái niệm về các phương thức mặc định không? Tôi có nên làm việc như tôi muốn ngay từ đầu không? Kết quả kỳ lạ của chiếc đồng hồ thứ hai có liên quan gì đến vấn đề trong chiếc đồng hồ đầu tiên không?

+2

Sau khi đọc lại câu hỏi của bạn, tôi nhận được như vậy ngoại trừ chiếc đồng hồ đầu tiên của bạn. Trong đồng hồ đầu tiên của bạn, tôi nhận được 'java.lang.ClassCastException: com.sun.tools.jdi.InterfaceTypeImpl không thể được cast thành com.sun.tools.jdi.ClassTypeImpl'. Tôi đoán đây chỉ là lỗi trình biên dịch IntelliJ. Tôi đang sử dụng IntelliJ 14.1.2 trên Ubuntu. – mkobit

Trả lời

6

Trước JDK 8u40, các phương thức giao diện mặc định và tĩnh không được hỗ trợ bởi JDI (Giao diện gỡ lỗi Java), JDWP (Java Debugger Wire Protocol) và JDB (trình gỡ lỗi Java tiêu chuẩn). Đây là bug JDK-8042123, được ghi là cố định ở 8u40 và một khoảng trống tương ứng xuất hiện trong số 8u40 release notes.

Cập nhật lên 8u40 trở lên để khắc phục vấn đề này, ít nhất là ở phía JDK.

Từ mô tả lỗi, có vẻ như các thay đổi bên gỡ lỗi cũng được yêu cầu, để tránh việc nhập các đối tượng com.sun.jdi.InterfaceType thành com.sun.jdi.ClassType, nhưng thay vào đó hãy gọi trực tiếp InterfaceType.invokeMethod().

Trong trường hợp cụ thể của IntelliJ, Suseika confirmed in a comment, 14.1.2 hầu hết đã khắc phục sự cố (ngoại trừ trường hợp không mong muốn), mặc dù Mike Kobit still experiences this problem trên phiên bản đó với đề xuất của ClassCastException về dàn diễn viên không chính xác ở trên.

+0

Tôi đã cài đặt Java 8u45, nhưng vẫn nhận được NoSuchMethodException. Tuy nhiên, việc cập nhật IntelliJ IDEA từ 14.0.3 lên 14.1.2 đã làm thủ thuật - bây giờ các phương thức mặc định trong trình gỡ rối hoạt động gần như đúng (cái thứ hai vẫn trả về đối tượng đóng hộp, nhưng đó là câu hỏi khác). – gvlasov

+2

@Suseika Cảm ơn thông tin (được chỉnh sửa thành câu trả lời). Điều đó dường như xác nhận rằng các thay đổi bên gỡ lỗi là bắt buộc. –

+0

Về quyền anh. Tôi đã gửi báo cáo lỗi về điều đó, bạn có thể tìm thấy báo cáo này tại đây: https://youtrack.jetbrains.com/issue/IDEA-139945 – gvlasov

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