So to clarify, when the program asks the user for number 1: if the user were to input a letter, I need the program to tell the user that there was an input mismatch, then ask the user for number 1 again. This needs to be achieved using only one single for loop, and there can be no negative numbers that affect the sum or the average. Here’s what I have so far:
import java.util.*; import java.text.*; class fivePositiveNumbers{ public static void main(String[] args){ Scanner keyboard = new Scanner(System.in); int userNumber; int sum = 0; System.out.println("This program will give the sum and average of 5 positive integers,"); for(int i = 1; i <= 5; i++){ System.out.println("Enter number " + i + ": "); try{ userNumber = keyboard.nextInt(); sum = sum + userNumber; if(userNumber <= 0){ throw new Exception("The integer must be positive."); } } catch(InputMismatchException e){ System.out.println("This data type is incorrect."); keyboard.nextLine(); } catch(Exception e){ System.out.println(e.getMessage()); keyboard.nextLine(); } } System.out.println("The sum is " + sum + " and the average of your 5 numbers is " + sum / 5 + "."); } }
Advertisement
Answer
Use a while
or a for
loop that will increment the loop count ONLY IF a valid input is provided. Your solution increments the loop counter automatically regardless of the validity of the input.
int i = 1; while (i <= 5) { System.out.println("Enter number " + i + ": "); try{ userNumber = keyboard.nextInt(); if(userNumber <= 0){ throw new Exception("The integer must be positive."); } sum = sum + userNumber; // this belongs after the negative check i++; // increment the count after all validations are successfully completed } catch(InputMismatchException e){ System.out.println("This data type is incorrect."); keyboard.nextLine(); } catch(Exception e){ System.out.println(e.getMessage()); keyboard.nextLine(); } } }
If you choose to use a for
loop, remove the counter increment out of the loop declaration
for (int i = 1; i <= 5;) { // your logic and exception handling here i++; // as in the while, increment only after all validations are successfully completed }
Another point… I don’t think it is necessary to throw an exception if the number is negative. I think it is better to simply execute a continue
to avoid incrementing the loop counter. This is the result of this:
This program will give the sum and average of 5 positive integers, Enter number 1: -5 The integer must be positive. Enter number 1: -2 The integer must be positive. Enter number 1: -3 The integer must be positive. Enter number 1: -4 The integer must be positive. Enter number 1: -5 The integer must be positive. Enter number 1: 1 Enter number 2: 2 Enter number 3: 3 Enter number 4: 5 Enter number 5: 4 The sum is 15 and the average of your 5 numbers is 3.
As you can see, I entered several negative numbers and the program continued to run without incrementing the loop counter. The complete solution with continue
:
public static void main(String[] args) { Scanner keyboard = new Scanner(System.in); int userNumber; int sum = 0; System.out.println("This program will give the sum and average of 5 positive integers,"); for(int i = 1; i <= 5; ){ System.out.println("Enter number " + i + ": "); try{ userNumber = keyboard.nextInt(); if(userNumber <= 0){ System.err.println("The integer must be positive."); continue; } sum = sum + userNumber; i++; } catch(InputMismatchException e){ System.out.println("This data type is incorrect."); keyboard.nextLine(); } catch(Exception e){ System.out.println(e.getMessage()); keyboard.nextLine(); } } System.out.println("The sum is " + sum + " and the average of your 5 numbers is " + sum / 5 + "."); }