java - 调用目标异常,不知道怎么办
问题描述
我试过没有使用局部变量的类同样的问题。
一个 gui 应该打开,我可以提交我想要的卡片数量,并将从一副牌中随机选择。以及 gui 上的其他按钮
public class MainGUI extends Application {
public void start(Stage primaryStage) {
class deck {
public ArrayList <Integer> Deck;
public ArrayList<Integer> shuffleDeck(ArrayList<Integer> Deck) {
int x = 52;
for (int i = 1; i <= x; ++i ) {
Deck.add(i);
}
Collections.shuffle(Deck);
return Deck;
}
public ArrayList<Integer> randomCardsSelector(int x, ArrayList<Integer> Deck){
ArrayList<Integer> selectedCards = new ArrayList<Integer>();
Random rand = new Random();
for(int i = 1; i <= x; ++i) {
int newElement = rand.nextInt(Deck.size());
selectedCards.add(Deck.get(newElement));
Deck.remove(newElement);
}
return selectedCards;
}
}
//Horizontal box containing Label, TextField, Button, Cards drawn
HBox topContainer = new HBox();
topContainer.setSpacing(10);
topContainer.setPadding(new Insets(25,50,25,50));
//This is the label
Label insertNbr = new Label();
insertNbr.setText("Number of cards:");
insertNbr.setPadding(new Insets(5,5,5,5));
//This the TextField
TextField cardNbr = new TextField();
cardNbr.setPadding(new Insets(5,5,5,5));
cardNbr.setPrefWidth(30);
//This is the submit button
Button submitBtn = new Button();
submitBtn.setPadding(new Insets(5,5,5,5));
submitBtn.setText("Submit");
HBox newBox = new HBox();
//This is the fetch button
Button fetchBtn = new Button();
fetchBtn.setPadding(new Insets(5,5,5,5));
fetchBtn.setText("Fetch");
fetchBtn.setDisable(true);
//This is the button to draw a card from the array
Button drawCardBtn = new Button("Get Card");
drawCardBtn.setPadding(new Insets(5,5,5,5));
Button higherBtn = new Button();
higherBtn.setPadding(new Insets(5,5,5,5));
higherBtn.setText("Higher");
Button lowerBtn = new Button();
lowerBtn.setPadding(new Insets(5,5,5,5));
lowerBtn.setText("Lower");
newBox.getChildren().addAll(fetchBtn,drawCardBtn,higherBtn,lowerBtn);
ImageView drawnCard = new ImageView();
//Spacer between left nodes and right nodes
final Pane spacer = new Pane();
HBox.setHgrow(spacer, Priority.ALWAYS);
spacer.setMinSize(10, 1);
//FlowPane to add drawn cards
FlowPane drawnCards = new FlowPane();
drawnCards.setPadding(new Insets(5,5,5,5));
drawnCards.setMaxSize(360, 100);
drawnCards.setStyle("-fx-background-color: #008080");
topContainer.getChildren().addAll(insertNbr,cardNbr,submitBtn,spacer,drawnCards);
/*This is the main pane that will
* hold all of the other panes
* and components
*/
BorderPane mainPane = new BorderPane();
mainPane.setTop(topContainer);
mainPane.setLeft(newBox);
mainPane.setCenter(drawnCard);
Scene scene = new Scene(mainPane, 1000, 700);
primaryStage.setTitle("Card Game");
primaryStage.setResizable(false);
primaryStage.setScene(scene);
primaryStage.show();
deck firstDeck = new deck();
deck secondDeck = new deck();
firstDeck.Deck = firstDeck.shuffleDeck(firstDeck.Deck);
submitBtn.setOnAction(e->{
int number = Integer.parseInt(cardNbr.getText());
secondDeck.Deck = secondDeck.randomCardsSelector(number, firstDeck.Deck);
fetchBtn.setDisable(false);
submitBtn.setDisable(true);
for(int i = 0; i<number; i++) {
int x = secondDeck.Deck.get(i);
String url = new String("bin/"+ x +".png");
File file1 = new File(url);
Image image1 = new Image(file1.toURI().toString());
ImageView imageView = new ImageView(image1);
imageView.setFitHeight(90);
imageView.setFitWidth(90);
drawnCards.getChildren().add(imageView);
}
});
fetchBtn.setOnAction(e->{
fetchBtn.setDisable(true);
ArrayList<Integer> selectedNewCard= new ArrayList<Integer>();
selectedNewCard = firstDeck.randomCardsSelector(1, firstDeck.Deck);
int s = selectedNewCard.get(0);
String url = new String("bin/" + s + ".png");
File file2 = new File(url);
Image img = new Image(file2.toURI().toString());
drawnCard.setImage(img);
drawnCard.setFitHeight(150);
drawnCard.setFitWidth(150);
});
drawCardBtn.setOnAction(e->{
drawCardBtn.setDisable(false);
ArrayList<Integer> oneCard = new ArrayList<Integer>();
oneCard = secondDeck.randomCardsSelector(1,secondDeck.Deck);
int number = oneCard.get(0);
String url = new String("bin/" + number + ".png");
File file3 = new File(url);
Image image = new Image(file3.toURI().toString());
drawnCard.setImage(image);
drawnCards.getChildren().get(0).setStyle("-fx-opacity: 0.5");
});
//drawnCards.getChildren().get(3).setStyle("-fx-opacity: 0.5");
}
public static void main(String[] args) {
launch(args);
}
}
我试过没有使用局部变量的类同样的问题。
一个 gui 应该打开,我可以提交我想要的卡片数量,并将从一副牌中随机选择。以及 gui 上的其他按钮
Here is the stack trace
Exception in Application start method
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Na`enter code here`tive 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(LauncherImpl.java:389)
at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
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(LauncherImpl.java:917)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(LauncherImpl.java:182)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
at MainGUI$1deck.shuffleDeck(MainGUI.java:36)
at MainGUI.start(MainGUI.java:135)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(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$148(WinApplication.java:191)
... 1 more
Exception running application MainGUI
解决方案
您的代码至少有两个问题:
- 在方法中定义一个类
- 空指针异常
deck
您在方法中定义了您的类start()
:
public class MainGUI extends Application {
public void start(Stage primaryStage) {
class deck {
}
}
}
那不管用。移动类的class deck
外部MainGUI
:
public class MainGUI extends Application {
public void start(Stage primaryStage) {
}
}
class deck {
}
空指针异常
从您的堆栈跟踪:
Caused by: java.lang.NullPointerException
at MainGUI$1deck.shuffleDeck(MainGUI.java:36)
这涉及以下方法:
public ArrayList<Integer> shuffleDeck(ArrayList<Integer> Deck) {
int x = 52;
for (int i = 1; i <= x; ++i) {
Deck.add(i);
}
Collections.shuffle(Deck);
return Deck;
}
唯一可以在null
这里(并因此导致异常)的真正变量是Deck
变量。所以使舒尔不是null
。
在您的代码中,它是 null 因为您创建了一个新实例deck
并期望设置类成员Deck
,但它实际上是null
.
看:
deck firstDeck = new deck();
firstDeck.Deck = firstDeck.shuffleDeck(firstDeck.Deck);
这里firstDeck.Deck
将null
。Deck
解决此问题的一种方法是在创建新deck
实例时立即初始化类成员:
class deck {
public ArrayList<Integer> Deck = new ArrayList<>();
}
推荐阅读
- python-3.x - 我无法在 Jupyter Notebook 中导入 Keras
- xaml - Xamarin.Forms:无法访问文件夹中的图像
- apache - Drupal 7 多站点不工作
- r - 以变量向量为条件的变异
- java - 比较嵌套 for 循环的复杂度
- c++ - 在 google::dense_hash_map 中存储 std::vectors 会使其变慢
- angular - Angular 5 - 具有不同值的输入视图
- xml - XSLT 中的简单递归
- oracle - 用户是使用标志“ORACLE_MAINTAINED”=“Y”创建的
- python - 张量流中亚当优化器返回的第一个值是什么