YaboyBenji YaboyBenji - 2 months ago 12
Java Question

Validation of date input - Fix java.lang.numberformatexception error

I was required to make a program that would take a user inputted date and check for several criteria: date length, leap year, month accuracy, day accuracy, etc... and I believe I have gotten everything figured out except for when I test the date "12/345/678" I get a series of Java errors including:

Exception in thread "main" java.lang.NumberFormatException: For input string: "/678"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at DateChecker.main(DateChecker.java:42)


I believe that this is because when java attempts to extract "yearString" it is unable to because it has been converted to integers using intparser and the inputted code now contains a "/" so the same error would occur with the date "1/234/5678" because monthString is looking for all integers, but it now contains a "/".

I am aware of the code below as I have read through another StackOverflow post with a similar issue, although when I tried to apply this to my program I got a series of compiler errors because my variables were now closed off from the rest of the program

try{
int i = Integer.parseInt(input);
}catch(NumberFormatException ex){ // handle your exception
...
}


Here is the code that I have so far, and thanks in advance for any help that is provided :)

import java.util.*;

public class DateChecker {

public static void main(String[] args) {

Scanner keyboard = new Scanner(System.in); //activates the keyboard

String dateString; //variable declaration

System.out.println("Please enter a date in the format (mm/dd/yyyy): "); //prints to screen
dateString = keyboard.nextLine();//user enters dateString value

if (dateString.length()>10)//checks if date is greater than 10
{
System.out.println("Invalid date."); //prints to screen
System.out.println("To many characters in the date.");//prints to screen
}
else if(dateString.length()<10)//checks if date is less than 10
{
System.out.println("Invalid date.");//prints to screen
System.out.println("To few characters in the date.");//prints to screen
}
else {//date = 10
if(dateString.charAt(2)!='/' && dateString.charAt(5)!='/')//checks for "/" at spots 2 and 5
{
System.out.println("Invalid date.");//prints to screen
System.out.println("Incorrect format.");//prints to screen
}
else{//"/" at spots 2 and 5
//declares variables and extracts strings
String yearString = dateString.substring(6, 10);
String dayString = dateString.substring(3, 5);
String monthString = dateString.substring(0, 2);

//converts string variables to integer
int monthInt=Integer.parseInt(monthString);
int dayInt=Integer.parseInt(dayString);
int yearInt=Integer.parseInt(yearString);

if(monthInt < 1|| monthInt > 12)//checks if valid month is entered
{
System.out.println("Invalid date.");//prints to screen
System.out.println("Month is not valid.");//prints to screen
}
else
{//month is valid
if(dayInt < 1)
{
System.out.println("Invalid date.");
System.out.println("Day is not valid.");
}

else {
if((monthInt == 4 || monthInt == 6 || monthInt == 9 || monthInt == 11) && dayInt > 30)//checks if months should have 30 days
{
System.out.println("Invalid date.");//prints to screen
System.out.println("Day is not valid.");//prints to screen
}
else
if (yearInt % 4 ==0 && (monthInt == 2 && dayInt > 29))//checks if leap year
{
System.out.println("Invalid date.");//prints to screen
System.out.println("Day is not valid.");//prints to screen
}

else//if not leap year
if (yearInt % 4 != 0 && dayInt > 28)//checks if normal year
{
System.out.println("Invalid date.");//prints to screen
System.out.println("Day is not valid.");//prints to screen
}

else //date entered was valid
{
System.out.println("Valid date.");
}
}
}
}


}
}
}

Answer

In your code the problem lies here :-

if(dateString.charAt(2)!='/' && dateString.charAt(5)!='/') //checks for "/" at spots 2 and 5 
{ 
    System.out.println("Invalid date.");//prints to screen
    System.out.println("Incorrect format.");//prints to screen 
}

Here you're looking for both condition to be true instead you should be using OR in place of AND

This a small change you need to do:-

if(dateString.charAt(2)!='/' || dateString.charAt(5)!='/') //checks for "/" at spots 2 and 5 
{ 
    System.out.println("Invalid date.");//prints to screen
    System.out.println("Incorrect format.");//prints to screen 
}

I would recommend you to use Date Class given by JAVA

Thank You, Happy to help :)