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