【问题标题】:Java : Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range:Java:线程“main”中的异常 java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:
【发布时间】:2015-02-11 20:56:32
【问题描述】:

我是初学者,谁能帮我弄清楚我们在做什么。我正在尝试读取一个字符串并将字符串的每个字符存储在一个数组中。

import java.util.Scanner;

public class CoreMainDigitExtractor {

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

    public static void main(String[] args) {


        digitExtractor ExtracDig = new digitExtractor();

        System.out.println("Enter a String to Extract and Display Vertically in Reverse Order : ");
        String input1 = inputString.nextLine();
        System.out.println("User input String is : " + input1);
        System.out.println("Calling Method 'OrderByMaths' in Object 'ExtracDig' of Class 'digitExtractor', with User Input String....'"+input1+"'");    
        ExtracDig.OrderbyMaths(input1);

    }

}




public class digitExtractor {

    int tNumber;

    public digitExtractor() {
        // TODO Auto-generated constructor stub
    }

    public void OrderbyMaths(String numberSequence) {
        System.out.println("OrderbyMatch : Inside Method 'OrderbyMaths'....");
        System.out.println("OrderbyMatch : Initializing a variable of type int 'tNumberLength'.");
        int tNumberLength = numberSequence.length();
        System.out.println("OrderbyMatch : Variable Initialized of type int 'tNumberLength'.");
        System.out.println("OrderbyMaths : Capture length of User Input String into Variable 'tNumberLength'.");
        System.out.println("OrderbyMaths : The length of User Input String in Variable 'tNumberLength' is '" + tNumberLength + "'.");
        System.out.println("OrderbyMatch : Initializing an Array of type int 'arrNumberSequence'; with Size of Array equal to 'tNumberLength'.");
        char arrNumberSequence[] = new char[tNumberLength];
        System.out.println("OrderbyMatch : Initialized Array 'arrNumberSequence' with Size '" + arrNumberSequence.length + "'");
        int i = 0;

        while (i <= arrNumberSequence.length){
            arrNumberSequence[i] = numberSequence.charAt(i);
            System.out.println("OrderbyMatch : Value in Array Slot '"+arrNumberSequence[i]+"' is '"+ numberSequence.charAt(i)+"'");
            i++;    

        }

    }   

}

输出

输入要提取的字符串并以相反的顺序垂直显示:

破解

用户输入字符串是:HACK

在类“digitExtractor”的对象“ExtracDig”中调用方法“OrderByMaths”,使用用户输入字符串......“HACK”

OrderbyMatch : 内部方法“OrderbyMaths”....

OrderbyMatch : 初始化 int 'tNumberLength' 类型的变量。

OrderbyMatch : 变量初始化为 int 'tNumberLength' 类型。

OrderbyMaths : 将用户输入字符串的长度捕获到变量“tNumberLength”中。

OrderbyMaths : 变量“tNumberLength”中用户输入字符串的长度为“4”。

OrderbyMatch : 初始化一个 int 'arrNumberSequence' 类型的数组;数组大小等于“tNumberLength”。

OrderbyMatch:初始化数组“arrNumberSequence”,大小为“4”

OrderbyMatch : 数组槽 'H' 中的值是 'H'

OrderbyMatch:数组槽“A”中的值为“A”

OrderbyMatch : 数组槽 'C' 中的值是 'C'

OrderbyMatch : 数组槽 'K' 中的值是 'K'

线程“主”java.lang.StringIndexOutOfBoundsException 中的异常:字符串索引超出范围:4 在 java.lang.String.charAt(未知来源) 在 digitExtractor.OrderbyMaths(digitExtractor.java:23) 在 CoreMainDigitExtractor.main(CoreMainDigitExtractor.java:16)

问候

淡化

【问题讨论】:

  • 我猜i &lt;= arrNumberSequence.length 在循环中总是为真,i &lt;= numberSequence.length 不一定为真。
  • 您是否建议不要使用 WHILE 循环?
  • 我稍微更改了代码,但在表示方面看起来更好。但是错误仍然存​​在。

标签: java arrays string


【解决方案1】:

对于字符串HACK,我们有.length4。 Java 中的索引从 0 开始,所以我们有

['H','A','C','K']
  ^   ^   ^   ^ 
  0   1   2   3

所以让我们在你的while循环中说i=4

while (i <= arrNumberSequence.length)
while (is 4 less than or equal to 4? yes 4==4 so continue with the loop) 

当我们尝试访问 charAt(4) 时,它不是我们字符串的有效索引

['H','A','C','K']
  ^   ^   ^   ^   ^
  0   1   2   3   4

所以我们得到了异常

java.lang.StringIndexOutOfBoundsException: String index out of range: 4

【讨论】:

    【解决方案2】:

    问题出在这里:

    while (i <= arrNumberSequence.length){
    

    字符串“HACK”的长度是4。索引是0,1,2,3。 您的循环从 0 迭代到 4(包括 4),因此在最后一次迭代中,它调用了超出索引的 arrNumberSequence[4]。

    只需删除“=”就可以了:

    while (i < arrNumberSequence.length)
    

    【讨论】:

      【解决方案3】:

      改变这个:

       while (i <= arrNumberSequence.length)
      

      进入这个:

       while (i < arrNumberSequence.length)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-20
        • 1970-01-01
        • 2019-03-11
        • 2014-01-27
        • 2015-06-30
        • 2012-07-27
        • 2012-11-27
        相关资源
        最近更新 更多