初学者Java:理解错误消息:线程中的异常" main" java.util.NoSuchElementException

时间:2015-12-04 03:45:44

标签: java exception compiler-errors

我对Java很陌生,而且我无法理解从这些类中获得的错误。即使我在stackoverflow和其他各种网站上搜索过它,我也无法理解它们的含义。任何帮助都可以很好地理解这些错误消息。

主类

import java.io.IOException;
import java.util.Scanner;


public class Assignment4 {

public static void main (String[] args) throws IOException{

int command = 0;

Scanner kb=new Scanner(System.in);
System.out.print("Enter the name of the input file:Enter data.txt:  ");
String fileName=kb.next();

ClassRoll cr = new ClassRoll("data.txt");
cr.display();

prompt();
System.out.print("Enter a command: ");
String ans=kb.next();


while (!(ans.equalsIgnoreCase("q") || ans.equalsIgnoreCase("quit")))       
{
if(!(ans.equalsIgnoreCase("a") ||ans.equalsIgnoreCase("add") ||
   ans.equalsIgnoreCase("sa") || ans.equalsIgnoreCase("average") ||
   ans.equalsIgnoreCase("sn") || ans.equalsIgnoreCase("names") ||
   ans.equalsIgnoreCase("r") || ans.equalsIgnoreCase("remove") ||
   ans.equalsIgnoreCase("s") || ans.equalsIgnoreCase("save") ||
   ans.equalsIgnoreCase("c1") || ans.equalsIgnoreCase("change1") ||
   ans.equalsIgnoreCase("c2") || ans.equalsIgnoreCase("change2") ||
   ans.equalsIgnoreCase("c3") || ans.equalsIgnoreCase("change3") ||
   ans.equalsIgnoreCase("f") || ans.equalsIgnoreCase("find") ||
   ans.equalsIgnoreCase("d") || ans.equalsIgnoreCase("display")))
   System.out.println("Bad Command");
   else

   switch (command)
    {
        case 1:   cr.add();
                    break;
        case 2:   cr.sortAverage();
                    cr.display();
                    break;
        case 3:  cr.sortNames();
                    cr.display();
                    break;
        case 4:   cr.remove();
                    cr.display();
                    break;
        case 5:   cr.save();
                    cr.display();
                    break;
        case 6:  ClassRoll.changeScore1();
                    cr.display();
                    break;
        case 7:  ClassRoll.changeScore2();
                    cr.display();
                    break;
        case 8:  ClassRoll.changeScore3();
                    cr.display();
                    break;
        case 9:  Student s=cr.find();
                    if (s == null)
                        System.out.println("Student not found");
                    else System.out.println(s.toString());
                    break;
        case 10:   cr.display();

                    break;
        case 11 : System.out.println("Are you sure you want to quit? "
                + "Yes or No");
        String quit = kb.next();
            if (quit.equalsIgnoreCase("y") || 
                quit.equalsIgnoreCase("yes")){
            System.exit(0);
            }
            else
            {
    prompt();
    System.out.print("Enter a command --> ");
    ans=kb.next();
}
cr.save();
System.out.println("Thank you for using this program");

}
}

}
public static void prompt(){
System.out.println("Enter one of the following commands: ");
System.out.println("a or add to add a student in the class roll");
System.out.println("sa or average to sort the students based "
        + "on their average");
System.out.println("sn or names to sort the students "
        + "based on their last names");
System.out.println("r or remove to remove a student from the class roll");
System.out.println("s or save to save the list of students back to the input"
        + "datafile");
System.out.println("d or display to display the class roll");
System.out.println("c1 or change1 to change score 1 of a student");
System.out.println("c2 or change2 to change score 2 of a student");
System.out.println("c3 or change3 to change score 3 of a student");
System.out.println("d or display to display the class roll");
System.out.println("q or quit to exit the program");} 

Class Roll

public class ClassRoll {
ArrayList students = new ArrayList();
private String title;
private String fileName;

public ClassRoll(String f) throws IOException{
//acquires title of file
Scanner fileScan;
Scanner lineScan;
String line;
fileName = f;
fileScan = new Scanner(new File(f));
title = fileScan.nextLine();
System.out.println("Course Title: " + title);

while (fileScan.hasNext()) {
line = fileScan.nextLine();
lineScan = new Scanner(line);
lineScan.useDelimiter("\t");

String lastName = lineScan.next();
String firstName = lineScan.next();

Student name = new Student(firstName, lastName);
name.setScore1(lineScan.nextInt());
name.setScore2(lineScan.nextInt());
name.setScore3(lineScan.nextInt());
students.add(name);

ClassRoll cr = new ClassRoll("data.txt");
cr.display();
}

}
void display(){
double classAverage = 0.0;
DecimalFormat f = new DecimalFormat("0.00");

System.out.println("\t" + title );

for (int i = 0; i < students.size(); i++){
//fix this part of the code, get average
Student name = (Student) students.get(i);
System.out.println(name.toString());
System.out.println("\n" + f.format(name.getAverage()));
classAverage = classAverage + name.getAverage();
}
System.out.println("\t\t\t" + f.format(classAverage / students.size())); 

}

void add(){
Scanner input = new Scanner(System.in);
System.out.print("First Name: ");
String firstName = input.next();

System.out.print("Last Name: ");
String lastName = input.next();

System.out.print("Score 1: ");
int score1 = input.nextInt();

System.out.print("Score 2: ");
int score2 = input.nextInt();

System.out.print("Score 3: ");
int score3 = input.nextInt();

Student s = new Student(firstName, lastName);
s.setScore1(score1);
s.setScore2(score2);
s.setScore3(score3);
students.add(s);

}

static void changeScore1(){
Scanner kb = new Scanner(System.in);
System.out.println("Student's first Name: ");
String f = kb.next();

System.out.println("Student's last Name: ");
String n = kb.next();

System.out.println("Student's first Exam score: ");
Integer score1 = kb.nextInt();

System.out.println("New score of Exam 1: ");
Integer newScore1 = kb.nextInt();

score1 = newScore1;
}

static void changeScore2(){
Scanner kb = new Scanner(System.in);
System.out.println("Student's first Name: ");
String f = kb.next();

System.out.println("Student's last Name: ");
String n = kb.next();

System.out.println("Student's second Exam score: ");
Integer score2 = kb.nextInt();

System.out.println("New score of Exam 2: ");
Integer newScore2 = kb.nextInt();

score2 = newScore2;   
}

static void changeScore3(){
Scanner kb = new Scanner(System.in);
System.out.println("Student's first Name: ");
String f = kb.next();

System.out.println("Student's last Name: ");
String n = kb.next();

System.out.println("Student's third Exam score: ");
Integer score3 = kb.nextInt();

System.out.println("New score of Exam 3: ");
Integer newScore3 = kb.nextInt();

score3 = newScore3;   
}

private int search(String fn, String ln) {
int i = 0;
while (i < students.size()) {
Student s = (Student) students.get(i);
if (s.equals(fn, ln)) {
return i;
} else {
  i++;
    }}
     return -1;
    }



Student find(){

Scanner input = new Scanner(System.in);
System.out.print("First Name: ");
String firstName = input.next();
System.out.print("Last Name: ");
String lastName = input.next();

int i = search(firstName, lastName);

if (i >= 0) {
return (Student) students.get(i);
} else {
return null;
     }   

}


void remove(){
Scanner input = new Scanner(System.in);

System.out.print("First Name: ");
String firstName = input.next();

System.out.print("Last Name: ");
String lastName = input.next();

int i = search(firstName, lastName);

if (i >= 0) {
students.remove(i);
} else {
System.out.println("Student was not found within the list");
}
}

void sortAverage(){

for (int i = 0; i < students.size() - 1; i++) {
  for (int j = i + 1; j < students.size(); j++) {
  Student s1 = (Student) students.get(i);
  Student s2 = (Student) students.get(j);
  if (s1.getAverage() < s2.getAverage()) {
      students.set(i, s2);
      students.set(j, s1);
        }
    }}  
 }

void sortNames(){
for (int i = 0; i < students.size() - 1; i++) {
for (int j = i + 1; j < students.size(); j++) {
Student s1 = (Student) students.get(i);
Student s2 = (Student) students.get(j);
if (s1.compareTo(s2) > 0) {
students.set(i, s2);
students.set(j, s1);
        }
    }}}

void save() throws IOException{
OutputStream file = new FileOutputStream("data.txt");
OutputStream buffer = new BufferedOutputStream(file);
ObjectOutput output = new ObjectOutputStream(buffer);
PrintWriter out = new PrintWriter(fileName);

out.println(title);
for (int i = 0; i < students.size(); i++) {
Student s = (Student) students.get(i);
out.println(s.toString());
output.close();
}}

}

错误消息

Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:862)
at java.util.Scanner.next(Scanner.java:1371)
at ClassRoll.<init>(ClassRoll.java:38)
at Assignment4.main(Assignment4.java:16)

1 个答案:

答案 0 :(得分:0)

hasNext()是next()的前提,否则您将获得这些异常。因此hasNext()必须匹配相应的next()