在可执行的jar包中,"System.out.println()"会发生什么?

15

假设我已从使用了以下代码的项目中创建了一个可执行JAR

System.out.println()
当我们运行可执行的jar文件时,没有控制台。那么这行代码会发生什么?java如何处理这种情况?(注意:本人并未使用控制台运行jar文件或以任何方式关联任何控制台。)我知道由于没有控制台,不会在任何地方打印内容。但是我想知道java如何在这种情况下处理这一行代码?这一行代码是否在生成可执行jar文件的字节码时被省略了?还是当没有控制台时忽略这行代码?或者其他情况...

当我们运行可执行的jar文件时,没有控制台 - 这取决于您如何运行它。如果您从控制台运行java -jar foo.jar,那么就会有... - Jon Skeet
我是指运行而不是使用控制台... - Minar Mahmud
那么,让你的问题更清晰明了是值得的。你已经陈述了没有控制台,但这只有在某些情况下才是真的。 - Jon Skeet
1
如果您不使用控制台运行程序,则看不到System.out.print的内容。将其视为主要用于测试/调试的东西。当您转向生产程序时,不应使用它。 - Evan Bechtol
如果你真的想使用System.out.print(),那么你可以从控制台重定向到一个文件:https://dev59.com/j3E85IYBdhLWcg3wShef - Alan Hay
3个回答

11

在可执行的JAR文件中运行代码并没有什么特别的。如果您从控制台运行它,例如使用java -jar foo.jar,输出将仍然显示在控制台上。

如果您以某种不附加控制台的方式运行代码,比如在Windows上默认关联可执行JAR文件的程序javaw,那么输出就不会被重定向到任何地方。它不会导致任何错误-文本只是丢失了。

请注意,在这种情况下,如果您使用System.console(),它将返回null。因此:

System.out.printf("Foo%n"); // No problem. Goes nowhere.
System.console().printf("Foo%n"); // Would throw a NullPointerException.

那么我可以假设这个 println() 方法是这样编写的,即如果没有控制台,则调用将被忽略? - Minar Mahmud
2
@minarmahmud:嗯,并不是被忽略 - 我猜如果你使用printf并且有一些无效的格式字符串,那么它会失败。但输出不会流向任何地方。 - Jon Skeet

2
只要您不从控制台窗口(java -jar executable.jar)运行应用程序,输出就会被省略。此外,您可以配置Java安装,使控制台窗口在启动Java应用程序时立即启动。然后,输出将写入JVM的控制台窗口。您可以在官方Java网站上找到一篇文章《如何启用和查看Java控制台?》

Activate Java console


1
如果您从控制台打开它(java -jar YourJar.jar),文本将在控制台窗口中打印出来。 如果您在资源管理器(或类似工具)中打开它,则看不到文本。
为了澄清您的第二个编辑: 字节码没有被省略,因为编译器无法知道jar将在什么上下文中执行。在控制台中始终可以调用jar,在这种情况下println必须保留。
实际上,许多jar文件否则将完全无用。有很多Java程序通过控制台进行交互输入和输出与用户交互。 对于Java程序来说,拥有GUI或者完全运行在后台是必要的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接