Java 调试器无法调用某些默认方法实现

2023-11-27

我正在 IntelliJ IDEA 中编码。调试我的应用程序时,我无法使用某些默认方法实现Watches.

这是一个浓缩示例:

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

In main()我设置了一个断点并设置了三个手表的方法:

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

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

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

第一个手表抛出NoSuchMethodException抱怨那个方法Friendship$BasicFriend.sayHiTo()不存在。

第二个手表运行成功,但奇怪的是它报告了一个盒装物体{java.lang.Integer@537} "2"而不仅仅是一个原始的2.

正如预期的那样,第三个手表报告原始值 1。

为什么第一块手表不工作?这是一个错误吗?这实际上与 IDE 有关吗?是因为默认方法的一些概念缺陷吗?它应该首先按照我想要的方式工作吗?第二块手表的奇怪结果是否与第一块手表的问题有某种关系?


在 JDK 8u40 之前,JDI(Java 调试器接口)、JDWP(Java 调试器有线协议)和 JDB(标准 Java 调试器)不支持默认和静态接口方法。这是错误 JDK-8042123,在 8u40 中记录为固定,并且相应的简介出现在8u40 发行说明.

更新到 8u40 或更高版本以解决此问题,至少在 JDK 端。

从错误描述来看,似乎还需要调试器端进行更改,以避免将 com.sun.jdi.InterfaceType 对象强制转换为 com.sun.jdi.ClassType,而是直接调用 InterfaceType.invokeMethod()。

在 IntelliJ 的具体情况下,Suseika 在评论中证实14.1.2 已经基本解决了这个问题(除了意外的拳击)迈克科比特仍然遇到这个问题在该版本上,带有 ClassCastException 表明上面的转换不正确。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 调试器无法调用某些默认方法实现 的相关文章

随机推荐

  • ASP.NET MVC 3结构-去另一个项目中查看

    我有以下项目设置 项目A 主要 商业 Data 查看 asp net mvc 3 项目 N项目 商业 Data 查看 asp net mvc 3 项目 我如何从项目 A 调用项目 N 中的视图 并从 N 调用回 A 本质上 我想要做的是将每
  • 添加一个钩子来全局记录node.js/express中的所有节点HTTP响应

    我使用 Node js 和 Express 来处理 HTTP 请求和响应 通过使用http ServerRequest事件 我可以添加一个挂钩并记录 HTTP 请求 好像没有类似的活动http ServerResponse我想知道如何使用我
  • C++ 获取处理器 ID

    这个线程没问题 如何获取处理器和主板 ID 我想使用 C 代码而不是使用 WMI 或任何第三方库来获取处理器 ID 或者计算机上任何被证明是唯一的东西 一件事是以太网 ID 但在某些机器上它又是可移除的 我想主要将其用于许可目的 处理器 I
  • iOS7发布后是否还可以向App Store提交针对iOS5或iOS6的应用程序

    就像问题所说的 鉴于 iOS7 现已推出 我是否能够向 App Store 提交 iOS5 iOS6 应用程序 或者我的构建必须以 iOS7 为目标吗 我知道涉及大量的 UI 更改 新功能 看起来不太好等 但我只是想知道是否仍然可以提交旧目
  • 方形图像视图

    我想展示一个ImageView它在对话框内始终是方形的 尺寸可能会根据显示器的分辨率而变化 准确地说是纵向宽度 但 ImageView 需要形成尽可能大的正方形 以在其中容纳正方形图像 这是我的 XML 代码
  • Mule 3:控制是否允许执行流

    我目前的情况 我目前有一个 Mule ESB 应用程序 其中包含三个流 这些流处理来自两个不同源的消息 这三个流使用 VM 队列绑定在一起 Flow 1 入站 端点 1 gt 执行消息处理和转换 gt 出站 端点 3 Flow 2 入站 端
  • 类型错误:“tuple”和“str”实例之间不支持“<”

    我有一个构建哈夫曼树的方法 如下所示 def buildTree tuples while len tuples gt 1 leastTwo tuple tuples 0 2 get the 2 to combine theRest tup
  • Google 地图 API v3 标记重叠

    我正在使用谷歌地图制作一个应用程序 当标记重叠时 即使图标不同 也仅显示最后一个 我不希望它在这种情况下聚集 而是应该通过更改坐标来显示两者 但是 有什么解决办法吗 我认为这是一个非常优雅的解决方案 称为 蜘蛛化标记 https githu
  • 从 Active Directory PrimaryContext 获取所有用户

    我使用以下代码来访问 AD 中的用户列表 但是在将用户添加到组合框的行上 出现空引用异常 PrincipalContext AD new PrincipalContext ContextType Domain mydomainip User
  • 将 24 小时制时间转换为 Joda-Time 中的 am/pm

    我刚刚开始工作乔达时间 并让它正确显示我的日期24小时制 军事时间 但我宁愿是上午 下午 查了一下 里面提到了一天中的某个时刻我认为这是 HH 值 所以我尝试编写一个循环将其分解为 AM Pm 但它从未成功 DateTime dtf new
  • 如何在 Cython 中将 C 指针和长度包装在新型缓冲区对象中?

    我正在 Cython 中编写 Python 2 7 扩展模块 如何创建一个实现新型缓冲区接口的 Python 对象 该对象包装由 C 库提供给我的一块内存 内存块只是一串字节 而不是结构或多维数组 我得到了一个const void 指针和长
  • 我可以使用 bootstrap 来设计 HTML 电子邮件模板吗

    我需要设计一个HTML 电子邮件模板通过电子邮件发送给我的客户 我知道对于设计一个 html 电子邮件模板 不应有 css 文件linked 所有样式都应该内联到 html 中 所有图像应该是引用的通过在线服务器 url 不应存储在本地 我
  • 如何按空格分割字符串但在引号内转义空格(在java中)? [复制]

    这个问题在这里已经有答案了 我有一个像这样的字符串 Video or movie parent Media or entertainment 1 1 1 0 0 我想用空格分割它 但引号内的空格应该被忽略 所以分割后的字符串应该是 Vide
  • 使用 CLLocation 计算两个坐标之间的距离

    我在用着CLLocationDistance获取两点之间的距离 但在传递当前位置时出现错误 CLLocation current CLLocation alloc initWithLatitude startLocation coordin
  • uniswap 程序集 create2 功能如何工作?

    我正在查看 uniswap 代码 试图理解代码 其中大部分内容都非常清楚 但我确实有一些问题 在这个函数中 function createPair address tokenA address tokenB external returns
  • 在值构造函数中指定类约束

    有没有办法为值构造函数的参数定义类约束 像这样的东西 data Point2D Num a gt Point a a 那么 Point 可以接受任何参数 只要它们属于 Num 类 您可以使用ExistentialQuantification
  • 删除列表中元组的第一个元素

    我有一个元组列表 如下所示 values 1 hi you 2 bye bye 然而 每个元组的第一个元素不是必需的 期望的输出是 hi you bye bye 我已经做了足够的研究 知道我无法操作元组 但我似乎无法找到如何成功删除列表中每
  • 我如何“取消设置”已声明的类

    我有一个完整的表单创建系统 有许多不同的问题类型 我必须检查该人所做的答案是否正确 所有类型的问题都有自己的类 始终称为 ItemClass 并且该类位于其自己的文件中 每次提出问题时 我都会包含该文件 但存在问题 我必须在一个 PHP 文
  • 如何在字符串的特定位置添加字符?

    我正在使用 Notepad 想要使用正则表达式替换在字符串中的特定位置插入字符 比如说 在每行的位置 6 处插入一个逗号 表达式会是什么 如果您想在第六个字符之后添加一个字符 只需使用搜索 6 和替换 1 示例插入一个 从技术上讲 这会将每
  • Java 调试器无法调用某些默认方法实现

    我正在 IntelliJ IDEA 中编码 调试我的应用程序时 我无法使用某些默认方法实现Watches 这是一个浓缩示例 public class Friendship interface Friend default void sayH