Ошибка с методом compareTo

Все работает хорошо в моем файле почтового отделения, за исключением того, что когда я запускаю файл почтового отделения, он говорит, что есть проблема с моим методом compareTo, который находится в моем файле писем. Ошибка гласит:

 ----jGRASP exec: java PostOffice
Exception in thread "main" java.lang.NullPointerException
    at Letter.compareTo(Letter.java:33)
    at Letter.compareTo(Letter.java:1)
    at SortSearchUtil.selectionSort(SortSearchUtil.java:106)
    at PostOffice.sortLetters(PostOffice.java:73)
    at PostOffice.main(PostOffice.java:15)

 ----jGRASP wedge: exit code for process is 1.
 ----jGRASP: operation complete.

Я не знаю, что может быть не так с моим методом. Мой метод compareTo предназначен для сравнения текущего письма с тем, которое было передано сначала по почтовому индексу, а затем по значению улицы для адреса, если почтовые индексы совпадают.

Вот мой метод почтового отделения:

import java.util.*;
import java.io.*;

public class PostOffice 
{

   private final int max = 1000;
   private Letter [] ltrAra = new Letter[max];
   private int count;

   public static void main(String [] args) 
   {
      PostOffice postOffice = new PostOffice();
      postOffice.readLetters("letters.in");
      postOffice.sortLetters();
      postOffice.printLetters();
   }

   public PostOffice() 
   {
      Letter [] Letters = ltrAra;
      this.count = 0;
   }

   public void readLetters(String filename) 
   {
      int count = 0;
      int iWork = 0;

      Scanner fin = new Scanner(filename);

      String toName, toStreet, toCity, toState, toZip;
      String fromName, fromStreet, fromCity, fromState, fromZip, temp;
      double weight;
      String sWork;
      fin = FileUtil.openInputFile(filename);
      if (fin != null)
      {
         while (fin.hasNext())
         {
            toName = fin.nextLine();
            toStreet = fin.nextLine();
            sWork = fin.nextLine();
            iWork = sWork.indexOf(",");
            toCity = sWork.substring(0, iWork);
            iWork = iWork + 2;
            toState = sWork.substring(iWork, iWork + 2);
            iWork = iWork + 3;
            toZip = sWork.substring(iWork);

            fromName = fin.nextLine();
            fromStreet = fin.nextLine();
            sWork = fin.nextLine();
            iWork = sWork.indexOf(",");
            fromCity = sWork.substring(0, iWork);
            iWork = iWork + 2;
            fromState = sWork.substring(iWork, iWork + 2);
            iWork = iWork + 3;
            fromZip = sWork.substring(iWork);

            sWork = fin.nextLine();
            weight = Double.parseDouble(sWork);   

            ltrAra[count] = new Letter(toName, toStreet, toCity, toState, toZip, fromName, fromStreet, fromCity, fromState, fromZip, weight);      
            count++;
            }
            fin.close();
         }
   }

   public void sortLetters() 
   {
     SortSearchUtil.selectionSort(ltrAra);
   }

   public void printLetters() 
   {
      for (Letter ltr : ltrAra)
      {
         System.out.println(ltr);
         System.out.println();
      }
   }
}

Вот мой метод писем:

public class Letter extends PostOffice implements Comparable<Letter> 
{
   private static final double postageRate = 0.46;
   private String fromName;
   private Address fromAddress;
   private String toName;
   private Address toAddress;
   private double weight;


   public Letter (String fromName, String fromStreet, String fromCity, String fromState, String fromZip, String toName, String toStreet, String toCity, String toState, String toZip, double weight) 
   {
      this.fromName = fromName;
      this.fromAddress = new Address(fromStreet, fromCity, fromState, fromZip);
      this.toName = toName;
      this.toAddress = new Address(toStreet, toCity, toState, toZip);

      this.weight = weight;   
   }

   public String toString() 
   {
      String result;
      result = String.format("from: %s\t\t\t%5.2f\n%s", fromName, Letter.getPostage(weight), fromAddress);
      result = result + String.format("\n\n\t\t\tTo: %s\n\t\t\t%s", toName, toAddress);

      return result;
   }

   public int compareTo(Letter that) 
   {
      int value;
      value = this.toAddress.getZip().compareTo(that.toAddress.getZip());
      return value;
   }


   public static double getPostage(double weight) {
      double workWeight;
      workWeight = weight + 0.999;
      workWeight = (int)workWeight;   
      return workWeight * postageRate;
   } 
}

person user3500131    schedule 07.04.2014    source источник
comment
где вы вызываете compareTo ?   -  person CMPS    schedule 07.04.2014


Ответы (3)


Вы получите исключение всякий раз, когда that имеет значение null, а также ваше назначение переменной является избыточным.

public int compareTo(Letter that) 
{
  if (this.toAddress == null) {
    if (that == null || that.toAddress == null) {
      return 0;
    }
    return -1;
  }
  if (that == null) return 1; // <-- Add something like this.
  // int value;
  // value = this.toAddress.getZip().compareTo(that.toAddress.getZip());
  return this.toAddress.getZip().compareTo(that.toAddress.getZip());
}
person Elliott Frisch    schedule 07.04.2014
comment
@user3500131 user3500131 Я отредактировал, чтобы добавить больше проверок null, но я предлагаю вам научиться использовать точки останова и отладчик. - person Elliott Frisch; 07.04.2014
comment
@ user3500131 Не за что. Пожалуйста, примите ответ. - person Elliott Frisch; 07.04.2014

в вашем методе compareTo вы не проверяете, является ли параметр «этот» нулевым.

вы должны попробовать что-то вроде:

public int compareTo(Letter that){   
  if(that == null) return 1;
  int value;
  value = this.toAddress.getZip().compareTo(that.toAddress.getZip());
  return value;
} 
person Joel G.    schedule 07.04.2014

Ваша проблема в том, что ltrAra имеет 1000 записей, но не так много букв. Итак, когда вы сортируете, вы пытаетесь отсортировать некоторые нули. Но когда вы сравниваете один из реальных объектов с одним из нулей, ваше сравнение вызывает исключение.

Ваше сравнение должно вести себя по-другому, когда его аргумент равен нулю. Вы можете, например, сделать так, чтобы null всегда сортировался после «реальных» значений.

person Dawood ibn Kareem    schedule 07.04.2014