无法使我的程序正确读入文件以执行方法

时间:2016-09-27 04:41:10

标签: java nosuchelementexception

在下面的代码中,我遇到了让程序的每个部分都运行相应方法的问题。单独测试它们,它们工作正常。但是,我不认为fileIn.next()正在工作我需要它来获取字母和数字以便正确的语句运行。通常,我会得到一个NoSuchElementException,我无法弄清楚我需要采取哪些步骤来修复它。

编辑1:对不起,如果格式变得很糟糕,但我添加了我必须用我提到的方法创建的类。我也注意到一次迭代后,我文件中的字母不知何故停止出现?

    import java.util.*;

    import java.io.*;

    public class p2{
      public static void main(String[] args) throws IOException{
        Date date1 = new Date();
        Date date2 = new Date();
        Date date3 = new Date(5, 31, 2016);

        System.out.println();
        Scanner fileIn = new Scanner(new File("test1.txt"));

        while (fileIn.next() != null ){
          if (fileIn.next().equals("G") && fileIn.next().equals("1")){
            date1.getDate();
          }        
          if (fileIn.next().equals("G") && fileIn.next().equals("2")){
            date2.getDate();
          }        
          if (fileIn.next().equals("G") && fileIn.next().equals("3")){
            date3.getDate();
          }        
          if (fileIn.next().equals("I") && fileIn.nextInt() == 1){
            date1.incrementDay();
          }        
          if (fileIn.next().equals("I") && fileIn.nextInt() == 2){
            date2.incrementDay();
          }        
          if (fileIn.next().equals("I") && fileIn.nextInt() == 3){
            date3.incrementDay();
          }        
          if (fileIn.next().equals("D") && fileIn.nextInt() == 1){
            date1.displayDate();
          }         
          if (fileIn.next().equals("D") && fileIn.nextInt() == 2){
            date2.displayDate();
          }        
          if (fileIn.next().equals("D") && fileIn.nextInt() == 3){
            date3.displayDate();
          }         
          if (fileIn.next().equals("S") && fileIn.nextInt() == 1){
            String newDate = fileIn.next();
            //System.out.println("newDate: " + newDate);
            int num1 = Integer.parseInt(newDate.substring(0, 2));
            int num2 = Integer.parseInt(newDate.substring(3, 5));
            int num3 = Integer.parseInt(newDate.substring(6, 10));
            System.out.println(num1 + "/" + num2 + "/" + num3);
            date1.setDate(num1, num2, num3);
          }        
          if (fileIn.next().equals("S") && fileIn.nextInt() == 2){
            String newDate = fileIn.next();
            //System.out.println("newDate: " + newDate);
            int num1 = Integer.parseInt(newDate.substring(0, 2));
            int num2 = Integer.parseInt(newDate.substring(3, 5));
            int num3 = Integer.parseInt(newDate.substring(6, 10));
            System.out.println(num1 + "/" + num2 + "/" + num3);
            date2.setDate(num1, num2, num3);
          }         
          if (fileIn.next().equals("S") && fileIn.nextInt() == 3){
            String newDate = fileIn.next();
            //System.out.println("newDate: " + newDate);
            int num1 = Integer.parseInt(newDate.substring(0, 2));
            int num2 = Integer.parseInt(newDate.substring(3, 5));
            int num3 = Integer.parseInt(newDate.substring(6, 10));
            System.out.println(num1 + "/" + num2 + "/" + num3);
            date3.setDate(num1, num2, num3);
          }        
          if (fileIn.next().equals("Q")){
            System.exit(0);
          }
        }

        System.out.println("p2 complete");
        fileIn.close();
      }
    }

class Date{
  private int month;
  private int day;
  private int year;

  public Date(){
    this.month = 1;
    this.day = 1;
    this.year = 2000;
    System.out.println("Empty constructor created.");
  }//end Date constructor

  public Date(int month, int day, int year){
    this.month = month;
    this.day = day;
    this.year = year;
    System.out.println("Overload constructor created.");
  }//end Date overload constructor

  public void setDate(int month, int day, int year){
    //System.out.println("setDate activated: ");
    this.month = month;
    this.day = day;
    this.year = year;
    //System.out.println("setDate complete.");
  }//end setDate

  public void getDate(){
    if (month < 10 && !(day < 10)){//if month is the only single digit int
      System.out.println("getDate activated: 0" + month + "/" + day + "/" + year);
    }//end if
    else if (day < 10 && month > 10){//if day is the only single digit int
      System.out.println("getDate activated: " + month + "/0" + day + "/" + year);
    }//end else if
    else if (day < 10 && month < 10){//if both month and day are single digit ints
      System.out.println("getDate activated: 0" + month + "/0" + day + "/" + year);
    }//end else if
    else{
      System.out.println("getDate activated: " + month + "/" + day + "/" + year);
    }//end else 
  }//end getDay

  public void incrementDay(){
    //System.out.println("Test incrementDay: ");
    int[] daysPerMonth = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    if (year % 4 == 0){
      daysPerMonth[1] = 29;
    }//end if

    for (int i = 0; i < 12; i++){
      if (i+1 == month && day == daysPerMonth[i]){//if we find the month and day is at the end of the month
        if (month == 12 && day == 31){//if we are at december 31st
          month = 1;
          day = 1;
          year += 1;
          break;
        }//end 
        else{
          month += 1;
          day = 1;
          break;
        }//end else
      }//end if
      else if (i+1 == month && day < daysPerMonth[i]){
        day += 1; 
        break;
      }//end else if
      else{
      }//end else
    }//end for

    setDate(month, day, year);
    System.out.print("Result of successful increment: ");
    getDate();
  }//end incrementDay

  public void displayDate(){
    System.out.print("displayDate activated: ");
    System.out.println(this.month + "/" + this.day + "/" + this.year);
  }
}//end Date

1 个答案:

答案 0 :(得分:1)

每个next删除一个令牌,因此if (fileIn.next().equals("G") && fileIn.next().equals("1")){如果第一个令牌等于G则读取两个令牌,否则if将在第一个部分失败并且不读取第二个next

所以你最好将令牌放入变量,比如

String tok1 = fileIn.next ();
String tok2 = fileIn.next ();

if (tok1.equals("G") && tok2.equals("1")){