0

students配列を姓、名の順に並べ替えることができるはずです。私のcompareTo方法は、最後の反復まで機能します。その後、 a がスローされNullPointerExceptionますが、その理由はわかりません。私は本とインターネットを 12 時間近く探し回っています。見つけたものはすべて試しましたが、まだサイコロはありません。

プログラムのコードは次のとおりです。

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ch11pr112;

import java.io.*;
import java.util.Arrays;
/**
 *
 * @author Tytus
 */
public class CH11PR112{

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {
        // TODO code application logic here
        BufferedReader in = new BufferedReader(new FileReader("src//ch11pr112//Students.txt"));
        Student[] students = new Student[100];
        int i = 0;
        double sum = 0;
        String line = in.readLine();
        while (line != null)
        {
            String[] studentParts = line.split(" ");
            String firstName = studentParts[1];
            String lastName = studentParts[0];
            Double score = Double.parseDouble(studentParts[2]);
            students[i] = new Student(firstName, lastName, score);
            sum += score;
            i++;
            line = in.readLine();
        }
        double average = sum / i;
        double x = i;
        Arrays.sort(students);
        for (i = 0; i < x; i++)
        {
            String studentList = students[i].getLastName() + " " + students[i].getFirstName() + " " + students[i].getScore();
            if (students[i].getScore() < (average - 10))
            {
                System.out.println(studentList + " BELOW AVERAGE");
            }
            else
            {
                System.out.println(studentList);
            }
        }
        System.out.println();
        System.out.println("Average:\t" + average);
    }
}

ここに私のStudents.txtファイルのデータがあります:

Gator Ali 85
Vator Ella 75
Beam John 60
Beam James 95
Class Lastin 55
Steelman Andrea 95
Murach Joel 92
Lowe Doug 82
Murach Mike 93

私の Student.java ファイルのコードは次のとおりです。

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ch11pr112;

/**
 *
 * @author Tytus
 */
public class Student implements Comparable<Student>{
    private String firstName;
    private String lastName;
    private double score;

    public Student(String firstName, String lastName, double score)
    {
        this.firstName = firstName;
        this.lastName = lastName;
        this.score = score;
    }

    public String getFirstName()
    {
        return firstName;
    }

    public void setFirstName(String firstName)
    {
        this.firstName = firstName;
    }

    public String getLastName()
    {
        return lastName;
    }

    public void setLastName(String lastName)
    {
        this.lastName = lastName;
    }

    public double getScore()
    {
        return score;
    }

    public void setScore(double score)
    {
        this.score = score;
    }

    @Override
    public int compareTo(Student x) {
        int lastNameCompare = this.lastName.compareToIgnoreCase(x.getLastName()); 
        if (this.lastName != null && x.lastName != null)
        {
            if (lastNameCompare == 0)
            {
                int firstNameCompare =     this.firstName.compareToIgnoreCase(x.getFirstName()); 
                if (this.firstName != null && x.firstName != null)
                { 
                    if (firstNameCompare == 0)
                        {
                        return 0;
                    }
                    else if (firstNameCompare > 0)
                    {
                        return 1;
                    }
                    else if (firstNameCompare < 0)
                    {
                        return - 1;
                    }
                }
            }
            else if (lastNameCompare > 0)
            {
                return 1;
            }
            else if (lastNameCompare < 0)
            {
                return - 1;
            }
        }
        return 0;
    }
}

何らかの理由で、ファイルのNullPointerException232 行目 ( if (pivot.compareTo(a[mid]) < 0)) の最後の反復中に を作成していComparableTimSort.javaます。

問題は、 を防ぐ方法と、または変数NullPointerExceptionのいずれかが である場合にコードが実行されないはずのときにスローされる理由です。lastNamefirstNamenull

4

2 に答える 2

4

Arrays.sort を使用して null を含む配列をソートできるとは思えません。これは、最終的に がある状況に遭遇するという正確な理由によりpivot == null、比較を試みます。

null.compareTo(Object) < 0

Arrays APIの上部にある警告を参照してください

このクラスのすべてのメソッドは、指定された配列参照が null の場合、特に明記されていない限り、NullPointerException をスローします。

于 2013-02-28T06:51:50.630 に答える
1
public static void main(String[] args) throws Exception {
     BufferedReader in = new BufferedReader(new FileReader("src//ch11pr112//Students.txt"));
     String strLine;
     int count = 0;
     while ((strLine = in.readLine()) != null)   {
       count++;
     }
      Student[] students = new Student[count];
     int i = 0;
     double sum = 0;
     in = new BufferedReader(new FileReader("src//ch11pr112//Students.txt"));
     String line = in.readLine();
     System.out.println(line);
     while (line != null)
     {
         String[] studentParts = line.split(" ");
         String firstName = studentParts[1];
         String lastName = studentParts[0];
         Double score = Double.parseDouble(studentParts[2]);
         students[i] = new Student(firstName, lastName, score);
         sum += score;
         i++;
         line = in.readLine();
     }
     double average = sum / i;
     double x = i;
     for(int w=0;w<students.length;w++)
     System.out.println(students[w]);
     Arrays.sort(students);
     for (i = 0; i < x; i++)
     {
         String studentList = students[i].getLastName() + " " + students[i].getFirstName() + " " + students[i].getScore();
         if (students[i].getScore() < (average - 10))
         {
             System.out.println(studentList + " BELOW AVERAGE");
         }
         else
         {
             System.out.println(studentList);
         }
     }
     System.out.println();
     System.out.println("Average:\t" + average);
 }
于 2013-02-28T07:42:13.990 に答える