Java 扫描程序在if语句内部工作不正常

Java 扫描程序在if语句内部工作不正常,java,if-statement,java.util.scanner,Java,If Statement,Java.util.scanner,此代码提示用户通过键入Y或N(是/否)确认预订。如果他们键入y或y,它将调用一个方法setBooked(),该方法基本上只是将布尔值变量“booked”设置为“true”。isBooked()只返回boolean值,这样我就可以测试before/after,看看它是否真的有效 实际的代码并没有像我预期的那样工作,如果您键入“y”,它将立即正常工作,但如果您键入任何其他内容,它将再次提示您,如果您键入“y”,它将再次工作,但这次如果您键入任何其他内容,它将停止并移动到下一个“客户”(方法被调用大约

此代码提示用户通过键入Y或N(是/否)确认预订。如果他们键入y或y,它将调用一个方法
setBooked()
,该方法基本上只是将
布尔值
变量“booked”设置为“true”。
isBooked()
只返回
boolean
值,这样我就可以测试before/after,看看它是否真的有效

实际的代码并没有像我预期的那样工作,如果您键入“y”,它将立即正常工作,但如果您键入任何其他内容,它将再次提示您,如果您键入“y”,它将再次工作,但这次如果您键入任何其他内容,它将停止并移动到下一个“客户”(方法被调用大约8次)

因此,基本上是不是有一个原因,它会提示用户两次,而不是仅仅评估他们第一次键入的“y”或“y”

它会提示两次,因为您要求它提示两次

这里:
if(scan.nextLine().equals(“y”)| scan.nextLine().equals(“y”)
您正在调用
scan.nextLine()
两次

将代码更改为:

String s = scan.nextLine();
s=s.toLowerCase(); // change "Y" to "y" . Cleaner code.

if(s.equals("y")){
//your code here
}

您在条件中使用OR调用了两次
scan.nextLine()
。这意味着如果左侧不正确,则它将继续到右侧。但是,如果为真,则OR将为真,不需要计算右侧。这就是为什么当他们第一次输入
y
时,它只请求一次,否则它请求两次

如果您只希望它请求一次,则不要这样做,而是将
scan.nextLine()
的值指定给一个变量,并在If语句中使用该变量

String result = scan.nextLine();
if (result.equals("y") || result.equals("Y")) {
    ...
}

是的,你打了两次电话

 scan.nextLine().equals("y") || scan.nextLine().equals("Y") //2 scan.nextLine()
将代码更改为

 String line=scan.nextLine();
 if ("y".equals(line) ||"Y".equals(line)) // avoid NullPointerException too
或者使用
equalsIgnoreCase()

你应该使用

改为使用
scan.nextLine().equalsIgnoreCase(“y”)
,并在提示您输入
nextLine()
两次时检查这两个条件

若你们想让用户继续要求输入,若用户输入了错误的输入,你们应该使用循环和提示,直到条件得到满足

例如


您在此处声明它应该提示两次:

if (scan.nextLine().equals("y") || scan.nextLine().equals("Y"))
通过调用
scan.nextLine()
两次

您可以执行以下操作:

...
String next = scan.nextLine();    

if (next.equals("y") || next.equals("Y"))
...

尝试使用以下代码:

System.out.println(customer.isBooked());
System.out.println( "Confirm booking for " + customer.getName() + "(Y/N)");
Scanner scan = new Scanner(System.in);
boolean flag = scan.nextLine().equalsIgnoreCase("y");
if (flag)
    customer.setBooked();
System.out.println("Booked");
System.out.println(customer.isBooked());

equalsIgnoreCase()
该死~~:PI怀疑调用
Scanner#nextLine
会引发
NullPointerException
,除非底层输入流突然中断,但这意味着有外部原因会中断应用程序。
if (scan.nextLine().equals("y") || scan.nextLine().equals("Y"))
...
String next = scan.nextLine();    

if (next.equals("y") || next.equals("Y"))
...
System.out.println(customer.isBooked());
System.out.println( "Confirm booking for " + customer.getName() + "(Y/N)");
Scanner scan = new Scanner(System.in);
boolean flag = scan.nextLine().equalsIgnoreCase("y");
if (flag)
    customer.setBooked();
System.out.println("Booked");
System.out.println(customer.isBooked());