首页 > 解决方案 > 调用目标异常,不知道怎么办

问题描述

我试过没有使用局部变量的类同样的问题。

一个 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

标签: javaeclipsejavafx

解决方案


您的代码至少有两个问题:

  1. 在方法中定义一个类
  2. 空指针异常

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.DecknullDeck解决此问题的一种方法是在创建新deck实例时立即初始化类成员:

class deck {
    public ArrayList<Integer> Deck = new ArrayList<>();
}


推荐阅读