Java程序导出JAR后双击运行立即闪退的解决方法
问题根因
你的程序本身没有代码错误,导出JAR的流程也没有问题,双击闪退是两个机制共同导致的:
- Windows/macOS系统默认调用
javaw.exe(无控制台模式)启动JAR文件,不会弹出命令行窗口承接你用System.out.println()打印的所有内容,你根本看不到程序输出 - 你的程序是一次性执行逻辑,main方法里的所有代码跑完只需要几毫秒,执行完成后JVM会直接退出,没有任何等待逻辑,就算有控制台窗口,也会在你看清内容前直接关闭。
你在Eclipse里能正常看到结果,是因为Eclipse自带内置控制台面板,会固定保留程序输出,不会随着程序退出立刻关闭。
修复方案
根据你的使用场景选对应的方案即可:
方案1:零代码修改,直接验证JAR运行状态
不需要改任何代码,也不用改系统配置,通过命令行启动JAR就能看到完整输出:
- Windows系统按
Win+R输入cmd打开命令提示符,Mac/Linux打开终端 - 用
cd 你的JAR存放文件夹路径命令切到JAR所在目录 - 执行启动命令:
java -jar 你导出的JAR文件名.jar - 执行后终端会直接打印所有随机数结果,终端窗口不会随程序退出自动关闭。
方案2:保留控制台交互,双击JAR直接运行
- 先修改系统JAR默认启动程序:
- 右键点击JAR文件,选择「打开方式」→「选择其他应用」
- 下拉选择「更多应用」→「在这台电脑上查找其他应用」
- 定位到你本地JDK安装目录下的
bin文件夹,选中其中的java.exe(注意不要选javaw.exe,这个程序无控制台输出),确认设置为默认打开方式
- 在代码的main方法末尾添加等待输入的逻辑,避免程序执行完立刻关闭窗口:
// 放在最后一行打印语句之后即可 System.out.println("按回车键退出程序..."); new java.util.Scanner(System.in).nextLine(); - 重新导出为可执行JAR(导出时确认Launch configuration选中的是
probatu类对应的启动配置),之后双击JAR就会弹出控制台窗口显示所有内容,按回车键后程序才会退出。
方案3:弹窗展示结果,无需依赖控制台
如果不想修改系统默认配置,可以直接把控制台输出改成Swing弹窗展示,不管用什么方式启动JAR都能看到结果:
把你原来所有分散的打印逻辑替换成结果拼接,最后调用弹窗组件展示即可,示例代码:
public static void main (String[] args){ Random drag = new Random(); int max = 50; int min = 1; int broj2 = ((49 + 1) -1) + 1; int broj3 = 50; int broj4 = 50; int broj5 = 50; int broj7 = 50; int int_random = drag.nextInt((max+1) - min) + min; int int_random1 = drag.nextInt((max+1) - min) + min; int int_random2 = drag.nextInt(broj2); int int_random3 = drag.nextInt(broj3); int int_random4 = drag.nextInt(broj4); int int_random5 = drag.nextInt(broj5); int int_random6 = drag.nextInt(broj7); // 拼接所有结果 String output = "Ok Dragisa!, Evo ti su Random brojovi! \r\n\r\n" + "Evo ti prvi broj : : " + int_random + "\r\n" + "Evo ti drugi broj : : " + int_random1 + "\r\n" + "Evo ti treci broj : " + int_random2 + "\r\n" + "Evo ti cetvrti broj : " + int_random3 + "\r\n" + "Evo ti peti broj : " + int_random4 + "\r\n" + "Evo ti sesti broj : " + int_random5 + "\r\n" + "Evo ti sedmi broj : " + int_random6 + "\r\n\r\n" + "Hajde sada vise pobjedi!!! :) "; // 弹窗展示结果,点击确定后程序退出 javax.swing.JOptionPane.showMessageDialog(null, output); }
改完重新导出JAR,双击就会直接弹出消息窗口显示所有随机数,点击「确定」后程序才会关闭。
补充:你原代码里创建7个Random实例没有必要,单个Random实例就可以生成所有随机数,不会影响随机性,不过这个问题不会导致程序闪退,属于代码优化点。
内容的提问来源于stack exchange,提问作者Essentialz
相关产品推荐
相关产品推荐

