user12133
user12133

Reputation: 13

NullPointerException in java (javafx)

This is 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();        
    }   
}

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

}

This is where NullPointerException appear

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

this is my java src then when i try to run i get NullPointerException when it try to setID, setName, setLastName and setGPA what should i do?

Thanks all

Upvotes: 1

Views: 583

Answers (1)

Nir Alfasi
Nir Alfasi

Reputation: 53525

You're initializing stdData to be an array of students but you don't create a new Student in each entry and then you try to access a student in an entry where it doesn't exist.

What you should do is, after the lines:

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

add an initialization:

stdData[i] = new Student();

and then continue as you do - later in the code you'll be able to do stuff like:

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

Tip:
When you post a question - try to post only the relevant code, add a stacktrace and mark the line which triggers the compilation/run-time error.

Upvotes: 1

Related Questions