Java:线程“main”中的exceptionjava.lang.StringIndexOutOfBoundsException:字符串索引超出范围:

我是初学者,任何人都可以帮我弄清楚我们在做什么。 我试图读取一个String并将String的每个字符存储在一个数组中。

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++; } } } 

OUTPUT

输入要反向排序提取和垂直显示的字符串:

HACK

用户输入字符串是:HACK

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

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’

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

问候

Dwenish

对于字符串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 

问题出在这里:

 while (i <= arrNumberSequence.length){ 

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

只需删除'='就可以了:

 while (i < arrNumberSequence.length) 

改变这个:

  while (i <= arrNumberSequence.length) 

进入这个:

  while (i < arrNumberSequence.length)