JAVA:线程中的异常";JavaFX应用程序线程;java.lang.RuntimeException:java.lang.reflect.InvocationTargetException错误
您好,我是java语言新手。我一直在犯这个错误JAVA:线程中的异常";JavaFX应用程序线程;java.lang.RuntimeException:java.lang.reflect.InvocationTargetException错误,java,javafx,Java,Javafx,您好,我是java语言新手。我一直在犯这个错误 Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1774) at javafx.fxml.FXMLLoader$ControllerM
Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1774)
at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Node.fireEvent(Node.java:8411)
at javafx.scene.control.Button.fire(Button.java:185)
at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89)
at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Scene$MouseHandler.process(Scene.java:3757)
at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:394)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(GlassViewEventHandler.java:432)
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:410)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:431)
at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
at com.sun.glass.ui.View.notifyMouse(View.java:937)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$3(WinApplication.java:177)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1769)
... 48 more
Caused by: java.io.FileNotFoundException: Test.txt (The system cannot find the file specified)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at java.io.FileInputStream.<init>(FileInputStream.java:93)
at java.io.FileReader.<init>(FileReader.java:58)
at cw3.Controller.loadPressed(Controller.java:48)
Controller.java
package cw3;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
//To open the load window
import javafx.stage.FileChooser;
import javafx.stage.Stage;
public class Controller {
@FXML // ResourceBundle that was given to the FXMLLoader
private ResourceBundle resources;
@FXML // URL location of the FXML file that was given to the FXMLLoader
private URL location;
@FXML // fx:id="load"
private Button load; // Value injected by FXMLLoader
@FXML // fx:id="mean"
private TextArea mean; // Value injected by FXMLLoader
@FXML
void loadPressed(ActionEvent event) throws FileNotFoundException, IOException{
FileChooser myfileChooser = new FileChooser();
myfileChooser.setTitle("Open...");
File FileDestination = myfileChooser.showOpenDialog(new Stage());
String filename = FileDestination.getName();
System.out.print(filename);
// FileReader reads text files in the default encoding.
FileReader fileReader = new FileReader(filename);
// Always wrap FileReader in BufferedReader.
BufferedReader bufferedReader = new BufferedReader(fileReader);
String inputFileLine = null;
double Mean = 0;
int totalnumber = 0;
while ((inputFileLine = bufferedReader.readLine()) != null) {
Mean += Double.valueOf(inputFileLine);
totalnumber++;
}
double showmean = Mean/totalnumber;
mean.setText(String.valueOf(showmean));
}
@FXML // This method is called by the FXMLLoader when initialization is complete
void initialize() {
assert load != null : "fx:id=\"load\" was not injected: check your FXML file 'Calc.fxml'.";
assert mean != null : "fx:id=\"mean\" was not injected: check your FXML file 'Calc.fxml'.";
}
}
请帮我解决这个错误,它有点混乱。我在单击“加载”窗口中的“打开”按钮后出现此错误
另外,我使用scenebuilder应用程序和netbean来开发java应用程序。如果您想查看fxml文件,我相信fxml文件并不重要。请告诉我。根错误是:
原因:java.io.FileNotFoundException:Test.txt(系统找不到指定的文件)
位于java.io.FileInputStream.open0(本机方法)
在java.io.FileInputStream.open(FileInputStream.java:195)
位于java.io.FileInputStream。(FileInputStream.java:138)
位于java.io.FileInputStream。(FileInputStream.java:93)
位于java.io.FileReader。(FileReader.java:58)
在cw3.Controller.loadPressed(Controller.java:48)
这表示文件Test.txt
不存在,并且在cw3.Controller
类的第48行中抛出了错误。有关堆栈跟踪以及如何读取它们的更多信息,请查看Q&A
在代码中:
@FXML
void loadPressed(ActionEvent事件)引发FileNotFoundException、IOException{
FileChooser myfileChooser=新建FileChooser();
设置标题(“打开…”);
File FileDestination=myfileChooser.showOpenDialog(new Stage());
字符串filename=FileDestination.getName();
System.out.print(文件名);
//FileReader以默认编码读取文本文件。
FileReader FileReader=新的FileReader(文件名);
//始终将文件读取器包装在BufferedReader中。
BufferedReader BufferedReader=新的BufferedReader(文件阅读器);
字符串inputFileLine=null;
双平均值=0;
整数总数=0;
而((inputFileLine=bufferedReader.readLine())!=null){
平均值+=两倍的值(inputFileLine);
totalnumber++;
}
双显示平均值=平均值/总数;
mean.setText(String.valueOf(showmean));
}
您正在将FileDestination.getName()
的结果(顺便说一句,根据Java命名约定,变量名以小写字母开头)传递给FileReader
构造函数。以下是的文档说明:
返回由该抽象路径名表示的文件或目录的名称这只是路径名名称序列中的姓氏[emphasis added]。如果路径名的名称序列为空,则返回空字符串
您需要通过完整路径。您可以通过执行此操作,但只需使用构造函数并直接传递文件
对象可能会更容易。您还需要记住在处理完文件读取器后关闭它;实现这一点的最简单方法是使用。例如:
File chosenFile=。。。;
try(BufferedReader br=newbufferedreader(newfilereader(chosenFile)){
//从BufferedReader读取
}
//注意:关闭BufferedReader将关闭嵌套文件读取器
其他一些注意事项:
- 通过将
文件
转换为via,然后使用,可以使用NIO.2API打开BufferedReader
- 还可以查看其他一些可用的API,例如(在使用
流时不要忘记关闭它)
- 您的方法正在JavaFX应用程序线程(即UI线程)上执行I/O工作您不希望在FX线程上进行阻塞或其他长时间运行的工作,因为这会冻结UI,这不是一个好的用户体验。请考虑将I/O工作移到后台线程,然后将结果发布回FX线程。请参阅和包以获取更多信息。
- 您需要处理
FileChooser\showOpenDialog(窗口)
返回null
的情况。如果用户取消对话框,则会发生这种情况。当前,您的代码只会抛出null点异常
- 不要将一些随机的、刚刚实例化的
阶段
传递给#showOpenDialog(Window)
。应该传递适当的窗口实例(通常是按钮/任何东西所属的窗口),以便模态正常工作(即,在显示文件选择器对话框时,防止用户与所有者窗口交互)。每个节点
持有对其场景
的引用,该场景持有对其窗口
的引用。在您的情况下,您可以使用load.getScene().getWindow()
非常感谢!!我刚刚意识到我应该传递文件类型,而不是getName()一个是我只测试一个函数,并不断添加的东西,所以它可能没有所有的条件。根问题部分帮助我很多!我知道在处理C++时的根问题,所以我有一个新的java根问题:DGlad帮助:另外,请注意,InvocationTargetException
永远不会是根本原因。当通过反射调用的方法引发异常时,会引发该异常(InvocationTargetException
包装该方法引发的异常)。
package cw3;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
//To open the load window
import javafx.stage.FileChooser;
import javafx.stage.Stage;
public class Controller {
@FXML // ResourceBundle that was given to the FXMLLoader
private ResourceBundle resources;
@FXML // URL location of the FXML file that was given to the FXMLLoader
private URL location;
@FXML // fx:id="load"
private Button load; // Value injected by FXMLLoader
@FXML // fx:id="mean"
private TextArea mean; // Value injected by FXMLLoader
@FXML
void loadPressed(ActionEvent event) throws FileNotFoundException, IOException{
FileChooser myfileChooser = new FileChooser();
myfileChooser.setTitle("Open...");
File FileDestination = myfileChooser.showOpenDialog(new Stage());
String filename = FileDestination.getName();
System.out.print(filename);
// FileReader reads text files in the default encoding.
FileReader fileReader = new FileReader(filename);
// Always wrap FileReader in BufferedReader.
BufferedReader bufferedReader = new BufferedReader(fileReader);
String inputFileLine = null;
double Mean = 0;
int totalnumber = 0;
while ((inputFileLine = bufferedReader.readLine()) != null) {
Mean += Double.valueOf(inputFileLine);
totalnumber++;
}
double showmean = Mean/totalnumber;
mean.setText(String.valueOf(showmean));
}
@FXML // This method is called by the FXMLLoader when initialization is complete
void initialize() {
assert load != null : "fx:id=\"load\" was not injected: check your FXML file 'Calc.fxml'.";
assert mean != null : "fx:id=\"mean\" was not injected: check your FXML file 'Calc.fxml'.";
}
}