【问题标题】:For loop does not execute the first command after 2nd timeFor循环在第二次之后不执行第一个命令
【发布时间】:2012-10-17 00:58:03
【问题描述】:

这是我的代码:

import java.util.Scanner;

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

    char pickup;
    char size;
    char type;
    String name;

    double cost=0.0;
    int i;


    for (i=0; i<2; i++)
    {
    System.out.println("What is your name?");
    name = input.nextLine();

    System.out.println("size of pizza: ");
    size =  input.next().charAt(0);

    System.out.println("type of pizza: ");
    type = input.next().charAt(0);

    System.out.println("pick up or delivery?");
    pickup = input.next().charAt(0);


    if(size == 'S' || type == 'V') {cost = 10.0;}
    else if(size == 'M' || type == 'V') {cost = 12.25;}
    else if(size == 'L' || type == 'V') {cost = 14.50;}
    else if(size == 'S' || type == 'C') {cost = 7.0;}
    else if(size == 'M' || type == 'C') {cost = 8.0;}
    else if(size == 'L' || type == 'C') {cost = 9.0;}


    if(pickup == 'D'){
    cost=cost+1.50;
    System.out.println("Name: "+name+". Your cost is: "+cost);}
    else { 
    System.out.println("Name: "+name+". Your cost is: "+cost);}


    } 

}

}

我的代码中有一个 for 循环,它询问名称、大小、类型和拾取。第一次运行时,它要求输入所有字段,但第二次,名称字段由于某种原因不允许我输入姓名,它打印“你叫什么名字?”但它不允许我输入名字......?有人能告诉我为什么吗? 谢谢。

这就是它的样子:http://i.stack.imgur.com/eb1BA.jpg

【问题讨论】:

  • 每个 input.* 调用有什么不同?其中一个与另一个不同。

标签: java loops for-loop


【解决方案1】:

因为

input.next()

不消耗换行符,这些被传递回你的循环并且不允许输入值。您需要添加:

for (i = 0; i < 2; i++) {
   // existing input.next() statements in here
  ...

   input.nextLine();
}

for 循环结束时修复。

【讨论】:

  • 我用图像中的输入对其进行了测试,没有出现任何异常。 Scanner.next 将自动修剪前导空格。
【解决方案2】:

当您将ScannerSystem.in 结合使用时,数据不会从System.in 读取,直到换行符(您已按Enter)。所以你在 Scanner 的缓冲区中实际拥有的是:

Jake\nL\nV\nD\n

这里的关键是D 在您按下回车之前不会被发送到扫描仪的缓冲区。这就是为什么最后会有\n 的原因。通常,当您调用input.next() 时,先前的流浪换行符会被吞噬。但是,当您在 for 循环周围第二次/第三次调用 input.nextLine() 时,它会读取那个流浪的尾随换行符:

    here ----v
Jake\nL\nV\nD\n

所以你得到一个空行,基本上读取了D\n 之间的所有内容,什么都没有。

您需要每次调用nextLine() 并在结果字符串上调用charAt(0)

【讨论】:

  • 我也需要将拾音器更改为字符串类型吗?
  • @kevinQu 不,input.nextLine().charAt(0) 就是你需要做的一切
【解决方案3】:

用 input.nextLine() 替换你的 input.next()。那应该可以解决它。

【讨论】:

    【解决方案4】:

    我遇到了类似的问题,这对我有帮助。 在循环外声明:

    boolean ranOnce=false;
    

    然后在循环中声明这个

    if(!ranOnce){ranOnce=true;String s=input.nextLine();}
    

    【讨论】:

      猜你喜欢
      • 2019-11-24
      • 1970-01-01
      • 2017-03-13
      • 2019-06-27
      • 2019-01-05
      • 1970-01-01
      • 2018-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多