我目前正在處理一個 JavaFX 專案,以從包含有關戲劇中各種場景的資訊的檔案中讀取資料。我正在嘗試在下一個場景中顯示所述資訊,但在實施之前,我決定進行測驗并確保所有內容都正確分配;當然不是。
我不斷收到一條很長的錯誤訊息,我不知道該怎么做,但似乎有意義的是 java.lang.NullPointerException。我做了一個回圈來列印我的 Scene 物件的值,看看它們是否為空,但它們都包含值。我不明白為什么它被認為是 null,一切都很好,直到我決定將新制作的 Scene 添加到我的 Scene 陣列中。任何幫助將不勝感激=)。
此外,控制器中的 switchAct1 正在呼叫有問題的方法。
錯誤資訊
1 "Alexander Hamilton" Burr
1 "Alexander Hamilton" Laurens
1 "Alexander Hamilton" Jefferson
1 "Alexander Hamilton" Madison
1 "Alexander Hamilton" Hamilton
1 "Alexander Hamilton" Eliza
1 "Alexander Hamilton" Washington
1 "Alexander Hamilton" Company
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:397)
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:434)
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:410)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:433)
at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
at com.sun.glass.ui.View.notifyMouse(View.java:941)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$4(WinApplication.java:185)
at java.lang.Thread.run(Unknown Source)
Caused by: 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 sun.reflect.misc.Trampoline.invoke(Unknown Source)
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.reflect.misc.MethodUtil.invoke(Unknown Source)
at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1769)
... 48 more
Caused by: java.lang.NullPointerException
at model.Act.loadAct(Act.java:88)
at controller.RollController.switchAct1(RollController.java:63)
... 58 more
行為.java
package model;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
public class Act {
String num;
ArrayList<Scene> lists;
Act(String num, ArrayList<Scene> list) {
}
public Act() {
}
public static void setList2(ArrayList<Scene> list) {
list = new ArrayList<>();
}
@SuppressWarnings("resource")
public void loadAct(String file) throws IOException {
BufferedReader br = null;
int i =1;
br = new BufferedReader(new FileReader( file));
String line;
//setList2(this.lists);
while ((line = br.readLine()) != null) {
String [] value = line.split(",");
//split the first value because that includes the act number, title, and the first role
String [] tmp = value[0].split("-");
this.num = tmp[0];
String name = null;
//the last act in the text file contains an additional hyphen
if (tmp.length == 4) {
name = tmp[1] "-" tmp[2];
}
else {
name = tmp[1];
}
Role roleP = null;
//if split into 3, index 2 is the first role
if (tmp.length == 3) {
roleP = new Role (tmp[2]);
}
else if (tmp.length == 4) {
roleP = new Role (tmp[3]);
}
ArrayList<Role> roles = new ArrayList<Role>();
roles.add(roleP);
//assigning the split values into role objects and adding to the role array list
while(i < value.length) {
Role temp = new Role (value [i]);
//System.out.println(temp.name);
roles.add(temp);
i;
}
//creates scenes
Scene scenes = new Scene(tmp[0], name, roles);
//test to make sure values arent null
int j =0;
while (j < scenes.list.size()) {
System.out.println(scenes.id scenes.title scenes.list.get(j).name);
j;
}
//this little bastard line of code is wasting my time
this.lists.add(scenes);
}
}
}
場景.java
package model;
import java.util.ArrayList;
public class Scene {
String id;
String title;
ArrayList<Role> list;
@SuppressWarnings("unchecked")
Scene(String id, String title,ArrayList<Role> list) {
this.id = id;
this.title = title;
//something i saw online to copy arraylists
this.list = (ArrayList<Role>)list.clone();
}
public static void setList(ArrayList<Role> list) {
list = new ArrayList<>();
}
}
滾動控制器.java
package controller;
import java.io.IOException;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.stage.Stage;
import model.Act;
//extend
public class RollController{
private Stage stage;
private Scene scene;
private Parent layout;
@FXML
private TextArea name;
public static TextArea static_name;
@FXML
private TextArea roles;
public static TextArea static_roles;
@FXML
private Button act1, act2;
@FXML
private Label userName;
public static Label static_user;
@FXML
private Button log;
public void initialize () {
static_name = name;
static_roles = roles;
static_user = userName;
}
public void switchScene1 (ActionEvent event) throws IOException {
Parent layout = FXMLLoader.load(getClass().getResource("/view/Login.fxml"));
stage = (Stage)((Node)event.getSource()).getScene().getWindow();
scene = new Scene(layout);
stage.setTitle("Login");
stage.setScene(scene);
stage.show();
}
public void switchAct1 (ActionEvent event) throws IOException {
Act act1 = new Act();
act1.loadAct("Data\\act1.txt");
Parent layout = FXMLLoader.load(getClass().getResource("/view/ActView.fxml"));
stage = (Stage)((Node)event.getSource()).getScene().getWindow();
scene = new Scene(layout);
stage.setTitle("Act 1");
stage.setScene(scene);
stage.show();
}
}
文本檔案
1 - "Alexander Hamilton" - Burr, Laurens, Jefferson, Madison, Hamilton, Eliza, Washington, Company
2 - "Aaron Burr Sir" - Hamilton, Burr, Laurens, Lafayette, Mulligan, Company
3 - "My Shot" - Hamilton, Laurens, Lafayette, Mulligan, Burr, Company
4 - "The Story of Tonight" - Hamilton, Laurens, Mulligan, Lafayette, Company
5 - "The Schuyler Sisters" - Angelica, Eliza, Peggy, Burr, Company
6 - "Farmer Refuted" - Seabury, Hamilton, Burr, Company
7 - "You'll Be Back" - King George III, Company
8 - "Right Hand Man" - Washington, Hamilton, Burr, Company
9 - "A Winter's Ball" - Burr, Hamilton, Company
10 - "Helpless" - Eliza, Company
11 - "Satisfied" - Angelica , Company
12 - "The Story of Tonight (Reprise)" - Laurens, Mulligan, Lafayette, Hamilton, Burr
13 - "Wait for It" - Burr, Company
14 - "Stay Alive" - Hamilton, Washington, Laurens, Lafayette, Mulligan, Lee, Eliza, Angelica, Company
15 - "Ten Duel Commandments" - Laurens, Hamilton, Lee, Burr, Company
16 - "Meet Me Inside" - Hamilton, Burr, Laurens, Washington, Company
17 - "That Would Be Enough" - Eliza , Hamilton
18 - "Guns and Ships" - Burr, Lafayette, Washington, Company
19 - "History Has Its Eyes on You" - Washington, Hamilton, Company
20 - "Yorktown (The World Turned Upside Down)" - Hamilton, Lafayette, Laurens, Mulligan, Washington, Company
21 - "What Comes Next?" - King George III
22 - "Dear Theodosia" - Burr, Hamilton
23 - "Tomorrow There'll Be More of Us" - Laurens, Eliza, Hamilton
24 - "Non-Stop" - Burr, Hamilton, Angelica, Eliza, Washington, Company
uj5u.com熱心網友回復:
我不明白為什么它被認為是空的,
它被“考慮”,null因為它是null。Java 運行時不存在1。
1 - 如果您不相信,請通過在違規行之前添加跟蹤列印來列印出變數實際包含的內容來檢查這一點。
你得到一個 NPE( NullPointerException) 因為lists是null。這是null因為您的代碼沒有初始化它。
(其他例外是您的代碼未處理 NPE 的結果......它可能不應該這樣做。當您的代碼不再在應用程式執行緒上拋出 NPE 時,它們將消失。IMO,您不需要這樣做關于他們的任何事情。)
看起來您一直在嘗試lists在各個地方進行初始化,但是您犯了各種錯誤。
建構式有空的主體。所以接受
list論點的人是無視它。該
static方法setList2不應該是靜態的,如果它是你的意圖,它可以用來設定lists。靜態方法不能this顯式或隱式分配給 ... 的實體變數。該
setList2方法正在分配給listnotlists。那是引數的名稱。所以它實際上做的是創建一個空ArrayList并將其分配給一個區域變數......然后它就會消失。您沒有使用
Act(String num, ArrayList<Scene> list)建構式或 setList2。對后者的呼叫被注釋掉了。
建議:
確保您了解常規和
static方法之間的區別。我的意思是真的明白了。(你在setList2方法中犯的錯誤意味著你不理解。)回去再讀一遍你的教科書、講義,不管怎樣。或者找到一個很好的 Java 教程來解釋它。避免靜態方法和靜態欄位。它們通常不是解決方案。
仔細閱讀你的代碼和錯誤資訊;例如,在某些時候可能有一些線索會告訴你,
list而且lists它們不是同一個名字。如果您遇到編譯錯誤,不要只是嘗試通過一些隨機更改來消除錯誤;例如注釋掉代碼。您實際上需要了解錯誤訊息告訴您的內容并找出修復它的正確方法。
“通過隨機改變事物進行編程”技術非常低效......而且令人沮喪......并且經常最終產生奇怪和損壞的代碼。所以,不要那樣做。相反,您可能希望閱讀有關Rubber Duck 除錯技術的資訊。
使用 Rubber Duck Debugging 技術,Duck 會想知道為什么您如此確定那lists不是null。在向 Duck 解釋它時,您會注意到一個明顯的問題:您的代碼中沒有任何地方將任何內容分配給list.
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/352460.html
