JDK11中java classname命令失效,java filename.java可执行原因咨询
问题原因解析
这是Java 11引入的单文件程序直接运行特性导致的差异,具体拆解如下:
java HelloWorld.java的运行逻辑:Java 11及以后版本允许直接传入.java源文件执行,JVM会在内存中临时编译这个源文件,生成的字节码不会写入本地磁盘(所以你看不到HelloWorld.class文件),运行完成后临时字节码就被销毁。整个过程不需要提前用javac编译,也不会留下本地class文件。java HelloWorld报错的原因:这个命令要求当前环境能找到HelloWorld.class文件(默认在当前工作目录或类路径指定的位置)。但你通过java HelloWorld.java运行时并没有生成本地class文件,即便之前用javac编译过,也可能因为文件被删除、当前目录切换等原因导致JVM找不到对应的class文件,从而抛出ClassNotFoundException。
补充验证点:如果手动执行javac HelloWorld.java生成HelloWorld.class后,再运行java HelloWorld就能正常执行,这也能反过来验证上述逻辑。
内容的提问来源于stack exchange,提问作者Jishnu Prathap
相关产品推荐
相关产品推荐

