Davonte Witcher
Davonte Witcher

Reputation: 1

Cannot get my program to properly read in file to execute methods

In the following code, I'm having problems getting each part of the program to run the respective methods. Individually testing them, they work fine. However, I don't think the fileIn.next() is working how I need it to to get the letters and numbers to appear in order for the right statement to run. Often, I'll get a NoSuchElementException and I cannot figure out what steps I need to take to fix it.

Edit 1: Sorry if the formatting is getting wonky, but I added the class I had to create with the methods I mentioned. I also noticed after one iteration, the letters in my file stop appearing somehow?

    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

Upvotes: 0

Views: 43

Answers (1)

Scary Wombat
Scary Wombat

Reputation: 44844

EVERY next removes one token, so if (fileIn.next().equals("G") && fileIn.next().equals("1")){ reads two tokens if the first token equals G otherwise the if will fail on the first part and NOT read read the second next

So you are better off to put the tokens into variables, like

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

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

Upvotes: 1

Related Questions