Davonte Witcher Davonte Witcher - 2 months ago 6
Java Question

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

Answer

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")){