应用程序构造中的异常-Java

应用程序构造中的异常-Java,java,exception,javafx,event-handling,Java,Exception,Javafx,Event Handling,在尝试用事件驱动编程制作一些简单的按钮时,我正在看教科书(Java编程入门第10版edi)中的一个例子。我按照书中的一些代码,尝试将其复制到我正在进行的一个项目中。程序可以编译,但当它运行时,我得到: Exception in Application constructor Exception in thread "main" java.lang.RuntimeException: Unable to construct Application instance: class B

在尝试用事件驱动编程制作一些简单的按钮时,我正在看教科书(Java编程入门第10版edi)中的一个例子。我按照书中的一些代码,尝试将其复制到我正在进行的一个项目中。程序可以编译,但当它运行时,我得到:

    Exception in Application constructor
    Exception in thread "main" java.lang.RuntimeException: Unable to construct Application instance: class ButtonPackage.ButtonEvent
        at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:907)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$156(LauncherImpl.java:182)
        at java.lang.Thread.run(Thread.java:745)
    Caused by: java.lang.NoSuchMethodException: ButtonPackage.ButtonEvent.<init>()
        at java.lang.Class.getConstructor0(Class.java:3082)
        at java.lang.Class.getConstructor(Class.java:1825)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:818)
        at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$176(PlatformImpl.java:326)
        at com.sun.javafx.application.PlatformImpl.lambda$null$174(PlatformImpl.java:295)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.javafx.application.PlatformImpl.lambda$runLater$175(PlatformImpl.java:294)
        at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
        at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
        at com.sun.glass.ui.win.WinApplication.lambda$null$149(WinApplication.java:191)
        ... 1 more
应用程序构造函数中的异常 线程“main”java.lang.RuntimeException中出现异常:无法构造应用程序实例:类ButtonPackage.ButtonEvent 位于com.sun.javafx.application.LaunchImpl.launchApplication1(LaunchImpl.java:907) 在com.sun.javafx.application.launchempl.lambda$launchApplication$156(launchempl.java:182) 运行(Thread.java:745) 原因:java.lang.NoSuchMethodException:ButtonPackage.ButtonEvent。() 位于java.lang.Class.getConstructor0(Class.java:3082) 位于java.lang.Class.getConstructor(Class.java:1825) 在com.sun.javafx.application.launchempl.lambda$launchApplication1$162(launchempl.java:818) 位于com.sun.javafx.application.PlatformImpl.lambda$runAndWait$176(PlatformImpl.java:326) 位于com.sun.javafx.application.PlatformImpl.lambda$null$174(PlatformImpl.java:295) 位于java.security.AccessController.doPrivileged(本机方法) 位于com.sun.javafx.application.PlatformImpl.lambda$runLater$175(PlatformImpl.java:294) 位于com.sun.glass.ui.invokelateDispatcher$Future.run(invokelateDispatcher.java:95) 在com.sun.glass.ui.win.WinApplication.\u runLoop(本机方法) 位于com.sun.glass.ui.win.WinApplication.lambda$null$149(WinApplication.java:191) ... 还有一个 在从答案中得到建议后,我能够让它工作。以下是更正后的压缩代码:

    package ButtonPackage;
    import javafx.application.Application;
    import javafx.geometry.Pos;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.layout.HBox;
    import javafx.stage.Stage;
    import javafx.event.ActionEvent;
    import javafx.event.EventHandler;

    /**
     * Created by Brandon on 12/5/2015.
     */
    public class ButtonEvent extends Application {

        public static void main(String[] args) {
            Application.launch(args);
        }

        @Override //Override start method Application Class
        public void start(Stage primaryStage) {
            //create pane set properties
            HBox pane = new HBox(10);
            pane.setAlignment(Pos.CENTER);
            Button btEnter = new Button("ENTER NUMBER");
            Button btCheck = new Button("CHECK IF WINNER");
            EnterNumber handler1 = new EnterNumber();
            btEnter.setOnAction(handler1);
            CheckWinner handler2 = new CheckWinner();
            btCheck.setOnAction(handler2);
            pane.getChildren().addAll(btEnter, btCheck);

            //Create scene place on stage
            Scene scene = new Scene(pane);
            primaryStage.setTitle("HandleEvent"); //Set Stage Title
            primaryStage.setScene(scene); //Place scene in stage
            primaryStage.show(); //Display stage
        }//end start
    }//end ButtonEvent

    class EnterNumber implements EventHandler<ActionEvent> {
        @Override
        public void handle(ActionEvent e) {
            System.out.println("ENTER NUMBER button clicked");
        }//end handle
    }//end EnterNumber

    class CheckWinner implements EventHandler<ActionEvent> {
        @Override
        public void handle(ActionEvent e) {
            System.out.println("CHECK IF WINNER button clicked");
            //eventLottery.main();
        }//end handle
    }//end CheckWinner
package按钮包装;
导入javafx.application.application;
导入javafx.geometry.Pos;
导入javafx.scene.scene;
导入javafx.scene.control.Button;
导入javafx.scene.layout.HBox;
导入javafx.stage.stage;
导入javafx.event.ActionEvent;
导入javafx.event.EventHandler;
/**
*布兰登于2015年5月12日创作。
*/
公共类ButtonEvent扩展应用程序{
公共静态void main(字符串[]args){
应用程序启动(args);
}
@Override//Override start方法应用程序类
公共无效开始(阶段primaryStage){
//创建窗格集属性
HBox窗格=新的HBox(10);
窗格设置对齐(位置中心);
按钮B输入=新按钮(“输入编号”);
按钮btCheck=新按钮(“检查是否获胜”);
EnterNumber handler1=新的EnterNumber();
b输入设置动作(handler1);
CheckWinner handler2=新的CheckWinner();
b检查设置动作(手柄2);
pane.getChildren().addAll(btEnter,btCheck);
//在舞台上创造场景
场景=新场景(窗格);
primaryStage.setTitle(“HandleEvent”);//设置阶段标题
primaryStage.setScene(场景);//将场景放置在舞台中
primaryStage.show();//显示阶段
}//结束-开始
}//末端钮扣
类EnterNumber实现EventHandler{
@凌驾
公共无效句柄(ActionEvent e){
System.out.println(“点击输入数字按钮”);
}//端柄
}//结束编号
类CheckWinner实现EventHandler{
@凌驾
公共无效句柄(ActionEvent e){
System.out.println(“检查是否单击了赢家按钮”);
//eventlotking.main();
}//端柄
}//最终胜利者

谢谢你的帮助

您没有定义
公共静态main(String[]args)
方法。您需要定义此方法,并告诉java此方法在哪个类中。

看起来您正在IntelliJ中运行此方法。虽然允许
应用程序
子类没有
main(…)
方法,但并非所有IDE都支持这种执行模式

注意,在任何执行模式下,您的主类必须是
public

如果要从IDE内部运行,请添加一个main方法,该方法只需调用:


(或者直接从命令行运行它)。

如果您使用标准的Oracle JRE运行,Java 8中的
应用程序
子类不需要
main
方法。然而,并不是所有的IDE都知道或支持这种执行模式。我将main放在ButtonEvent类的后面,并在类的末尾尝试了它,但它仍然抛出应用程序异常(错误消息更长,但似乎是一样的),Eclipse能够处理它吗?还是我应该只使用命令行?我真的很喜欢Intellij xD“错误消息更长”。。。那就不一样了?请添加新的错误消息。更新了主帖子以添加错误消息和我的代码更改。您还需要将主类
设置为public
。请参阅更新。当然,请注意,这意味着它必须在名为
ButtonEvent.java
的文件中定义。谢谢!更新主帖子以显示正确的代码。你救了我!
public class ButtonEvent extends Application {

    // existing code ...

    public static void main(String[] args) {
        launch(args);
    }
}