2016-04-01 127 views
1

我一直在試圖瞭解問題究竟是什麼,但無論我做什麼似乎都不起作用。 我有一個文本文件,它列出名稱和數字,用冒號分隔。 這樣的一個例子是:JavaFX從文件讀取會拋出「InvocationTargetException」?

貝蒂羅斯:52

安琪斯科茨:29

邁克爾羅森:72

列表很長,並且包括超過10000線。

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; 
    } 
} 

我打電話從GUIControllerinitialize方法:

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類相同的包,但它已經是。

I如果是這樣,你是如何解決這個問題的嗎?非常感謝。

+0

你試過調試嗎?這個異常真的來自'PeopleIds.initialize();'或者可能來自你的變量在下面的行中爲空? –

回答

1

如果有一個Exception而文件是正在讀取,不打開文件時,未經檢查的異常被拋出爲Files.lines數據流操作(Stream.forEach沒有throws子句)

這發生在這裏

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

,您可以在堆棧跟蹤很容易地看到:

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

(這是由錯誤的Charset造成正在使用,見Files.readAllBytes vs Files.lines getting MalformedInputException

你不用你的catch子句來捕捉這種異常:

} catch (IOException e) { 

您需要使用

} catch (Exception e) { 

趕unchecked異常了。

相關問題