java - java 中的 NullPointerException (javafx)

标签 java nullpointerexception

这是Main.java

public class Main extends Application {

    RadioButton chkSort;
    RadioButton chkOrder;

    public static void main(String[] args) {

        launch(args);
    }

    public static Comparator<Student> studentIDComparator = new Comparator<Student>() { 
         public int compare(Student std1, Student std2) { 
         String id1 = std1.getID();
         String id2 = std2.getID();
         return id1.compareToIgnoreCase(id2);
         } 
        }; 

    public static Comparator<Student> studentNameComparator = new Comparator<Student>() { 
         public int compare(Student std1, Student std2) { 
         String name1 = std1.getName();
         String name2 = std2.getName();
         return name1.compareToIgnoreCase(name2);
         } 
        };

    public static Comparator<Student> studentLastnameComparator = new Comparator<Student>() { 
         public int compare(Student std1, Student std2) { 
         String last1 = std1.getLastName();
         String last2 = std2.getLastName();
         //ascending order 
         return last1.compareToIgnoreCase(last2);
         }
         //return fruitName2.compareTo(fruitName1); //descending order 
         };

    public static Comparator<Student> studentGPAComparator = new Comparator<Student>() { 
         public int compare(Student std1, Student std2) { 
         String gpa1 = std1.getGPA();
         String gpa2 = std2.getGPA(); 
         return gpa1.compareTo(gpa2);
         }
        };

    @Override   
    public void start(Stage primaryStage) throws Exception{
        primaryStage.setTitle("Student Sorting");
        SplitPane splitPane = new SplitPane();
        GridPane grid1 = new GridPane();
        GridPane grid2 = new GridPane();

        grid1.setAlignment(Pos.TOP_LEFT);
        grid1.setVgap(10);
        grid1.setHgap(10);
        grid1.setPadding(new Insets(25,25,25,25));
        grid2.setPadding(new Insets(25,25,25,25));
        Scene scene = new Scene(splitPane, 700, 500);
        primaryStage.setScene(scene);

        Text title = new Text("Student Sorting");
        title.setFont(Font.font("Comic Sans MS", FontWeight.BOLD, 20));

        Text sortBy = new Text("Sort by :");
        sortBy.setFont(Font.font("Calibri", FontWeight.BOLD, 14));

        final ToggleGroup toSelect = new ToggleGroup();
        final ToggleGroup toOrder = new ToggleGroup();

        RadioButton idBtn = new RadioButton("ID");
        idBtn.setToggleGroup(toSelect);

        RadioButton nameBtn = new RadioButton("Name");
        nameBtn.setToggleGroup(toSelect);

        RadioButton lastNameBtn = new RadioButton("Last Name");
        lastNameBtn.setToggleGroup(toSelect);

        RadioButton gpaBtn = new RadioButton("GPA");
        gpaBtn.setToggleGroup(toSelect);

        Text order = new Text("Order :");
        order.setFont(Font.font("Calibri", FontWeight.BOLD, 14));

        RadioButton ascBtn = new RadioButton("Ascending");
        ascBtn.setToggleGroup(toOrder);
        ascBtn.setUserData("asc");

        RadioButton desBtn = new RadioButton("Descending");
        desBtn.setToggleGroup(toOrder);
        desBtn.setUserData("des");

        Button start = new Button("Sort");
        start.setPrefSize(170, 20);

        final TextArea text = new TextArea();
        text.setMinSize(500, 400);

        grid1.add(title, 0, 0);
        grid1.add(sortBy, 0, 2);
        grid1.add(idBtn, 0, 3);
        grid1.add(nameBtn, 0, 4);
        grid1.add(lastNameBtn, 0, 5);
        grid1.add(gpaBtn, 0, 6);
        grid1.add(order, 0, 8);
        grid1.add(ascBtn, 0, 9);
        grid1.add(desBtn, 0, 10);
        grid1.add(start, 0, 13);

        grid2.add(text, 2, 2);
        splitPane.getItems().addAll(grid1, grid2);
        splitPane.setDividerPositions(0.3);

        toSelect.selectedToggleProperty().addListener(new ChangeListener<Toggle> (){
            @Override
            public void changed(ObservableValue<? extends Toggle> value,
                    Toggle t1, Toggle t2) {
                chkSort = (RadioButton) t2.getToggleGroup().getSelectedToggle();
            }           
        });

        toOrder.selectedToggleProperty().addListener(new ChangeListener<Toggle> (){
            @Override
            public void changed(ObservableValue<? extends Toggle> value,
                    Toggle t1, Toggle t2) {
                chkOrder = (RadioButton) t2.getToggleGroup().getSelectedToggle();   
            }

        });

        start.setOnAction(new EventHandler<ActionEvent>(){

            @Override
            public void handle(ActionEvent arg0) {
                String temp =text.getText().toString();
                String[] splitLine = temp.split("\n");
                Student[] stdData = new Student[splitLine.length];
                for(int i=0; i<splitLine.length; i++){
                    String[] stdDataStr = splitLine[i].split(" ");
                    if(stdDataStr[i].length() <4 || stdDataStr[i].equals(null)){
                        text.setText("Invalid input");
                        break;
                    }
                    else {

                        stdData[i].setID(stdDataStr[0]);
                        stdData[i].setName(stdDataStr[1]);
                        stdData[i].setLastName(stdDataStr[2]);
                        stdData[i].setGPA(stdDataStr[3]);

                    }
                }   

                if(chkSort.getText().toString().equals("ID")){
                    if(chkOrder.getText().toString().equals("Ascending")){
                        Student.sort(stdData,studentIDComparator , true);
                    }
                    else{
                        Student.sort(stdData, studentIDComparator, false);
                    }
                }
                else if(chkSort.getText().toString().equals("Name")){
                    if(chkOrder.getText().toString().equals("Ascending")){
                        Student.sort(stdData, studentNameComparator, true);
                    }
                    else{
                        Student.sort(stdData, studentNameComparator, false);
                    }
                }
                else if(chkSort.getText().toString().equals("Last Name")){
                    if(chkOrder.getText().toString().equals("Ascending")){
                        Student.sort(stdData, studentLastnameComparator, true);
                    }
                    else{
                        Student.sort(stdData, studentLastnameComparator, false);
                    }
                }
                else if(chkSort.getText().toString().equals("GPA")){
                    if(chkOrder.getText().toString().equals("Ascending")){
                        Student.sort(stdData, studentGPAComparator, true);
                    }
                    else{
                        Student.sort(stdData, studentGPAComparator, false);
                    }
                }

                for(int i=0 ; i<stdData.length; i++){
                    text.setText(stdData[i].getID()+" "+stdData[i].getName()+" "+stdData[i].getLastName()+" "+stdData[i].getGPA());
                }
            }       
        });

        primaryStage.show();        
    }   
}

这是Student.java

    public class Student {
    private String stdID;
    private String stdName;
    private String stdLastName;
    private String stdGPA;

    public Student(String id, String name, String lastName, String gpa) { 
         super(); 
         this.stdID = id;
         this.stdName = name;
         this.stdLastName = lastName;
         this.stdGPA = gpa;
        } 

    public String getID() {return stdID;} 
    public void setID(String id) { this.stdID =id; } 
    public String getName() {return stdName;} 
    public void setName(String name) { this.stdName= name; }
    public String getLastName() {return stdLastName;} 
    public void setLastName(String lastName) { this.stdLastName = lastName; }
    public String getGPA() {return stdGPA;} 
    public void setGPA(String gpa) { this.stdGPA = gpa; }

    public static void sort(Student[] std, Comparator<Student> c, boolean asc){  
        Student tmp; 
        for (int i=0; i<std.length-1;i++){ 
            for(int j=i+1;j<std.length;j++) 
                if((c.compare(std[i],std[j]) >0 && asc==true) ||(c.compare(std[i],std[j]) <0 && asc==false)) { 
                    tmp = std[i]; std[i] = std[j]; std[j] = tmp; 
                } 
         } 
    }

}

这就是Nul​​lPointerException出现的地方

else {
stdData[i].setID(stdDataStr[0]);
stdData[i].setName(stdDataStr[1]);
stdData[i].setLastName(stdDataStr[2]);
stdData[i].setGPA(stdDataStr[3]);   
}

这是我的java src,然后当我尝试运行时,当它尝试setID、setName、setLastName和setGPA时,我得到NullPointerException 我该怎么办?

谢谢大家

最佳答案

您将 stdData 初始化为学生数组,但没有在每个条目中创建新的学生,然后尝试访问不存在的条目中的学生。

你应该做的是,在行之后:

Student[] stdData = new Student[splitLine.length];
    for(int i=0; i<splitLine.length; i++){

添加初始化:

stdData[i] = new Student();

然后继续 - 稍后在代码中您将能够执行以下操作:

stdData[i].setID(stdDataStr[0]);

提示:
当您发布问题时 - 尝试仅发布相关代码,添加堆栈跟踪并标记触发编译/运行时错误的行。

关于java - java 中的 NullPointerException (javafx),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23074940/

相关文章:

java - 列表中的列表

java - 将 List 从 java 转换为 html 中的下拉菜单

java - newScheduledThreadPool() 方法的参数 "corePoolSize"是什么意思?

java - 如何使用用户的控制台输入在java中的eclipse中隐藏控制台输入

java - 尝试在 webDriver 中使用 @FindBy 时出现 java.lang.NullPointerException

java - 如何显示数据库中的一行?

Java数组索引问题

Java 显示 StackTrace 中一行的实际 Java 代码行

android - 崩溃后开始 Activity

java - Hibernate 忽略扩展类的@Table(name = "...") - 创建的表名都是小写的