Why is this line being printed twice?
I created a program as part of my computational work to check inventory and it works great, however, after the user has walked through the program after checking the stock of one item, they are asked if they want to check the stock of another item that has one and the same the same line is printed twice and I can't figure out why ?. This is the code:
import java.util.*;
public class stock {
public static void main(String[] args) {
//initialising the scanners
Scanner stock = new Scanner(System.in);
Scanner levels = new Scanner(System.in);
Scanner bar = new Scanner(System.in);
Scanner choice = new Scanner(System.in);
//initialising the string variables
String chocolate;
String chocolate2;
String change;
String choiceb;
//initialising the integer variables
int mars = 200;
int twix = 200;
int bounty = 200;
int doubled = 200;
int galaxy = 200;
int change2;
int counter = 1;
int a = 1;
//asking the user what chocolate bar they want to check stock of
System.out.println("Enter the chocolate bar to check stock of: Mars, Twix, Bounty, Double and Galaxy");
System.out.println("***********************************");
chocolate = stock.nextLine();
System.out.println("***********************************");
//depending on the users choice, this switch statement outputs the appropriate stock level of the bar entered
switch (chocolate.toLowerCase()) {
case ("mars"):
System.out.println("There is currenty " + mars + " in stock");
break;
case ("twix"):
System.out.println("There is currenty " + twix + " in stock");
break;
case ("bounty"):
System.out.println("There is currenty " + bounty + " in stock");
break;
case ("double"):
System.out.println("There is currenty " + doubled + " in stock");
break;
case ("galaxy"):
System.out.println("There is currenty " + galaxy + " in stock");
break;
default:
System.out.println("Your an idiot, try again");
chocolate = stock.nextLine();
}
//the user is then asked if they want to change stock level of any of the chocolate bars
System.out.println("Do you want to change stock levels?");
System.out.println("***********************************");
change = levels.nextLine();
System.out.println("***********************************");
//if the answer is yes it carries on with the program and ignores this if statement. if the answer is no, the program closes
if (change.equals("no")) {
System.exit(0);
}
//this while loop and switch statement is used to check what chocolate bar stock level the user wants to change. 1 is subtracted from the counter
// on the users first input so that the message of checking if the user wants to change any more appears. this
while (a == 1){
if (counter == 0) {
System.out.println("Do you want to change the stock of any more");
choiceb = choice.nextLine();
counter = counter + 1;
}else{
System.out.println("Which chocolate do you want to change stock levels of?");
System.out.println("***********************************");
chocolate2 = bar.nextLine();
System.out.println("***********************************");
switch (chocolate2.toLowerCase()) {
case ("mars"):
System.out.println("Enter the amount of Mars Bars currently in stock");
mars = bar.nextInt();
System.out.println("There is now " + mars + " in stock");
counter = counter - 1;
break;
case ("twix"):
System.out.println("Enter the amount of Twix currently in stock");
twix = bar.nextInt();
System.out.println("There is now " + twix + " in stock");
counter = counter - 1;
break;
case ("bounty"):
System.out.println("Enter the amount of Bounty Bars currently in stock");
bounty = bar.nextInt();
System.out.println("There is now " + bounty + " in stock");
counter = counter - 1;
break;
case ("double"):
System.out.println("Enter the amount of Double Bars currently in stock");
doubled = bar.nextInt();
System.out.println("There is now " + doubled + " in stock");
counter = counter - 1;
break;
case ("galaxy"):
System.out.println("Enter the amount of Galaxy currently in stock");
galaxy = bar.nextInt();
System.out.println("There is now " + galaxy + " in stock");
counter = counter - 1;
break;
}
}
}
}
}
This is the output of the program:
source to share
The problem is the combination of read strings and integers:
System.out.println("Which chocolate do you want to change stock levels of?");
System.out.println("***********************************");
chocolate2 = bar.nextLine();
System.out.println("***********************************");
switch (chocolate2.toLowerCase()) {
case ("mars"):
System.out.println("Enter the amount of Mars Bars currently in stock");
mars = bar.nextInt();
First you read bar
with nextLine()
. The user will enter mars\r\n
( \r\n
is a line break caused by the return hit) and the scanner readsmars\r\n
Then you read nextInt()
(!) From bar
. The user enters 2\r\n
, but nextInt()
will only read 2
, leaving only in front of the \r\n
scanner bar
with the cursor .\r\n
Your logic enters the loop second , re-prints the message , but when your scanner bar
enters again nextLine()
, it will just go on and read \r\n
- the switch is down and your logic enters the third loop ( Message printed a second time )
Now bar
empty again so bar.readLine()
will wait for user input again.
To fix this issue, make sure you skip the current line after reading the integer, so when your scanner hits it again nextLine()
when you ask for a type, it doesn't just consume the line .:
mars = bar.nextInt(); bar.nextLine();
source to share
I think the problem is with four different scanners, all of which read from System.in, add a default statement to your switch-clause, and expose chocolate2.toLowerCase (). I could imagine that chocolate2 also contains a yes input, and this is not recognized in the switch clause :)
one scanner has to do it
source to share