小编yaw*_*kat的帖子

内部类的构造函数引用在运行时因VerifyError而失败

我正在使用lambda为内部类构造函数创建供应商ctx -> new SpectatorSwitcher(ctx).IntelliJ建议我将其SpectatorSwitcher::new改为.SpectatorSwitcher是我正在使用的类的非静态内部类.建议的代码编译得很好(使用maven)但我在执行时得到以下VerifyError:

Exception in thread "main" java.lang.VerifyError: Bad type on operand stack
Exception Details:
  Location:
    Test.lambda$runTest$8(LTest$Worker;)V @2: invokedynamic
  Reason:
    Type 'Test$Worker' (current frame, stack[1]) is not assignable to 'Test'
  Current Frame:
    bci: @2
    flags: { }
    locals: { 'Test$Worker' }
    stack: { 'Test$Worker', 'Test$Worker' }
  Bytecode:
    0000000: 2a2a ba00 0b00 00b6 000c b1            

    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2688)
    at java.lang.Class.getMethod0(Class.java:2937)
    at java.lang.Class.getMethod(Class.java:1771)
    at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)
Run Code Online (Sandbox Code Playgroud)

为什么javac/maven在编译时没有失败但仍然产生无效的字节代码?

编辑:问题似乎比简单调用复杂得多,这是重现它所需的代码:

import java.util.function.Function;

/**
 * @author …
Run Code Online (Sandbox Code Playgroud)

java lambda inner-classes java-8 constructor-reference

16
推荐指数
1
解决办法
689
查看次数

逻辑AND运算符在这里有用吗?

我一直在阅读我使用的API实现的源代码,并偶然发现了这部分代码:

if (condition1 & condition2 && (condition3 || condition4))
Run Code Online (Sandbox Code Playgroud)

条件1和2不会调用任何方法或执行任何操作,而3和4则不会.我想知道为什么程序员决定不使用短路&&运算符来比较前两个语句,因为我看不到使用它的任何好处(还有一个条件要检查,另外两个条件可能对其他条件有任何影响)部分程序仍然是短路的.

java

3
推荐指数
1
解决办法
99
查看次数