Джава. Проблемы с чтением ввода - PullRequest
0 голосов
/ 18 января 2012

Я делаю домашнее задание, которое касается классов и предметов.В нем есть класс Address, класс Letter и класс PostOffice, который при вызове PostOffice берет входной файл и просматривает его, печатая практически все во входном файле так, как он должен отображаться на букве (to: bla, from: бла, стоимость доставки, адрес и т. д.)

Я получаю сообщение об ошибке:

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)

, и я не совсем понимаю, почему ....

вот мой класс почтового отделения:

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)
}

}

мой класс письма:

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

и мой адресный класс:

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

и это содержимое текстового файла

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)

Все компилируется, мне просто нужно вывести его так:

----------------------------------------------------------------------------

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)

----------------------------------------------------------------------------

Ответы [ 4 ]

4 голосов
/ 18 января 2012

Вы делаете s.readline() много раз за 1 итерацию цикла while.Вот почему вы получаете сообщение об ошибке.

Вам нужно вызывать readLine() только один раз внутри цикла while

Пример в вашем коде:

while(s.hasNext()){
        toName = s.nextLine();
        toStreet = s.nextLine();
        temp = s.nextLine();
        // ...
    }

3 вызова функции nextLine. Как вы можете быть уверены, что строки еще есть?,Пример:

while(s.hasNext()){
     toName = s.nextLine();
     if (s.hasNext()) {
         toStreet = s.nextLine();
     }
     if (s.hasNext()) {
         temp = s.nextLine();
     }
     // ...
}
2 голосов
/ 18 января 2012

Возможно, вы пропустили тестирование, если у вас есть следующая строка:

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Scanner.html#hasNext%28%29

0 голосов
/ 18 января 2012

Ваше подозрение было верным: вы не открываете файл, а просто передаете строку "letter.in" в сканер.Правильный код:

    Scanner s = null;
    try {
        s = new Scanner(new File(filename));
    } catch (FileNotFoundException ex) {
        Logger.getLogger(PostOffice.class.getName()).log(Level.SEVERE, null, ex);
    }
    if (s != null) {
         ....
    }

Ваша программа по-прежнему не будет ничего печатать, поскольку метод printLetters () не реализован, но больше не будет аварийно завершать работу (по крайней мере, если файл всегда имеет кратное число7 строк).Формат ввода не очень удачно выбран, но так как это домашнее задание, я думаю, это был не ваш выбор.чтобы сделать код как минимум немного менее подверженным ошибкам, вы могли бы спросить перед каждой следующей строкой, существует ли на самом деле следующая строка (это не хорошее решение, но такое, которое выполняется без особой работы).

0 голосов
/ 18 января 2012

Проблема заключается в несоответствии (hasNext() и nextLine()).

С nextLine() вы должны использовать hasNextLine().Вероятно, это именно та комбинация, которая вам нужна, поскольку вы, кажется, читаете ее построчно.

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

while(s.hasNextLine()) { // check if there is next line
    String toName = s.nextLine();
    String toAddrLine1 = s.nextLine();
    String toAddrLine2 = s.nextLine();
    String fromName = s.nextLine();
    String fromAddrLine1 = s.nextLine();
    String fromAddrLine2 = s.nextLine();
    String postageValueStr = s.nextLine();

    //do further processing down here

Хотя hasNext() следует использовать в сочетании с next().

Пожалуйста, пройдите через Scanner doc .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...