标签: java-11

Java Casting:Java 11抛出LambdaConversionException,而1.8则没有

以下代码在Java 1.8 VM中可以正常运行,但是LambdaConversionException在Java 11 VM中执行时会产生一个。区别在哪里,为什么表现得如此?


码:

public void addSomeListener(Component comp){
    if(comp instanceof HasValue) {
        ((HasValue<?,?>) comp).addValueChangeListener(evt -> {
            //do sth with evt
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

HasValue Javadoc

异常(仅V11):

Caused by: java.lang.invoke.LambdaConversionException: Type mismatch
for instantiated parameter 0: class java.lang.Object is not a subtype
of interface com.vaadin.flow.component.HasValue$ValueChangeEvent
    at java.base/java.lang.invoke.AbstractValidatingLambdaMetafactory.checkDescriptor(AbstractValidatingLambdaMetafactory.java:308)
    at java.base/java.lang.invoke.AbstractValidatingLambdaMetafactory.validateMetafactoryArgs(AbstractValidatingLambdaMetafactory.java:294)
    at java.base/java.lang.invoke.LambdaMetafactory.altMetafactory(LambdaMetafactory.java:503)
    at java.base/java.lang.invoke.BootstrapMethodInvoker.invoke(BootstrapMethodInvoker.java:138)
    ... 73 more
Run Code Online (Sandbox Code Playgroud)

解决方法:

ValueChangeListener<ValueChangeEvent<?>> listener = evt -> {
    // do sth with evt
};
((HasValue<?,?>) comp).addValueChangeListener(listener);
Run Code Online (Sandbox Code Playgroud)

系统:
操作系统:Windows 10
IDE:Eclipse 2018-12(4.10.0)
Java(编译):ecj …

java eclipse java-8 java-11 vaadin-flow

55
推荐指数
1
解决办法
1942
查看次数

Java 11 - 针对Java 8的性能回归?

更新:看到每个方法可能会遇到不同的性能问题,我决定将这个问题分成两个:

  1. Java 11中的空方法明显慢于Java 8
  2. 在Java 11中使用堆栈跟踪的速度明显慢于Java 8

最初的讨论可以在下面找到......


当我遇到一些令人惊讶的数据时,我正在比较我的库在Java 8和11下的性能.这是基准代码:

import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.infra.Blackhole;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.concurrent.TimeUnit;

@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public class MyBenchmark
{
    @Benchmark
    public void emptyMethod()
    {
    }

    @Benchmark
    public void throwAndConsumeStacktrace(Blackhole bh)
    {
        try
        {
            throw new IllegalArgumentException("I love benchmarks");
        }
        catch (IllegalArgumentException e)
        {
            StringWriter sw = new StringWriter();
            e.printStackTrace(new PrintWriter(sw));
            bh.consume(sw.toString());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

运行jmh 1.21,OracleJDK 1.8.0_192返回:

MyBenchmark.emptyMethod                avgt   25      0.363 ±   0.001  ns/op
MyBenchmark.throwAndConsumeStacktrace  avgt …
Run Code Online (Sandbox Code Playgroud)

performance microbenchmark java-8 jmh java-11

54
推荐指数
0
解决办法
3695
查看次数

为什么 Java 14 不是 LTS?

Java 14是非 LTS

考虑到 6 个月发布的新版本序列,并且 8 和 11 是 LTS,Java 14 不应该是下一个 LTS 版本吗?

还是纯粹基于 Java 架构师来决定他们为 LTS 选择哪个?

我确实在网上搜索过,但找不到答案。

java lts java-8 java-11 java-14

54
推荐指数
2
解决办法
2万
查看次数

IntelliJ无法使用OpenJDK 11识别JavaFX 11

我无法让IntellJ识别JavaFX包.使用OpenJDK 11的新JavaFX项目,在尝试构建项目时,IntelliJ无法识别JavaFX包.

我是openjfx:javafx-base-11从Maven回购中导入的.

我已经查看了其他问题,解决方案似乎包括检查字节码是否处于正确的级别(我的是),以及项目语言是否正确(我的是).

有人有主意吗?

pic 1

pic 2

pic 3

编辑:

错误:

在此输入图像描述

java javafx intellij-idea java-11 javafx-11

53
推荐指数
4
解决办法
5万
查看次数

JDK 11+ 和 Javadoc

Exit code: 1 - javadoc: error - The code being documented uses packages in the unnamed module, but the packages defined in https://docs.oracle.com/en/java/javase/11/docs/api/ are in named modules.
Run Code Online (Sandbox Code Playgroud)

有没有人能够使 javadoc 工作而不必将源版本更改为 1.8(如其他论坛中所建议的那样)?我正在使用 JDK v11.0.5 并且问题仍然存在(JDK 12+ 也是如此)。

编辑:此错误源自 maven 并由 maven-javadoc-plugin 抛出。即使使用<source>8</source>配置,我也无法使其适用于 JDK 11+ 。

java javadoc maven maven-javadoc-plugin java-11

52
推荐指数
4
解决办法
1万
查看次数

为什么Java编译器11使用invokevirtual来调用私有方法?

When compiling the code below with the Java compiler from OpenJDK 8, the call to foo() is done via an invokespecial, but when OpenJDK 11 is used, an invokevirtual is emitted.

public class Invoke {
  public void call() {
    foo();
  }

  private void foo() {}
}
Run Code Online (Sandbox Code Playgroud)

Output of javap -v -p when javac 1.8.0_282 is used:

  public void call();
    descriptor: ()V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #2      // Method foo:()V
         4: return
Run Code Online (Sandbox Code Playgroud)

Output …

java jvm javac java-8 java-11

51
推荐指数
2
解决办法
1446
查看次数

如何在Ubuntu下安装JDK 11?

所以Java 11 已经出局了.有人知道如何从命令行安装它(来自Oracle的OpenJDK)吗?

我希望看到之前的Oracle Java 10:

sudo add-apt-repository ppa:linuxuprising/java
sudo apt-get update
sudo apt-get install oracle-java10-installer
Run Code Online (Sandbox Code Playgroud)

PS在提出类似问题的指导中:

sudo apt-get install openjdk-11-jdk
Run Code Online (Sandbox Code Playgroud)

不起作用.

java ubuntu java-11

48
推荐指数
7
解决办法
4万
查看次数

如何在Java 11中使用没有jre的jdk

我们计划将Java 8项目迁移到使用Java 11.但是我注意到Java 11没有JRE文件夹.

在Java 9和Java 10中,文件夹结构被更改,即,java\jdk1.x或者java\jre1.xxjava 9或10中.

但是在Java 11中,我只获得了一个文件夹,即java\jdk-11.如果没有jre,我的客户如何使用我的应用程序?

我所理解的是Java 11正在强制模块化我们的应用程序,并且需要使用jlink来创建我们自己的jre以在客户端中运行应用程序.

我的理解是否正确?

java migration java-8 java-11

45
推荐指数
3
解决办法
3万
查看次数

Java 11应用程序作为docker镜像

灵感来自问题为什么Java 11基础Docker镜像如此之大?(openjdk:11-jre-slim)我发现Java世界中的这个话题还没有解决.

至于07 Dec 2018存在共同的问题/陷阱(在上面的票证中讨论):

由于这些问题,即使是简洁的 Oracle Java 11基础映像也非常繁重,并且被认为是不稳定的:https://hub.docker.com/_/openjdk/

所以问题是:

什么是构建和提供Java 11应用程序作为docker镜像的优化推荐方法

java docker alpine-linux java-11

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

缺少Javadocs JDK 11的iFrame视图

我一直在使用JavaDocs for JDK 11

但我注意到iFrames视图似乎不再可用.我环顾四周,但看不出有关为什么要这样做的任何细节,以及有什么替代方案?谁能提供更多细节?

查看JDK 10 JDK 10的JavaDocs

查看JDK 11 JDK 11的JavaDocs

java javadoc java-11 java-12

40
推荐指数
2
解决办法
2294
查看次数