【问题标题】:Assigning a String to a String array将字符串分配给字符串数组
【发布时间】:2013-10-12 17:49:03
【问题描述】:

我正在尝试将用户输入的每个字符串分配给字符串数组。整个事情都在for 循环中,并由数组的索引进行评估。我的代码是:

String skillAssign[] = new String[100];

    for (int i=0; isDone == false; i++)
    {
        System.out.println(skillAssign[i]);
        System.out.println(i);
        skillAssign[i] = keyboard.nextLine();
        if ((!(skillAssign[i].equalsIgnoreCase("stats"))) && (!(skillAssign[i].equalsIgnoreCase("done"))))
        {
            assignmentValue = keyboard.nextInt();
            if (((skillAssign[i].equalsIgnoreCase("health"))) && (skillPoints - assignmentValue >=0))
            {
                System.out.println("Added " + assignmentValue + " points to Health!");
                skillPoints = (skillPoints - assignmentValue);
                newMaxHealth = (assignmentValue + newMaxHealth);
            }
        //code that evaluates the string located inside the skillAssign[i] for other stats
    }

第一个字符串计算正确,但是当我输入第二个字符串时,我得到 java.util.InputMisMatchException。我怎样才能得到它,以便它为用户输入的数组的每个索引分配一个字符串,然后评估它? (我想我得到了评估部分)

我试图将帖子限制在相关代码中,因此省略了诸如 isDone 之类的内容,但是当键入 done 并且使用 Scanner keyboard = new Scanner 构造键盘时,isDone 更改为 true,所有其他变量都设置为 0,除了 SkillPoints

【问题讨论】:

  • 您提供的信息太少,无法解决问题。你还没有告诉isDone 是什么。另外,您在for 循环中还做了什么。除此之外,请发布完整的堆栈跟踪。
  • 您根本不会在循环中修改 isDone 。另外isDone == false 可以更好地表示为!isDone
  • isDone 在循环内的省略代码中被修改,但它并不真正相关,因为无论如何都会在第二个循环之后引发异常。
  • 循环时需要修改isDone,否则会遇到ArrayIndexOutOfBoundsException

标签: java arrays string loops


【解决方案1】:

我已经测试了上述代码,结果是这样的:

  • 我们进入循环。
  • 要求您输入第一个字符串(通过keyboard.nextLine())。我输入了“健康”。
  • 要求您输入一个整数(通过keyboard.nextInt())。我输入了“40”。
  • 我们重新进入循环。
  • 要求您输入一个整数(通过keyboard.nextInt())。
  • ...

似乎没有要求我输入第二个字符串,而是立即输入整数。

我不知道为什么会这样,但看起来nextInt() 会导致下一个nextLine() 被跳过。

也许你可以替换

assignmentValue = keyboard.nextInt();

try {
    assignmentValue = Integer.parseInt(keyboard.nextLine());
}
catch (NumberFormatException exc) {
    throw new InputMismatchException(exc.getMessage());
}

编辑
我看到a post on StackOverflow 简要地提到了为什么nextLine()nextInt() 被跳过之后。

【讨论】:

    【解决方案2】:

    我相信这更接近您的意图。这样,nextLine 抓取的对键盘输入的引用不会在每次迭代中丢失,而是保留在新的 String 实例中。对吗?

    System.out.println(i);
    String getMe = keyboard.nextLine();
    skillAssign[i] = new String(getMe);
    System.out.println(skillAssign[i]);
    

    【讨论】:

    • 如果我使用那个方法,它不会只工作一次,因为我不能创建另一个名为 getMe 的字符串吗? (我有点菜鸟)
    • getMe 是循环内的一个局部变量,这意味着在每次迭代中,它都是新生的,与前一次迭代中它的存在没有任何联系。
    • 如果这太令人困惑,请忽略 getMe,并使用 SkillAssign[i] = new String(keyboard.nextLine());
    • String skillAssign[] = new String[100]; 不会为将来从键盘获取的字符串分配内存。它只是保留引用,一旦您获得这些字符串,就可以使用它们来访问它们。一旦有要引用的实际字符串,您必须创建一个实例来保存它的实际字符。这是用new String(getMe); 完成的
    猜你喜欢
    • 2010-10-09
    • 1970-01-01
    • 2021-12-07
    • 2019-10-13
    • 1970-01-01
    • 2012-02-19
    • 1970-01-01
    • 2021-07-23
    相关资源
    最近更新 更多