标签: java-17

从 CompletableFuture 抛出异常会导致 Java 17 中的 get() 和 join() 挂起

当我从 Java 11 切换到 Java 17(从 Ubuntu 20.04 存储库安装 OpenJDK)后,以下代码不起作用:

import java.util.Objects;
import java.util.concurrent.CompletableFuture;

import org.apache.commons.lang.builder.ReflectionToStringBuilder;
import org.apache.commons.lang3.exception.ExceptionUtils;

public class TestClass {

    public static void main(String[] args) {
        CompletableFuture<String> streamFuture = CompletableFuture.supplyAsync(() -> {
            throw MyException.wrapIfNeeded(new Exception("MyException"));
        });
        String result = null;
        try {
            result = streamFuture.get();
        } catch (Exception e) {
            System.out.println("Exception: " + ExceptionUtils.getMessage(e));
        }
        System.out.println("Result: " + Objects.toString(result));
    }

    static class MyException extends RuntimeException {

        private static final long serialVersionUID = 3349188601484197015L;

        public MyException(Throwable cause) {
            super(cause …
Run Code Online (Sandbox Code Playgroud)

java asynchronous freeze completable-future java-17

6
推荐指数
2
解决办法
1618
查看次数

Java 17 中的密封类以及开闭原则

简而言之,在 Java 的 LTS 版本 (Java 17) 中,我们第一次有了关键字sealed,它使我们能够限制层次结构:

public abstract sealed class Person
    permits Employee, Manager {
 
    //...
}
Run Code Online (Sandbox Code Playgroud)

如果我想创建一个扩展基类的新子类Person,我也必须修改基类。这是否违反开闭原则?

open-closed-principle sealed-class java-17

6
推荐指数
1
解决办法
1333
查看次数

从货币格式中删除国家/地区代码的惯用方法?

Java 11 和 17 之间的货币格式更改为:

\n
NumberFormat.getCurrencyInstance(Locale.CANADA_FRENCH).format(100.00)\n
Run Code Online (Sandbox Code Playgroud)\n

将打印100,00\xc2\xa0$\xc2\xa0CA而不是100,00\xc2\xa0$.

\n

还有比这更好的方法来删除国家代码吗CA

\n
var currencyFormat = NumberFormat.getCurrencyInstance(Locale.CANADA_FRENCH);\nif (currencyFormat instanceof DecimalFormat decimalFormat) {\n    var symbols = DecimalFormatSymbols.getInstance(Locale.CANADA_FRENCH);\n    symbols.setCurrencySymbol("$");\n    decimalFormat.setDecimalFormatSymbols(symbols);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

只是为了恢复直到最近为止的默认行为似乎有点太多了。

\n

java currency internationalization cldr java-17

6
推荐指数
1
解决办法
891
查看次数

尝试创建 EXE 文件时出现“无法为 javascript 创建 javax 脚本引擎”错误

我在尝试使用 Netbeans 13 生成 .exe 文件时遇到了这个问题。(打包为 -> exe 安装程序)

完整错误:

C:\Users\*\Documents\NetBeansProjects\*\nbproject\build-native.xml:428: The following error occurred while executing this line:
C:\Users\*\Documents\NetBeansProjects\*\nbproject\build-native.xml:436: Unable to create javax script engine for javascript
BUILD FAILED (total time: 4 seconds)
Run Code Online (Sandbox Code Playgroud)

有谁知道这里似乎有什么问题以及如何解决它?

更新:

操作系统:Windows 10

JavaFX:javafx-sdk-17.0.2

JDK:jdk-17.0.2

我在期待什么?

  • 我期待 .exe 文件

确实不需要发布代码,因为构建项目和运行项目本身都很顺利(没有错误)。尝试使用 Package As -> EXE Installer 生成 .exe 安装程序文件后出现问题(如图所示):所采取的行动

您可以返回查看完整错误,当我打开 build-native.xml 文件时,它会将我指向以下代码行:

  <target name="-jfx-copylibs" depends="init,compile,-pre-pre-jar,-pre-jar,-jfx-copylibs-warning" unless="fallback.no.javascript">
        <jfx-copylibs-js-impl/>
    </target>
    <target name="-jfx-copylibs-warning" if="fallback.no.javascript">
        <echo message="Warning: Dependent Libraries copy (-jfx-copylibs) skipped in fallback build mode due to JDK missing …
Run Code Online (Sandbox Code Playgroud)

java netbeans javafx java-17 netbeans-13

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

UnsatisfiedLinkError:系统库路径中没有 fontmanager:/usr/lib/jvm/java-17-openjdk/lib

在我们将容器迁移到 alpine_java-17 后,Excel 导出功能失败并出现以下错误:

java.lang.UnsatisfiedLinkError: no fontmanager in system library path: /usr/lib/jvm/java-17-openjdk/lib
Run Code Online (Sandbox Code Playgroud)

在我的 Dockerfile 中我安装了:

RUN apk add --no-cache fontconfig
RUN apk add --no-cache ttf-dejavu
RUN apk add --no-cache freetype
Run Code Online (Sandbox Code Playgroud)

这是 Dockerfile 的简短版本:

    FROM custom_registry/alpine_java-17


ENV JAVA_HOME=/usr/lib/jvm/java-17-openjdk


# procps to have the binary 'pgrep'
RUN apk update
RUN apk add curl
RUN apk add procps

#here's mu solution to fix the issue
RUN apk add --no-cache fontconfig
RUN apk add --no-cache ttf-dejavu
RUN apk add --no-cache freetype

# install bash …
Run Code Online (Sandbox Code Playgroud)

java docker alpine-linux java-17

6
推荐指数
1
解决办法
1894
查看次数

2022年如何调试JavaFX webview

如何调试 JavaFX Web 视图?我找到两种方法,

  1. 一种是将外部 chrome 调试器附加到 JavaFX webview。
  2. 另一种是注入firebug javascript。

Method#1 似乎使用了一些 hack,比如设置对私有字段的访问权限等。Method#2 依赖于 firebuglite,它现在似乎已经过时了。

2022年应该怎么做。还有其他方法,或者更好的方法吗?

我现在正在尝试 firebug lite 方法,并且已将 javascript 作为 Maven 项目的一部分,并尝试将其作为字符串而不是外部 URL 注入,因为 firebug 似乎现在没有正确地公开托管。

参考/sf/answers/1287783031/

这就是我现在所处的位置:

package xyz.jphil.internal_browser;

import com.sun.net.httpserver.HttpContext;
import com.sun.net.httpserver.HttpServer;
import java.net.InetSocketAddress;
import javafx.scene.web.WebEngine;
import netscape.javascript.JSObject;

/**
 *
 * @author Ivan
 */
public class WebkitDebugUtils {
    private static int resourcesPort = 0;

    public static void createHttpServerForLocalFiles() {
        int portStart = 64321, endPort = 65534;
        resourcesPort = portStart + (int) ((endPort * 1d …
Run Code Online (Sandbox Code Playgroud)

java javafx-webengine javafx-11 java-17

6
推荐指数
1
解决办法
1054
查看次数

Java Sealed 类/接口的许可关系是否具有传递性

如果我正确地阅读了 JLS \xc2\xa78.1.6\xc2\xa79.1.4,则密封类/接口允许的类只是直接子类/接口。

\n

为了说明这一点,请考虑以下示例:

\n
public sealed interface I1 permits I2, C, D { /*...*/ }\npublic final class C implements I1 { /*...*/ }\npublic final class D implements I1 { /*...*/ }\n\npublic sealed interface I2 extends I1 permits E, F { /*...*/ }\npublic final class E implements I2 { /*...*/ }\npublic final class F implements I2 { /*...*/ }\n
Run Code Online (Sandbox Code Playgroud)\n

如果我正确理解了规范,I1显然允许CandD但不允许Eand F(通过fromextends的层次结构)。它是否正确?I2 …

java sealed sealed-class java-17

6
推荐指数
1
解决办法
1166
查看次数

如何将 SSL 证书添加到 java 17 的 jvm 中

我需要将 SSL 证书文件添加到 JVM 信任存储区。我安装了 java oracle 8 和 java attendium 17。

通过此链接,我已成功添加 java 8 的证书,并且可以使用该证书进行通信。这是命令

keytool -importcert -alias startssl -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit -file ca.crt
Run Code Online (Sandbox Code Playgroud)

但现在我也需要将其添加到 java 17 中。使用相同的命令,我无法添加证书。我发现对于 java 17JAVA_HOME没有目录jre/lib/security,而是有conf/security目录。所以我将命令更改为这个

keytool -importcert -alias startssl -keystore $JAVA_HOME/conf/security/cacerts -storepass changeit -file ca.crt
Run Code Online (Sandbox Code Playgroud)

此命令在文件夹cacerts下生成文件security,但我仍然收到错误。在添加证书之前,我在 java 8 中遇到了同样的错误。我应该把这个cacertsjava 17 文件放在哪里?

Caused by: javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at …
Run Code Online (Sandbox Code Playgroud)

java ssl jvm ssl-certificate java-17

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

Java 17 密封类业务用例

Java 17 引入了密封类,它只允许特定的类扩展它们,否则将是最终的

我了解技术用例,但想不出任何现实生活中的用例会有用吗?

我们什么时候只希望特定的类能够扩展特定的类?

在我们自己的项目中,如果我们想要一个新的类来扩展密封类,我们不能将其添加到允许的类中吗?在这种情况下,为了避免轻微的开销,不将课程定为最终课程或密封课程不是更好吗?

另一方面,在公开库供外部使用时,密封类如何事先知道它应该允许扩展哪些类?

java java-17

6
推荐指数
1
解决办法
951
查看次数

Java 17 和 JEP 306 之后 Math 和 StrictMath 之间还有区别吗?

JEP 306在 Java 17 中实现,提供始终严格的浮点语义,弃用该strictfp标志。这是否意味着java.lang.Math可以指望其行为与 中的类似方法完全相同StrictMath(即,该java.lang.Math方法不能再被 JVM 替换为过去所允许的内在函数)?这是否也意味着无论使用哪个库,不同架构之间的浮点数学结果不应再有任何差异?

我很好奇我是否误解了新的 Java 17 功能,因为我们确实看到 Apple Silicon 与 Intel 之间今天的代码存在差异。

java floating-point strictfp java-17

6
推荐指数
1
解决办法
230
查看次数