JavaFX掷硬币应用启动报错:Exception in Application start method(非FXMLLoader)
JavaFX掷硬币应用报错修复
问题说明
刚接触JavaFX,开发一款掷硬币应用,根据掷出结果展示对应硬币图片。此前用类似逻辑做过骰子模拟器,本次遇到未出现过的报错。
现有代码
CoinToss类
package application; import javafx.application.Application; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.layout.VBox; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.geometry.Pos; import javafx.geometry.Insets; public class CoinToss extends Application { Image heads = new Image("D:\\Downloads - DATA\\heads1.png"); Image tails = new Image("D:\\Downloads - DATA\\tails1.png"); ImageView viewCoin; Label resultCoin; public static void main(String[] args) { launch(args); } public void start(Stage primaryStage) { Label label1 = new Label("Welcome to the Coin Flipper!"); Label label2 = new Label("Please hit start to flip the coin!"); resultCoin = new Label(); Button startButton = new Button("Start!"); startButton.setOnAction(new StartButtonHandler()); VBox vbox = new VBox(10, label1,label2, startButton, viewCoin, resultCoin); vbox.setPadding(new Insets(12)); vbox.setAlignment(Pos.TOP_CENTER); Scene simulatorScene = new Scene(vbox,400,400); primaryStage.setScene(simulatorScene); primaryStage.show(); } class StartButtonHandler implements EventHandler<ActionEvent>{ public void handle(ActionEvent event) { int num = 0; String word = ""; CoinValue value = new CoinValue(); value.roll1(); num = value.getRoll1(); if(num == 0) { viewCoin = new ImageView(heads); word = "heads"; } else { viewCoin = new ImageView(tails); word = "tails"; } resultCoin.setText("You rolled a " + word); } } }
CoinValue类
package application; import java.util.Random; public class CoinValue { int rollnum; public void roll1() { Random rand = new Random(); rollnum = rand.nextInt(1) + 1; } public int getRoll1() { return rollnum; } }
报错信息
Exception in Application start method java.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:119) at java.base/java.lang.reflect.Method.invoke(Method.java:577) at javafx.graphics@18.0.2/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:465) at javafx.graphics@18.0.2/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:364) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) at java.base/java.lang.reflect.Method.invoke(Method.java:577) at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1081) Caused by: java.lang.RuntimeException: Exception in Application start method at javafx.graphics@18.0.2/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:901) at javafx.graphics@18.0.2/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:196) at java.base/java.lang.Thread.run(Thread.java:833) Caused by: java.lang.NullPointerException: Children: child node is null: parent = VBox@4ac2de6c at javafx.graphics@18.0.2/javafx.scene.Parent$3.onProposedChange(Parent.java:542) at javafx.base@18.0.2/com.sun.javafx.collections.VetoableListDecorator.addAll(VetoableListDecorator.java:233) at javafx.base@18.0.2/com.sun.javafx.collections.VetoableListDecorator.addAll(VetoableListDecorator.java:103) at javafx.graphics@18.0.2/javafx.scene.layout.VBox.<init>(VBox.java:252) at HelloFX/application.CoinToss.start(CoinToss.java:34) at javafx.graphics@18.0.2/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:847) at javafx.graphics@18.0.2/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:484) at javafx.graphics@18.0.2/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:457) at java.base/java.security.AccessController.doPrivileged(AccessController.java:399) at javafx.graphics@18.0.2/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:456) at javafx.graphics@18.0.2/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96) at javafx.graphics@18.0.2/com.sun.glass.ui.win.WinApplication._runLoop(Native Method) at javafx.graphics@18.0.2/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:184) ... 1 more Exception running application application.CoinToss
问题分析与修复
1. 空指针异常修复
报错核心是NullPointerException: Children: child node is null,因为viewCoin仅声明未初始化就被添加到VBox中,JavaFX容器不允许添加null节点。
修复步骤:
- 在
start方法中先初始化viewCoin,可设置为空实例或默认图片; - 点击按钮时仅更新ImageView的
image属性,而非重新创建ImageView对象。
修改后的start方法片段:
public void start(Stage primaryStage) { Label label1 = new Label("Welcome to the Coin Flipper!"); Label label2 = new Label("Please hit start to flip the coin!"); resultCoin = new Label(); // 初始化viewCoin空实例,可设置固定尺寸避免图片过大 viewCoin = new ImageView(); viewCoin.setFitWidth(150); viewCoin.setFitHeight(150); Button startButton = new Button("Start!"); startButton.setOnAction(new StartButtonHandler()); VBox vbox = new VBox(10, label1,label2, startButton, viewCoin, resultCoin); vbox.setPadding(new Insets(12)); vbox.setAlignment(Pos.TOP_CENTER); Scene simulatorScene = new Scene(vbox,400,400); primaryStage.setScene(simulatorScene); primaryStage.show(); }
修改按钮点击事件逻辑:
class StartButtonHandler implements EventHandler<ActionEvent>{ public void handle(ActionEvent event) { int num = 0; String word = ""; CoinValue value = new CoinValue(); value.roll1(); num = value.getRoll1(); if(num == 0) { viewCoin.setImage(heads); word = "heads"; } else { viewCoin.setImage(tails); word = "tails"; } resultCoin.setText("You rolled a " + word); } }
2. 随机数生成逻辑修复
CoinValue类中rand.nextInt(1)只会生成0,加1后永远得到1,导致掷硬币结果永远是tails。需改为rand.nextInt(2),生成0或1对应正反面。
修改后的CoinValue类:
package application; import java.util.Random; public class CoinValue { int rollnum; public void roll1() { Random rand = new Random(); // nextInt(2)生成0或1,无需额外加1 rollnum = rand.nextInt(2); } public int getRoll1() { return rollnum; } }
最终效果
修改后应用启动无报错,点击Start按钮会随机切换硬币图片,并显示对应结果文本。
内容的提问来源于stack exchange,提问作者Vinni_K
相关产品推荐
相关产品推荐

