【问题标题】:Java string index out of range: 0 [closed]Java字符串索引超出范围:0 [关闭]
【发布时间】:2013-08-21 18:04:59
【问题描述】:

我有这个问题,当我输入我的第一个输入时,程序崩溃并且我得到了

字符串索引超出范围:0

我已经在别处寻找并试图找出我的错误,但我发现了不同的问题,这些问题不是我所遇到的。谁能告诉我哪里出错了?

感谢您的帮助,代码如下:

import java.util.Scanner;

public class Assignment1Q2 {

    public static void main(String[] args) {

        System.out.println("Thank you for your call,\nPlease take some time to answer a few questions");
        collectData();

    }//end of main

    public static void collectData() {

        Scanner userInput = new Scanner(System.in);

        int age;
        char gender;
        char show;
        int over30MY = 0, over30FY = 0, under30MY = 0, under30FY = 0;
        int over30MN = 0, over30FN = 0, under30MN = 0, under30FN = 0;

        System.out.println("\nWhat is your age?\n");
        age = userInput.nextInt();

        System.out.println("Male or Female (Enter M or Y)");
        gender = userInput.nextLine().charAt(0);
        gender = Character.toLowerCase(gender);

        System.out.println("Do you watch the show regularly? (Enter Y or N)");
        show = userInput.nextLine().charAt(0);
        show = Character.toLowerCase(show);

        if((age > 30) && (gender == 'm') && (show == 'y')) {       
            over30MY++;             
        }
        else if((age > 30) && (gender == 'f') && (show == 'y')) {
            over30FY++;
        }
        else if((age < 30) && (gender == 'm') && (show == 'y')) {
            under30MY++;
        }
        else if((age < 30) && (gender == 'f') && (show == 'y')) {
            under30FY++;
        }
        else if((age > 30) && (gender == 'm') && (show == 'n')) {
            over30MN++;
        }
        else if((age > 30) && (gender == 'f') && (show == 'n')) {
            over30FN++;
        }
        else if((age < 30) && (gender == 'm') && (show == 'n')) {
            under30MN++;
        }
        else if((age < 30) && (gender == 'f') && (show == 'n')) {
            under30FN++;
        }//end of if else

    }//end of collectData
}// end of class

【问题讨论】:

  • 为什么,哦,为什么人们认为堆栈跟踪不重要?虽然,在这种情况下,只有 2 种可能性....不过!
  • @ingo,这是你真正告诉他的可能性是什么,以及为什么堆栈跟踪很重要,而不是发布你完全没有帮助的评论。
  • @OP,至少在堆栈跟踪的一部分中添加实际错误是什么以及它发生在哪一行确实很有帮助。

标签: java string exception


【解决方案1】:

你的问题出在这一行:

userInput.nextLine().charAt(0);

nextLine() 方法扫描当前行上的所有内容,然后将指针前进过去该行。因此,当您调用 charAt() 方法时,您是在下一行调用它,这是一个空格,因此会发生错误。

相反,将此行更改为:

userInput.next().charAt(0)

请注意,这意味着您的代码的其他部分也需要更改。

编辑:

正要编辑我的解决方案,但@Marc-Andre 添加了他的答案,涵盖了它,所以你也要把目光投向它。

【讨论】:

  • 谢谢!这很有效,下次我一定会记住这一点
  • @user2704743 没有什么比接受答案更能说“谢谢”(当计时器允许时)。
  • @Gamb:我正要这么说!谢谢
  • 不幸的是仍在等待计时器
【解决方案2】:

当您执行age = userInput.nextInt(); 时的问题是您可能输入了一个数字,例如 4,然后按 Enter。

因此,当您调用 nextInt 时,扫描仪会读取 4,但新行并未消耗。这意味着当您这样做时:userInput.nextLine().charAt(0); 您正在使用新行,因此nextLine() 将返回一个空字符串。由于您在空字符串上执行chartAt,因此它会给您一个异常。

你可以这样做:

age = userInput.nextInt();
userInput.nextLine();

这将消耗新行,因此流应该是空的。所以你不会有异常,你可以要求下一个输入。

【讨论】:

  • 感谢您澄清我现在做错了什么:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-05
  • 2018-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多