JavaFX从文件读取抛出" InvocationTargetException"?

时间:2016-04-01 09:08:06

标签: java file exception javafx

我一直试图了解问题究竟是什么,但无论我做什么似乎都无法奏效。 我有一个文本文件,列出名称和数字,用冒号分隔。 一个例子是:

  贝蒂罗斯:52

     

Angie Scotts:29

     迈克尔罗森:72

列表非常长,包含10,000多行。

public class PeopleIds {
    public static int UNDEFINED_ID = -1;
    private static HashMap<String, Integer> people;

    public static void initialize() {
        people = new HashMap<String, Integer>();
        System.out.println(new File("res/ids/people_ids.txt").exists());
        try {
            Files.lines(Paths.get("res/ids/people_ids.txt")).forEach(s -> {
                people.put(s.replaceAll(":.*", "").trim(), Integer.parseInt(s.replaceAll(".*:", "")));
            });
        } catch (IOException e) {
            System.out.println("Unable to read specified file.");
            e.printStackTrace();
        }
    }

    public static int getId(final String name) {
        final Integer id = people.get(name);
        return id != null ? id : UNDEFINED_ID;
    }
}

我从initialize类调用GUIController方法:

public class GUIController implements Initializable {
    @FXML
    private TableView<PersonData> personTable;
    @FXML
    private TableColumn<PersonData, String> name;
    @FXML
    private TableColumn<PersonData, Integer> limit;
    @FXML
    private TextField searchInput;
    @FXML
    private ImageView personIcon;

    private Image undefinedIcon;
    private PersonIcon icon;
    private ObservableList<PersonData> data;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        PeopleIds.initialize();
        undefinedIcon = new Image(getClass().getResourceAsStream("/ids/no.png"));
        name.setCellValueFactory(new PropertyValueFactory<PersonData, String>("name"));
        limit.setCellValueFactory(new PropertyValueFactory<PersonData, Integer>("limit"));
        data = PriceData.getData();
        personTable.setPeople(data);
        searchInput.textProperty().addListener((ov, oldValue, newValue) -> {
            final String input = searchInput.getText();
            if (input.length() == 0) return;
            searchInput.setText(input.substring(0, 1).toUpperCase() + input.substring(1).toLowerCase());
            filterSearch();
        });
    }
}

当我使用PeopleIds.initialize()从这个类中调用它时,会抛出异常,告诉我应用程序启动方法中存在异常。

以下是完整记录的内容:

Exception in Application start method
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(Unknown Source)
    at com.sun.javafx.application.LauncherImpl.launchApplication(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
Caused by: java.lang.RuntimeException: Exception in Application start method
    at com.sun.javafx.application.LauncherImpl.launchApplication1(Unknown Source)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$156(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: javafx.fxml.LoadException: 
/C:/Confidential/bin/base/PersonGUI.fxml

    at javafx.fxml.FXMLLoader.constructLoadException(Unknown Source)
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.load(Unknown Source)
    at base.PersonGUI.start(PersonGUI.java:13)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$163(Unknown Source)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$176(Unknown Source)
    at com.sun.javafx.application.PlatformImpl.lambda$null$174(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$175(Unknown Source)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$149(Unknown Source)
    ... 1 more
Caused by: java.io.UncheckedIOException: java.nio.charset.MalformedInputException: Input length = 1
    at java.io.BufferedReader$1.hasNext(Unknown Source)
    at java.util.Iterator.forEachRemaining(Unknown Source)
    at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Unknown Source)
    at java.util.stream.ReferencePipeline$Head.forEach(Unknown Source)
    at base.PeopleIds.initialize(PeopleIds.java:17)
    at base.GUIController.initialize(GUIController.java:36)
    ... 18 more
Caused by: java.nio.charset.MalformedInputException: Input length = 1
    at java.nio.charset.CoderResult.throwException(Unknown Source)
    at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
    at sun.nio.cs.StreamDecoder.read(Unknown Source)
    at java.io.InputStreamReader.read(Unknown Source)
    at java.io.BufferedReader.fill(Unknown Source)
    at java.io.BufferedReader.readLine(Unknown Source)
    at java.io.BufferedReader.readLine(Unknown Source)
    ... 24 more
Exception running application base.PersonGUI

我不确定这里发生了什么?我已经调查了一下,人们已经说要移动fxml文件(用于格式化内容并与GUIController链接到与Main类相同的包中的文件,但它已经是

我一直在努力解决这个问题几天无济于事。你们中有谁有过这个问题的经历吗?如果是这样,你是如何解决的?非常感谢。

1 个答案:

答案 0 :(得分:1)

如果在读取文件时存在Exception,而不是在打开文件时,则Files.lines流操作会引发未经检查的异常({{3没有throws子句。

这发生在这里

Files.lines(Paths.get("res/ids/people_ids.txt")).forEach(s -> {
    people.put(s.replaceAll(":.*", "").trim(), Integer.parseInt(s.replaceAll(".*:", "")));
});

,您可以在stacktrace中轻松看到:

Caused by: java.io.UncheckedIOException: java.nio.charset.MalformedInputException: Input length = 1

(这是由于使用了错误的Charset造成的,请参阅Stream.forEach

您没有使用catch子句捕获此类异常:

} catch (IOException e) {

您需要使用

} catch (Exception e) {

也可以捕捉未经检查的例外情况。