I am doing a homework assignment that deals with classes and objects. In it, I have an Address class, Letter class, and PostOffice class that when calling PostOffice, takes an input file and scans through it, printing basically everything in the input file the way it should appear on a letter (to: bla, from: bla, postage amount, to and from address, etc.)
i get an error that reads:
Exception in thread "main" java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Scanner.java:1516)
at PostOffice.readLetters(PostOffice.java:33)
at PostOffice.main(PostOffice.java:14)
and I dont really understand why....
here is my post office class:
import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
public class PostOffice {
private final int MAX = 1000;
private Letter [] letterArray = 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 [] myLetters = letterArray;
this.count = 0;
}
public void readLetters(String filename) {
String toName, toStreet, toCity, toState, toZip;
String fromName, fromStreet, fromCity, fromState, fromZip, temp; //, weight;
double weight;
int index;
Scanner s = new Scanner(filename);
if (s != null) {
while(s.hasNext()){
toName = s.nextLine();
toStreet = s.nextLine();
temp = s.nextLine();
index = temp.indexOf(",");
toCity = temp.substring (0, index);
index = index + 2;
toState = temp.substring (index, index + 2);
toZip = temp.substring (index);
fromName = s.nextLine();
fromStreet = s.nextLine();
temp = s.nextLine();
index = temp.indexOf(",");
fromCity = temp.substring (0, index);
index = index + 2;
fromState = temp.substring (index, index + 2);
fromZip = temp.substring (index);
String var = s.nextLine();
weight = Double.parseDouble(var);
//weight = s.nextLine();
Letter l = new Letter(toName, toStreet, toCity, toState, toZip, fromName, fromStreet, fromCity, fromState, fromZip, weight);
this.count += 1;
this.letterArray[count - 1] = l;
}
}
s.close();
}
public static void sortLetters() {
//call sortSearchUtil This method should call the compareTo method provided by the Letter class to sort.
//You may use any sorting routine you wish (see SortSearchUtil.java)
}
public static void printLetters() {
//call tostring of letter class. print the count of Letters followed by the total postage followed
//by each Letter (make sure you use the toString method provided by the Address and Letter classes for this)
}
}
my letter class:
public class Letter extends PostOffice implements Comparable<Letter> {
private static final double POSTAGE_RATE = 0.46;
private String fromName;
private Address fromAddr;
private String toName;
private Address toAddr;
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.fromAddr = new Address(fromStreet, fromCity, fromState, fromZip);
this.toName = toName;
this.toAddr = 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, getPostage(weight), fromAddr);
result = result + String.format("\t\t To: %s\n\t\t%s", toName, toAddr);
return result;
}
public int compareTo(Letter that) {
int value;
value = this.toAddr.getZip().compareTo(that.toAddr.getZip());
return value;
}
public static double getPostage(double weight) {
double workWeight;
workWeight = weight + 0.999;
workWeight = (int)workWeight;
return workWeight * POSTAGE_RATE;
}
}
and my address class:
import java.awt.*;
import java.util.*;
public class Address {
private String street;
private String city;
private String state;
private String zip;
public Address (String street, String city, String state, String zip) {
this.street = street;
this.city = city;
this.state = state;
this.zip = zip;
}
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public String getZip() {
return zip;
}
public void setZip(String zip) {
this.zip = zip;
}
public String toString() {
String result;
result = String.format("%s\n%s, %s %s", street, city, state, zip);
return result;
}
}
and this is the content of the text file
Stu Steiner (NEW LINE) 123 Slacker Lane (NEW LINE) Slackerville, IL 09035 (NEW LINE) Tom Capaul(NEW LINE) 999 Computer Nerd Court (NEW LINE) Dweebsville, NC 28804-1359 (NEW LINE) 0.50 (NEW LINE) Tom Capaul (NEW LINE) 999 Computer Nerd Court (NEW LINE) Dweebsville, NC 28804-1359 (NEW LINE) Chris Peters (NEW LINE) 123 Some St. (NEW LINE) Anytown, CA 92111-0389 (NEW LINE) 1.55 (NEW LINE)
Everything compiles, I just need it to output like this:
----------------------------------------------------------------------------
From: From value Postage value
From Address value (be sure and use Address toString)
To: To value
To Address value (be sure and use Address toString)
----------------------------------------------------------------------------