标签: java-14

什么是 switch 表达式,它们与 switch 语句有什么不同?

作为 Java SE 12 的一部分,引入了switch表达式,并且从 Java SE 14 开始,它们已经标准化。它们与switch陈述有何不同?

java switch-statement switch-expression java-14

19
推荐指数
3
解决办法
1178
查看次数

定义记录的默认构造函数

我有一个记录,想向它添加默认构造函数。

public record Record(int recordId) {
   public Record {

   }
}
Run Code Online (Sandbox Code Playgroud)

但它用int参数创建了构造函数。

public final class Record extends java.lang.Record {
    private final int recordId;
    public Record(int);
    //other method
}
Run Code Online (Sandbox Code Playgroud)

我们如何向记录添加默认构造函数?

java java-14 java-record

18
推荐指数
2
解决办法
5615
查看次数

KeyCloak 服务器导致:java.lang.ClassNotFoundException:java.security.acl.Group

我正在运行 KeyCloak 服务器来验证想要访问 Spring Boot/Spring Web REST API 的用户。但是,尝试进行身份验证时发生错误。

以下工作:

  • 当我访问 http://localhost:8080/path/to/restapi
  • 我得到了预期的登录屏幕: -- KeyCloak 登录屏幕
  • 当我单击登录时,浏览器中的重定向发生以下错误:

白标错误页面 此应用程序没有明确的 /error 映射,因此您将其视为后备。

这是打印到 Spring Boot 控制台的错误:

Caused by: java.lang.ClassNotFoundException: java.security.acl.Group
  at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602) ~[na:na]
  at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~[na:na]
  at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522) ~[na:na]
  ... 33 common frames omitted
Run Code Online (Sandbox Code Playgroud)

KeyCloak 服务器显示该会话对于该应用程序的用户来说是活动的。但是,由于上述缺少的类,认证过程永远不会完成。

classnotfoundexception spring-boot keycloak java-11 java-14

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

Java 14 使用什么 JRE?

有一条消息

项目已由更新版本的 Java Runtime(类文件版本 57.0)编译,此版本的 Java Runtime 仅识别最高 52.0 的类文件版本

我在谷歌上搜索了“JDK 14 所需的 JRE”,但没有找到下载。在我的 Windows 10 上的 Java 控制面板中,它说我拥有最新版本的 Java 平台。我无法降级项目中的 JDK,因为我使用的是完全在 Java 14 上编译的库。如何(以及在​​哪里)升级 JRE 以匹配 Java 14 并支持版本 57?

java java-14

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

Java 14 记录和数组

鉴于以下代码:

public static void main(String[] args) {
    record Foo(int[] ints){}

    var ints = new int[]{1, 2};
    var foo = new Foo(ints);
    System.out.println(foo); // Foo[ints=[I@6433a2]
    System.out.println(new Foo(new int[]{1,2}).equals(new Foo(new int[]{1,2}))); // false
    System.out.println(new Foo(ints).equals(new Foo(ints))); //true
    System.out.println(foo.equals(foo)); // true
}
Run Code Online (Sandbox Code Playgroud)

显然,似乎使用了数组的toString,equals方法(而不是静态方法、Arrays::equalsArrays::deepEqualsArray::toString)。

所以我猜 Java 14 Records ( JEP 359 ) 不能很好地处理数组,必须使用 IDE 生成相应的方法(至少在 IntelliJ 中,默认情况下会生成“有用”的方法,即它们使用静态方法在Arrays)。

或者还有其他解决方案吗?

java arrays java-14 java-record

15
推荐指数
3
解决办法
1015
查看次数

使用新的 Record 类时无法反序列化

我想看看我是否可以用 Java 14 中的新 Record 类替换我现有的 Pojo。但无法这样做。得到以下错误:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法构造实例com.a.a.Post(无创建者,如默认构造,存在):无法从对象值反序列化(无基于委托或属性的创建者)

我知道错误是说记录没有构造函数,但是从我所看到的记录类在后台处理它,并且相关的 getter 也在后台设置(不完全是 getter,而是 id() title() 等等没有 get 前缀)。是不是因为 Spring 还没有采用最新的 Java 14 记录?请指教。谢谢。

我在 Spring Boot 版本 2.2.6 中执行此操作并使用 Java 14。

以下使用通常的 POJO 工作。

邮政类

public class PostClass {
    private int userId;
    private int id;
    private String title;
    private String body;

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) { …
Run Code Online (Sandbox Code Playgroud)

java spring spring-boot java-14 java-record

13
推荐指数
2
解决办法
2556
查看次数

java 14 nullpointerexception 没有详细信息

Java 14 有许多新特性。其中之一是在 NullPointerException 中显示详细消息。我安装了 Java 14 并尝试在类下编译和运行,但没有收到任何详细消息。我错过了什么吗?请帮忙。

~/code/demo/temp$ java -version
openjdk version "14" 2020-03-17
OpenJDK Runtime Environment AdoptOpenJDK (build 14+36)
Eclipse OpenJ9 VM AdoptOpenJDK (build openj9-0.19.0, JRE 14 Mac OS X amd64-64-Bit Compressed          References 20200313_47 (JIT enabled, AOT enabled)
OpenJ9   - 0133ba037
OMR      - 1c04e0ef9
JCL      - a73be60649 based on jdk-14+36)

~/code/demo/temp$ cat Hello.java
public class Hello {
  public static void main(String args[]) {
    String a = null;
    System.out.println(a.length());
  }
}

~/code/demo/temp$ javac Hello.java
~/code/demo/temp$ java -XX:+ShowCodeDetailsInExceptionMessages Hello
Exception …
Run Code Online (Sandbox Code Playgroud)

java openj9 java-14

11
推荐指数
2
解决办法
1327
查看次数

Java,自从在 Linux 上迁移到 Java 14 后,无法执行 spawn helper 错误

刚刚从Java 11迁移到Java 14

以下代码现在在 linux 机器上失败:

String linux_exe  = System.getProperty("user.dir") + '/' + "fpcalc_arm32";
List<String> params = new ArrayList();
params.add(linux_exe);
params.add("-plain");
params.add("-length");
params.add(submittedSongLength);
params.add(file.getPath());
Process p = Runtime.getRuntime().exec(params.toArray(new String[1]));                    
Run Code Online (Sandbox Code Playgroud)

带堆栈跟踪

Cannot run program "/mnt/system/config/Apps/SongKong/songkong/fpcalc_arm32": error=0, Failed to exec spawn helper: pid: 13998, exit value: 127
java.io.IOException: Cannot run program "/mnt/system/config/Apps/SongKong/songkong/fpcalc_arm32": error=0, Failed to exec spawn helper: pid: 13998, exit value: 127
at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1128)
at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1071)
at java.base/java.lang.Runtime.exec(Runtime.java:590)
at java.base/java.lang.Runtime.exec(Runtime.java:449)
at com.jthink.songkong.analyse.acoustid.AcoustId.generateFingerprint(AcoustId.java:217)
at com.jthink.songkong.analyse.acoustid.AcoustId.createAcoustIdFingerprint(AcoustId.java:106)
Run Code Online (Sandbox Code Playgroud)

Java 14 发生了什么变化会导致这种情况?

我使用 …

java java-11 java-14

11
推荐指数
1
解决办法
1410
查看次数

Java 记录和空对象模式?

有没有办法用 Java 记录做空对象?对于课程,我会这样做:

public class Id {

  public static final Id NULL_ID = new Id();

  private String id;

  public Id(String id) {
    this.id = Objects.requireNonNull(id);
  }

  private Id() {}
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为每个构造函数都需要经过规范的 ( Id(String id)构造函数,而我不能只是调用super()来绕过不变量。

public record Id(String id) {
  public static final Id NULL_ID = null; // how?

  public Id {
    Objects.requireNonNull(id);
    // ...
  }
}
Run Code Online (Sandbox Code Playgroud)

现在我解决了这个问题

public Id {
  if (NULL_OBJECT != null)
    Objects.requireNonNull(id);
}
Run Code Online (Sandbox Code Playgroud)

但这感觉不对,并且容易出现并发问题。

我还没有发现很多关于记录背后的设计思想的讨论,这可能已经讨论过了。如果像这样保持简单,那是可以理解的,但感觉很尴尬,我已经在小样本中多次遇到这个问题。

java null-object-pattern java-14 java-record

11
推荐指数
2
解决办法
711
查看次数

Java记录验证注解

我有带有有效注释的旧 POJO:

public class SomeData {

    @NotNull(message = "Data not be null")
    private String data;

    public FormData(String data) {
        this.data = data;
    }

    public String getData() {
        return data;
    }

   public String setData(String data) {
        this.data = data
    }
    
}
Run Code Online (Sandbox Code Playgroud)

但知道我有records

public record SomeData(String data) {}
Run Code Online (Sandbox Code Playgroud)

如何在记录中添加注释?

java record java-14

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