I share with you a very lightweight, stand alone, Java validation Class for Input Keyboard, that I created for a university project.
The first thing to mention is an advice about using the Scanner with nextInt(), nextDouble(), next()…
My recommendation is to avoid using these. Work only with Strings and convert to the right Datatype. So use only nextLine(). You will save hours of frustration.
Those are the methods that I’ve implemented:
- int askQuestion(String question, int minValue, int maxValue)
Ask a Question expecting to get a number, like “What year was you born: “, and set a minimum value and a maximum value. The method will not allow to continue until the user enters a valid integer between the ranges. - float askQuestion(String question, float minValue, float maxValue)
Same idea with Floats. - double askQuestion(String question, double minValue, double maxValue)
Same with Double, so for example question = “Enter the price: “. - String askQuestion(String question)
Ask a question and get a String. Simple, no validation. Not even if it’s empty String. - askQuestionLength(String question, int minLength, int maxLength)
Here I changed the name of the method. Same mechanics as askQuestion, but will validate that the String entered is between minimum length and maxlength. For example, to ask a password between 8 and 12 characters. - String askQuestion(String question, String[] allowedValues)
This one accepts a question, and an Array of Strings with the values that are acceptable. Is case sensitive.
So, using MT Notation, you call it with:
String[] a_s_acceptedValues = new String[4];
a_s_acceptedValues[0] = “Barcelona”;
a_s_acceptedValues[1] = “Cork”;
a_s_acceptedValues[2] = “Irvine”;
a_s_acceptedValues[3] = “Edinburgh”;
String s_answer = o_inputFromKeyboard.askQuestion(“What is your favorite city?”, a_s_acceptedValues);
Here is the code for the Class InputFromKeyboard.
package com.carlesmateo;
import java.util.Scanner;
public class InputFromKeyboard {
private static Scanner keyboard = new Scanner(System.in);
public static int askQuestion(String question, int minValue, int maxValue) {
// Make sure we enter in the loop
int value = minValue -1;
while (value < minValue || value > maxValue) {
try {
String valueString = askQuestion(question);
value = Integer.parseInt(valueString);
} catch (Exception e) {
System.out.println("Invalid number!");
}
}
return value;
}
public static float askQuestion(String question, float minValue, float maxValue) {
// Make sure we enter in the loop
float value = minValue -1;
while (value < minValue || value > maxValue) {
try {
String valueString = askQuestion(question);
value = Float.parseFloat(valueString);
} catch (Exception e) {
System.out.println("Invalid number!");
}
}
return value;
}
public static double askQuestion(String question, double minValue, double maxValue) {
// Make sure we enter in the loop
double value = minValue -1;
while (value < minValue || value > maxValue) {
try {
String valueString = askQuestion(question);
value = Double.parseDouble(valueString);
} catch (Exception e) {
System.out.println("Invalid number!");
}
}
return value;
}
public static String askQuestion(String question) {
// Make sure we enter in the loop
String answer = "";
while (answer.equals("")) {
try {
System.out.print(question);
answer = keyboard.nextLine();
} catch (Exception e) {
System.out.println("Invalid value!");
// System.out.println(e.getMessage());
}
}
return answer;
}
public static String askQuestionLength(String question, int minLength, int maxLength) {
// Make sure we enter in the loop
String answer = "";
while (answer.equals("")) {
try {
System.out.print(question);
answer = keyboard.nextLine();
int length = answer.length();
if (length < minLength || length > maxLength) {
answer = "";
System.out.println("Answer should be between " + minLength + " and " + maxLength + " characters.");
}
} catch (Exception e) {
System.out.println("Invalid value!");
// System.out.println(e.getMessage());
}
}
return answer;
}
public static String askQuestion(String question, String[] allowedValues) {
// Make sure we enter in the loop
String answer = "";
while (answer.equals("")) {
try {
System.out.print(question);
answer = keyboard.nextLine();
boolean found = false;
for (int counter=0; counter < allowedValues.length; counter++) {
if (answer.equals(allowedValues[counter])) {
found = true;
}
}
if (found == false) {
System.out.println("Please enter any of the allowed values:");
for (int counter=0; counter < allowedValues.length; counter++) {
System.out.println(allowedValues[counter]);
}
answer = "";
}
} catch (Exception e) {
System.out.println("Invalid value!");
// System.out.println(e.getMessage());
}
}
return answer;
}
}
Is a reduced subset of functionality respect what I created in my Web PHP Framework Catalonia Framework, or the Input Data Validation that my friend Joim created in Privalia and later I extended and maintained.
All the Frameworks have similar Input Data functionalities, some much more complex, supporting RegExp, or several rules, multiselection (typical for web), accepting only a subset of characters, but this is the typical 80% functionality that everybody needs when writing a console program.