【问题标题】:Scanner.nextLine(); called before wanted due to loopScanner.nextLine();由于循环而在通缉之前调用
【发布时间】:2016-01-22 04:08:49
【问题描述】:

我有一个扫描仪input,在我的Player 课程中由getName() 调用。

public static String getName()
{
  System.out.println("Enter your character's name.");
   String n = input.nextLine();
  return n;
}

但是,当我使用循环来检查我的 RPG 类中的适当玩家输入时,一切正常,直到我进入 “n”或“N”代表

System.out.println("Confirm Character (Y/N)");
confirm = input.next();

循环的工作方式是,如果选择了“n”或“N”,它会再次调用构造函数public Player(String cName, int cStamina, int cDefense, int cStrength, int cAgility, int cIntellect),但是,因为这两个是字符串数据类型,并且构造函数首先调用名称,所以它要么将“n”或“N”识别为名称,或完全跳过整个名称。我该如何解决这个问题?

import java.util.*;
public class RPG 
{
  static Scanner input = new Scanner(System.in);
  private static String confirm; 

  public static void main(String[] args)
  {
    System.out.println("*~~~~~~~~~~~~~~*\n{ ~ Pinnacle ~ }\n*~~~~~~~~~~~~~~*");
    for (int s = 0; s < 1; s++)
    {

    Player me = new Player(Player.getName(), Player.getStam(), Player.getDef(),
    Player.getStr(), Player.getAgi(), Player.getInt()); 

      for (int i = 0; i < 1; i++)
      {       
        System.out.println("*~~~~~~~~~~~~~~*\n"+Player.name +
        "\nStamina: " + Player.stamina +
        "\nDefense: " + Player.defense +
        "\nStrength: " + Player.strength +
        "\nAgility: " + Player.agility +
        "\nIntellect: " + Player.intellect +
        "\n*~~~~~~~~~~~~~~*");
        System.out.println("Confirm Character (Y/N)");
        confirm = input.next();
        if (confirm.equals("Y") || confirm.equals("y"))
          System.out.println("Character Created!");
        else if (confirm.equals("N") || confirm.equals("n"))
          s--;
        else
          i--;  
      }
  }
  }
}

下面的玩家类

import java.util.*;

public class Player extends Characters
{

static Scanner input = new Scanner(System.in);

public Player(String cName, int cStamina, int cDefense, int cStrength, int cAgility, int cIntellect)
{


name = cName;
stamina = cStamina;
defense = cDefense;
strength = cStrength;
agility = cAgility;
intellect = cIntellect;
}
public static String getName()
{
System.out.println("Enter your character's name.");
String n = input.nextLine();
return n;
}
public static int getStam()
{
System.out.println("Enter your character's stamina.");
int s = input.nextInt();
return s;
}
public static int getDef()
{
System.out.println("Enter your character's defense.");
int d = input.nextInt();
return d;
}
public static int getStr()
{
System.out.println("Enter your character's strength.");
int st = input.nextInt();
return st;
}
public static int getAgi()
{
System.out.println("Enter your character's agility.");
int a = input.nextInt();
return a;
}
public static int getInt()
{
System.out.println("Enter your character's intellect.");
int i = input.nextInt();
return i;
}
public static void flee()
{

}

}

这是一个以Sample Name 作为名字输入的示例输出:

*~~~~~~~~~~~~~~*
{ ~ Pinnacle ~ }
*~~~~~~~~~~~~~~*
Enter your character's name.
Sample Name
Enter your character's stamina.
5
Enter your character's defense.
5
Enter your character's strength.
8
Enter your character's agility.
3
Enter your character's intellect.
2
*~~~~~~~~~~~~~~*
Sample Name
Stamina: 5
Defense: 5
Strength: 8
Agility: 3
Intellect: 2
*~~~~~~~~~~~~~~*
Confirm Character (Y/N)
n
Enter your character's name.
Enter your character's stamina.
2
Enter your character's defense.
3
Enter your character's strength.
6
Enter your character's agility.
4
Enter your character's intellect.
2
*~~~~~~~~~~~~~~*

Stamina: 2
Defense: 3
Strength: 6
Agility: 4
Intellect: 2
*~~~~~~~~~~~~~~*
Confirm Character (Y/N)
y
Character Created!

如您所见,问题出现在Confirm Character (Y/N)之后。

【问题讨论】:

  • 你可以使用 input.nextLine() 代替 input.next()
  • @RafaelTeles 将 confirm = input.next(); 更改为 confirm = input.nextLine(); 恐怕不能解决问题。
  • 你能发布你的“玩家”课程吗?
  • 我对你的 getName() 方法很感兴趣。它的名字是从哪里来的?或者在第一次调用之后调用它可能出现问题?
  • 这是因为 nextInt() 不会将扫描仪移动到下一行,而 nextLine() 会。按照int stamina = Integer.parseInt(input.nextLine()); 输入您的整数,您的代码应该可以工作。

标签: java loops


【解决方案1】:

好吧,我找到了解决您问题的方法,但我不确定您的问题为何会发生。不要在我们的 Player 类中使用 static Scanner input = new Scanner(System.in);,而是在每次获取时创建一个新的 Scanner*。

这是一个建议:

public static Player createPlayerFromConsole() {
    Scanner input = new Scanner(System.in);

    System.out.println("Enter your character's name.");
    String name = input.nextLine();

    System.out.println("Enter your character's stamina.");
    int stamina = input.nextInt();

    System.out.println("Enter your character's defense.");
    int defense = input.nextInt();

    System.out.println("Enter your character's strength.");
    int strength = input.nextInt();

    System.out.println("Enter your character's agility.");
    int agility = input.nextInt();

    System.out.println("Enter your character's intellect.");
    int intellect = input.nextInt();

    return new Player(name, stamina, defense, strength, agility, intellect);
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多