我有一段 Java 代码,其中 -
public boolean method1(Double d1, Double d2) {
if (d1.equals(d2)) {
//Some logic
return bool;
}
Run Code Online (Sandbox Code Playgroud)
语句 d1.equals(d2) 存在声纳违规,即“不应使用浮点值进行相等性测试”。链接: https: //rules.sonarsource.com/java/RSPEC-1244
在解释中,它讨论了使用 == 或 === 的重要性,但由于我使用的是 equals 方法,为什么它仍然显示为声纳违规?
下面的程序:
public class ProcessExample {
public static void main(String[] args) throws IOException {
Process process1 = new ProcessBuilder("/bin/ls", "-l").directory(Path.of("/home/yapkm01").toFile()).start();
System.out.println("ls command:");
try (var in = new Scanner(process1.getInputStream())) {
while (in.hasNextLine()) {
System.out.println(in.nextLine());
}
}
Process process2 = new ProcessBuilder("/bin/java", "-version").start();
System.out.println("java command:");
try (var in = new Scanner(process2.getInputStream())) {
while (in.hasNextLine()) {
System.out.println(in.nextLine());
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
ls command:
total 424
drwxr-xr-x 2 yapkm01 yapkm01 4096 Dec 27 2021 Desktop
drwxr-xr-x 2 yapkm01 yapkm01 4096 Apr 30 01:09 Documents …Run Code Online (Sandbox Code Playgroud) Java 11 引入了 lambda 参数的局部变量类型推断。例如:
Stream.of("a", "b", "c").map((var a) -> "ok")
Run Code Online (Sandbox Code Playgroud)
我的问题是:如果我可以跳过它,为什么要使用它。例如:
Stream.of("a", "b", "c").map(a -> "ok")
Run Code Online (Sandbox Code Playgroud)
?
在 Java 11 中运行此代码时,我期待 ClassCastExpection,但它执行时没有问题,这种情况有解释吗?
List<?> list = List.of(new HashMap<>());
List<String> listOfStrings = (List<String>) list;
System.out.println("List size: " + listOfStrings.size());
Run Code Online (Sandbox Code Playgroud) 所以我目前正在Oracle JDK 8中构建我的所有应用程序.Oracle授权策略更新是否会影响JDK 8的使用,或者仅用于JDK 11 LTS.假设如果我想在不久的将来迁移到JDK 11,我可以在GPL下选择OpenJDK进行生产吗?在GCL下BCL和OpenJDK下的Oracle JDK源代码是否有任何变化?我可以互换使用吗?
考虑以下代码:
public class StreamDemo {
public static void main(String[] args) {
StreamObject obj = new StreamObject();
obj.setName("mystream");
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
list.parallelStream().forEach(l -> {
obj.setId(l);
System.out.println(obj + Thread.currentThread().getName());
});
}
static public class StreamObject {
private String name;
private Integer id;
// getters, setters, toString()
}
}
Run Code Online (Sandbox Code Playgroud)
当使用 java 11 编译并运行时,它返回以下内容:
StreamObject{name='mystream', id=4}ForkJoinPool.commonPool-worker-23
StreamObject{name='mystream', id=4}main
StreamObject{name='mystream', id=4}ForkJoinPool.commonPool-worker-9
StreamObject{name='mystream', id=4}ForkJoinPool.commonPool-worker-5
StreamObject{name='mystream', id=4}ForkJoinPool.commonPool-worker-19
Run Code Online (Sandbox Code Playgroud)
但对于 java 1.8,它返回不同的结果:
StreamObject{name='mystream', id=3}main
StreamObject{name='mystream', id=5}ForkJoinPool.commonPool-worker-2
StreamObject{name='mystream', id=2}ForkJoinPool.commonPool-worker-9
StreamObject{name='mystream', id=1}ForkJoinPool.commonPool-worker-11
StreamObject{name='mystream', id=4}ForkJoinPool.commonPool-worker-4
Run Code Online (Sandbox Code Playgroud)
为什么结果不同?
我OrderDTO在列表中有很多对象。
包含 2 个项目的示例:
final List<OrderDTO> orderList = new ArrayList<OrderDTO>();
final List<OrderDTO> orderList = new ArrayList<OrderDTO>();
final OrderDTO order1 = new OrderDTO("1", "100");
final OrderDTO order2 = new OrderDTO("2", "200");
orderList.add(order1);
orderList.add(order2);
Run Code Online (Sandbox Code Playgroud)
OrderDTO有字段,例如orderId和stateId。
我想在日志中显示:
"1", "2"
Run Code Online (Sandbox Code Playgroud)
或者
"100", "200"
Run Code Online (Sandbox Code Playgroud)
在 Java 11 中,迭代列表并显示每个对象的一个字段的值的最有效方法是什么?
我想总结一个Number对象列表,每个只使用实际值(如果它是Integer我想只使用.intValue()方法而不是.doubleValueex ..)而且我不想使用instanceof.
返回值必须是Number类型.
如何使用双重调度或策略模式或类似的东西来做到这一点?
我不能扩展每个实现类,Number我不能总结两个Number变量.
只有6 .xValue()种方法Number,我想相应地使用它们.
我有三个非常简单的应用程序。一个是 COMMON,我将集中安全配置,另一个具有 ZUUL 功能,第三个是 EUREKA SERVER。两者都是 Spring Boot 和 Java 11。虽然我使用的是 Java 11,但我并不依赖模块化(据我所知,在 Spring Boot 中使用模块化特性是没有意义的)。
当我在 Eclipse 中运行所有三个时,我可以成功地按顺序运行服务器,common 和 zuul。当我尝试 maven build 时,出现了主题中提到的错误。
直接的解释是“你在 zuul 类路径中没有共同点”。好吧,据我所知,我在 zuul 类路径中确实有共同点。我想知道是否有任何额外的配置,因为我使用的是 Java 11 但没有使用模块化。
说我使用的是 Java 11 但不是模块化,我的意思是,我有 Java 11,但在三个项目中的任何一个中都没有 module-info.java。
检查 .m2 文件夹并解压缩 common.jar 我确实看到类抱怨。
Zuul 项目 pom:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>com.test</groupId>
<artifactId>zuul</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>zuul</name>
<description>Zuul project</description>
<properties>
<java.version>11</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>
<dependencies> …Run Code Online (Sandbox Code Playgroud) 我正在将项目移至Java11
我已经改变了sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl与java.lang.reflect.ParameterizedType(作为指定在这里),现在之交MalformedByteSequenceException:
警告:MalformedByteSequenceException是内部专有API,可以在以后的版本导入com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException中删除。
它被用于从XML文件创建对象的一小段代码中。更确切地说是try-catch。
try {
...
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(stream);
NodeList list = document.getChildNodes();
fillProcessStack(document);
...
list = list.item(0).getChildNodes();
createItems(list, parent);
} catch (MalformedByteSequenceException e) {
//"Any char in your xml file has a wrong format: " + e.getLocalizedMessage()
} catch (SAXParseException sax) {
...
} catch (Exception e) {
...
}
Run Code Online (Sandbox Code Playgroud)
无论如何,我在网上找不到任何关于此的信息。
我能想到的最接近的是UnsupportedEncodingException,但我不确定。
另外,这可能是从网络复制的一些旧代码的遗留物,并且显然,如果我删除它,则对于编译器来说一切看起来仍然很好。
那么,关于Java11是否有任何一般/好的建议?
编辑:对于寻求关闭此问题的人,因为
寻求调试帮助的问题(“此代码为什么不起作用?”)必须包括所需的行为,特定的问题或错误以及在问题本身中再现该错误所需的最短代码。没有明确问题陈述的问题对其他读者没有用。请参阅:如何创建最小的,可复制的示例。
我会尝试更清楚地解释。 …
我在一家有许多Java 8项目的公司中工作。这些项目的价值已很高,我们的团队想升级版本。但是,我们需要有效的积分才能解开局势。
这些项目正在使用Spring和Hibernate(如果有用)。
如果有任何事实要点,我们可以给我们公司提供哪些事实要点来升级版本?
有用的有效点的例子有:
可能备份了文档或有用资源的链接。
我有一个代码库(显然)可以在下运行,Java 9但不能在下编译Java 11。它使用jdk.incubator.httpclientAPI并根据此答案更改模块信息在大多数情况下都有效,但不仅仅是软件包已更改。
我仍然无法解决的代码如下:
private static JSONObject sendRequest(JSONObject json) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest httpRequest = HttpRequest.newBuilder(new URI(BASE_URL))
.header("Accept", "application/json")
.header("Content-Type", "application/json")
.timeout(TIMEOUT_DURATION)
.POST(HttpRequest.BodyProcessor.fromString(json.toString()))
.build();
HttpResponse<String> httpResponse = client.send(httpRequest, HttpResponse.BodyHandler.asString());
String jsonResponse = httpResponse.body();
return new JSONObject(jsonResponse);
}
Run Code Online (Sandbox Code Playgroud)
编译错误为:
Error:(205, 94) java: cannot find symbol
symbol: method asString()
location: interface java.net.http.HttpResponse.BodyHandler
Error:(202, 34) java: cannot find symbol
symbol: variable BodyProcessor
location: class java.net.http.HttpRequest
Run Code Online (Sandbox Code Playgroud)
如何将代码转换为等效Java 11版本?
我正在尝试将 Oracle JDK 11 应用程序迁移到 JDK 17.0.7,当我尝试访问 java.utils.Set 中的 add() 时,它抛出
java.lang.UnsupportedOperationException
Run Code Online (Sandbox Code Playgroud)
我查了一下Stackoverflow,发现java.util.Set的实现还没有完全支持add()函数,它被标记为可选。
我的问题是,哪个 java 供应商的 Java 17 已经支持或实现了 java Set add() 方法?
我的应用程序中有相当多的 Java 对象需要这个函数。
如果有人有想法,请指教。