Question

I am trying to make a simple even or odd program. I want it to keep running until the user enters in 'q'. But I am having trouble accepting 'q' as a String.

import java.util.Scanner;

class EvenOrOdd {

    public static void main(String[] args) {
        Scanner myScanner = new Scanner(System.in);

        System.out.println("Welcome to my program that checks if a number is even or odd.");

        while (true) {
            System.out.println();
            System.out.print("Please type number in a number ['q' to quit]: ");

            int number;
            String quit;
            try {
                number = myScanner.nextInt();
            } finally {
                quit = myScanner.nextLine();
            }

            if (quit.equals("q")) {
                break;
            } else if (number % 2 == 0) {
                System.out.println(number + " is Even.");
            } else {
                System.out.println(number + " is Odd.");
            }
        }
    }
}

The program works fine when I enter numbers, but when I enter 'q', the console throws an error:

Exception in thread "main" java.util.InputMismatchException
    at java.util.Scanner.throwFor(Unknown Source)
    at java.util.Scanner.next(Unknown Source)
    at java.util.Scanner.nextInt(Unknown Source)
    at java.util.Scanner.nextInt(Unknown Source)
    at EvenOrOdd.main(EvenOrOdd.java:19)

I know this may be easy for many of you, but I have just picked up a java book and am trying to finish the task. Any help would be greatly appreciated!

Was it helpful?

Solution

You can make something like this and i found that a boolean is better for a loop in this case instead of while(true) and break:

public class EvenOrOdd {
public static void main(String[] args) {
    Scanner myScanner = new Scanner(System.in);

    System.out
            .println("Welcome to my program that checks if a number is even or odd.");
    boolean enterLoop = true;
    while (enterLoop) {
        System.out.println();
        System.out.print("Please type number in a number ['q' to quit]: ");

        String scannerinput = myScanner.nextLine();
        if (scannerinput.equals("q")) {
            enterLoop = false;
        } else {
            checkNumber(scannerinput);
        }

    }
}

private static void checkNumber(String scannerinput) {
    try {
        int number = Integer.parseInt(scannerinput);
        if (number % 2 == 0) {
            System.out.println(number + " is Even.");
        } else {
            System.out.println(number + " is Odd.");
        }
    } catch (Exception e) {
        System.out.println("No Number!");
    }
}

}

OTHER TIPS

Take a String from Scanner, check if is 'q' and if not, convert it to int and then check even or odd.

public static void main(String[] args) {
    Scanner myScanner = new Scanner(System.in);

    System.out.println("Welcome to my program that checks if a number is even or odd.");

    while (true) {
        System.out.println();
        System.out.print("Please type number in a number ['q' to quit]: ");

        String inText = myScanner.next();

        if (inText.equals("q")){
            break;
        }
        int number = Integer.valueOf(inText);
        if (number % 2 == 0) {
            System.out.println(number + " is Even.");
        } else {
            System.out.println(number + " is Odd.");
        }
    }
}
import java.util.Scanner;

class EvenOrOdd {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.println("Welcome to my program that checks if a number is even or odd.");

        while (true) {
            System.out.print("\nPlease type number in a number ['q' to quit]: ");
            String input = scanner.next();
            if (input.equals("q")) {
                break;
            } else {
                int number = Integer.parseInt(input);
                System.out.print(number + " is ");
                System.out.print(number%2 == 0 ? "Even." : "Odd.");
            }
        }
    }
}

That'll do it. :)

Instead of using myScanner.nextInt(), just use myScanner.next() to get a String. Then if it is not "q", use Integer.valueOf(inputString) to get the int and check it for even/odd.

while (true) {
    String input = myScanner.next();
    if ("q".equals(input)) {
        break;
    } else {
        int number = Integer.valueOf(input);
        if (number % 2 == 0) {
            System.out.println(number + " is Even.");
        } else {
            System.out.println(number + " is Odd.");
        }
    }
}

Try this approach. Check code note for more details.

import java.util.Scanner;

class EvenOrOdd {

public static void main(String[] args) {
    Scanner myScanner = new Scanner(System.in);

    System.out.println("Welcome to my program that checks if a number is even or odd.");

    String input=null;
    int number;
    boolean flag=true;  // loop flag
    do {
        System.out.println();
        System.out.print("Please type number in a number ['q' to quit]: ");

        // Take user input as String
        input=myScanner.nextLine();


        try 
        {
            // convert the string value to integer value
            number = Integer.parseInt(input);

            if (number % 2 == 0)
            {
                System.out.println(number + " is Even.");
            }
            else
            {
                System.out.println(number + " is Odd.");
            }
        } 
        catch (NumberFormatException nfe) 
        {
           // control goes here if input is not integer value
            if(input.equals("q"))   // exist option
                flag=false;
            else    // invalid input
                System.out.println("Invalid input, Please enter integer value or (q) to exist");


        }


    } while (flag);

}
}

You should update your method flow, you are actually trying to pass and intger validation for a string so first take the input as String and check whether it is your quit character q then if it is not try to parse the string to and int primitive with Integer.parseInt(input) and test if it is Odd or Even. If the process fails assuming it is neither a q nor a number (any other character), then a message will be prompted for user telling him to use a valid number or "q" to quit:

import java.util.Scanner;

class EvenOrOdd {

public static void main(String[] args) {
  Scanner myScanner = new Scanner(System.in);

  System.out.println("Welcome to my program that checks if a number is even or odd.");

  while (true) {
    System.out.println();
    System.out.print("Please type number in a number ['q' to quit]: ");

    int number;
    String input = myScanner.next();
    if (input.equals("q")) {
      break;
    } else {
      try {
        number = Integer.parseInt(input);
        if (number % 2 == 0) {
           System.out.println(number + " is Even.");
        } else {
           System.out.println(number + " is Odd.");
        }
        } catch (NumberFormatException nfe) {
           System.out.println("Enter valid number or \"q\" to quit!");
        }
      }
    }
  }
}

It is because the program is expecting a input of int-type, basically the program outputs: Please type number in a number ['q' to quit], and after that it will reach the myScanner.nextInt(); line and will be waiting for a input, and since "q" is not a integer it will throw an exception.

A quick solution would be to use myScanner.nextLine() and then convert the string into a integer unless it is equal to 'q'. Something like this:

import java.util.Scanner;

public class EvenOrOdd {

    public static void main(String[] args) {
        Scanner myScanner = new Scanner(System.in);

        System.out.println("Welcome to my program that checks if a number is even or odd.");

        while (true) {
            System.out.println();
            System.out.print("Please type number in a number ['q' to quit]: ");

            String string = myScanner.nextLine();
            int number = 0;

            if (string.equals("q")) {
                myScanner.close(); // Close the scanner.
                break;
            } else if ((number = toInteger(string)) == -1){  // Is the string a number, less than Integer.MAX_VALUE and greater than Integer.MIN_VALUE?
                System.out.printf("%s is not a valid integer!%n",string);
            } else if (number % 2 == 0) {
                System.out.println(number + " is Even.");
            } else {
                System.out.println(number + " is Odd.");
            }
        }
    }

    private static int toInteger(String str){
        try{
            return Math.abs(Integer.parseInt(str));
        }catch(NumberFormatException e){
            return -1;
        }
    }
}

By the way, always close the scanner, otherwise a resource leak may occur.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top