以下代码
public class Main {
public static void main(String[] args) throws IOException {
File tmp = File.createTempFile("deleteme", "dat");
tmp.deleteOnExit();
RandomAccessFile raf = new RandomAccessFile(tmp, "rw");
for (int t = 0; t < 10; t++) {
long start = System.nanoTime();
int count = 5000;
for (int i = 1; i < count; i++)
raf.setLength((i + t * count) * 4096);
long time = System.nanoTime() - start;
System.out.println("Average call time " + time / count / 1000 + " us.");
}
} …Run Code Online (Sandbox Code Playgroud) 使用Java 10,我们可以使用类型推断.
String s1 = "hello"; // before Java 10
var s2 = "hello"; // now
Run Code Online (Sandbox Code Playgroud)
但是,有一件事我们以前做不到:有类型为void的变量.
因此,在以前的版本中,我们根本无法定义变量类型void.但是现在我们可以将方法的结果分配给void变量:
void emptyMethod() { }
...
void v1 = emptyMethod(); // won't compile
var v2 = emptyMethod(); // no problem at all
Run Code Online (Sandbox Code Playgroud)
问题是 - 它为什么甚至编译,它的目的是什么?你有这个奇怪的用例吗?
类型变量void没有方法,甚至不能用作方法的参数.
我尝试使用JavaHome的命令行:
netbeans-trunk-nightly-201803230002-javase-windows.exe --javahome "C:\Program Files\Java\jdk-10"
Run Code Online (Sandbox Code Playgroud)
它应该工作,但我收到一条消息:
指定位置C:\ Program Files\Java\jdk-10中没有JRE
谢谢!
TLDR:在Java 9/10上,Tomcat中的Web应用程序无法访问JAXB,即使它的引用实现存在于类路径中.
编辑:不,这不是如何解决java.lang.NoClassDefFoundError:Java 9中的javax/xml/bind/JAXBException的副本- 正如您在"我尝试过的内容"部分所述,我已经尝试了所提出的解决方案.
我们有一个在Tomcat上运行的Web应用程序,它依赖于JAXB.在我们迁移到Java 9期间,我们选择将JAXB参考实现添加为常规依赖项.
从具有嵌入式Tomcat的IDE启动应用程序时,一切正常,但在真正的Tomcat实例上运行时,我收到此错误:
Caused by: java.lang.RuntimeException: javax.xml.bind.JAXBException:
Implementation of JAXB-API has not been found on module path or classpath.
- with linked exception:
[java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory]
at [... our-code ...]
Caused by: javax.xml.bind.JAXBException: Implementation of JAXB-API has not been found on module path or classpath.
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:278) ~[jaxb-api-2.3.0.jar:2.3.0]
at javax.xml.bind.ContextFinder.find(ContextFinder.java:421) ~[jaxb-api-2.3.0.jar:2.3.0]
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:721) ~[jaxb-api-2.3.0.jar:2.3.0]
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:662) ~[jaxb-api-2.3.0.jar:2.3.0]
at [... our-code ...]
Caused by: …Run Code Online (Sandbox Code Playgroud) 在最后一期Heinz Kabutz的时事通讯#255 Java 10:推断的局部变量中,显示它var不是Java 10中的保留字,因为您也可以使用它var作为标识符:
public class Java10 {
var var = 42; // <-- this works
}
Run Code Online (Sandbox Code Playgroud)
但是,您不能使用ie assert作为标识符var assert = 2,因为它assert是一个保留字.
正如在链接的时事通讯中所说的那样,var不是保留字的事实是好消息,因为这允许来自Java的先前版本的代码var用作标识符在Java 10中编译而没有问题.
那么,那是什么var?它既不是显式类型也不是语言的保留字,因此它被允许作为标识符,但是当它用于在Java 10中声明局部变量时它确实具有特殊含义.我们究竟在一个上下文中调用它局部变量声明?
此外,除了支持向后兼容性(通过允许包含var作为标识符的旧代码进行编译),还有其他优点是var 不是保留字吗?
基本上这是在试图回答另一个问题时出现的.假设这段代码:
AtomicInteger i = new AtomicInteger(0);
AtomicInteger count = new AtomicInteger(0);
IntStream.generate(() -> i.incrementAndGet())
.parallel()
.peek(x -> count.incrementAndGet())
.limit(5)
.forEach(System.out::println);
System.out.println("count = " + count);
Run Code Online (Sandbox Code Playgroud)
我理解这IntStream#generate是一个无序的无限流的事实,并且要完成它必须有一个短路操作(limit在这种情况下).我也明白,在Supplier达到该限制之前,Stream实现的次数可以自由调用.
在java-8下运行它会count一直打印512(可能并不总是,但在我的机器上是这样).
在对比运行中,这在java-10下很少超过5.所以我的问题是内部发生了什么变化,短路发生得更好(我试图通过拥有源并试图做一些差异来解决这个问题......)
我正在尝试编译我的maven项目,Java 10但我遇到了麻烦.在我的IDE(IntelliJ IDEA)中,所有内容都编译并运行得很好Java 10.我安装了最新maven版本3.5.4并指出JAVA_HOME了JDK 10:
$ mvn --version
Apache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-17T20:33:14+02:00)
Maven home: C:\Maven\bin\..
Java version: 10.0.2, vendor: Oracle Corporation, runtime: C:\Program Files\Java\jdk-10.0.2
Default locale: en_US, platform encoding: Cp1252
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
Run Code Online (Sandbox Code Playgroud)
maven我使用的命令是:
mvn package -Dmaven.test.skip
Run Code Online (Sandbox Code Playgroud)
在我,pom.xml我有以下Java 8工作正常:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<libraries.directory>libraries</libraries.directory>
</properties>
Run Code Online (Sandbox Code Playgroud)
因为Java 10我把它改成了以下内容:
<maven.compiler.source>10</maven.compiler.source>
<maven.compiler.target>10</maven.compiler.target> …Run Code Online (Sandbox Code Playgroud) 我发现了一个建议使用的答案
var list = new ArrayList();
Run Code Online (Sandbox Code Playgroud)
我很惊讶在这里找到一个原始类型,我只是想知道:确实var使用<>"自动?
(与此同时,答案改为使用<String>,但我仍然对这里的"原则"感到好奇)
我看到其他的问题,比如这个,但它们都使用了钻石操作:
var list = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)
现在我只想知道:是否会var改变我们应该(不)使用原始类型的方式?或者这个建议<>只是遗漏了不好的做法?
我正在读JEP 317.它说Graal(一个新的基于实验Java的JIT编译器)将成为JDK 10的一部分,但后来它说已经在JDK 9中可用了.那么,JEP 317的重点是什么呢?Java 9是否包含Graal?
我最近安装了jdk10.我正在做正常的代码,但它无法正常工作.
我在这里做错了吗?请参阅代码和异常堆栈跟踪.据我所知,这种行为应该没有理由.
import com.bean.College;
public class Student {
interface Club {
<T> T get(College<T> key);
}
private Club club;
Student() {
Object obj = club.get(new College<>() {});
}
}
Run Code Online (Sandbox Code Playgroud)
导入的College类是:
public class College<T> {
int id;
protected College() {
}
College(int id){
this.id=id;
}
}
Run Code Online (Sandbox Code Playgroud)
在编译时,javac编译器与以下堆栈跟踪崩溃:
java.lang.NullPointerException
at jdk.compiler/com.sun.tools.javac.comp.Flow$FlowAnalyzer.visitApply(Flow.java:1233)
at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1634)
at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
at jdk.compiler/com.sun.tools.javac.comp.Flow$BaseAnalyzer.scan(Flow.java:396)
at jdk.compiler/com.sun.tools.javac.comp.Flow$FlowAnalyzer.visitVarDef(Flow.java:987)
at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCVariableDecl.accept(JCTree.java:956)
at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
at jdk.compiler/com.sun.tools.javac.comp.Flow$BaseAnalyzer.scan(Flow.java:396)
at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:57)
at jdk.compiler/com.sun.tools.javac.comp.Flow$FlowAnalyzer.visitBlock(Flow.java:995)
at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:1020)
at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
at jdk.compiler/com.sun.tools.javac.comp.Flow$BaseAnalyzer.scan(Flow.java:396)
at jdk.compiler/com.sun.tools.javac.comp.Flow$FlowAnalyzer.visitMethodDef(Flow.java:962)
at …Run Code Online (Sandbox Code Playgroud)