字符串错误。 java.lang.StringIndexOutOfBoundsException(JAVA)

时间:2015-02-08 13:35:24

标签: java arrays string

抱歉我的英语。逐个字符地读取文件,您需要找到文件中的单词。一切似乎都很好,但是有一个错误 java.lang.StringIndexOutOfBoundsException 很可能它出现在这里int endWord = wordToFind.length();但是这个错误显示了IU需要的内容。如果我wordToFind.length() - 1,则错误消失。但是输出并不是我需要的。

private static String wordToFind = "one"; //word what i need find

public static void main(String[] args) throws FileNotFoundException, IOException{
    int endWord = wordToFind.length(); //size word, maby this error
    int startWord = 0; 
    String myWord = ""; // this value create word

    char[] barray = new char[1024]; //byte array

    try(BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("t.txt")))){ //read t.txt

        int value;
        while((value = reader.read(barray, 0, barray.length)) != -1) {

            for(int i = 0; i < value; i++){
                //check character
                if(wordToFind.charAt(startWord) == barray[i]){
                    startWord++;

                    if(startWord > endWord){
                        startWord = 0;
                        myWord = "";
                    }else{
                        myWord += barray[i];
                    }

                    if(startWord == endWord){
                        System.out.println(myWord);
                    } 
                }
            }
        }
    }catch(Exception e){
       System.out.println("Error : "+e);
    }
}
  

错误:java.lang.StringIndexOutOfBoundsException:字符串索引   范围:3

4 个答案:

答案 0 :(得分:1)

String有一个字符数组(由其支持),该字符数组将保存&#34; one&#34;内部为value[] = {'o', 'n', 'e'}

数组索引从0开始直到n-1,因此您可以查询0到2之间的值。现在在您的代码中,您有:

for(int i = 0; i < value; i++) {
if(wordToFind.charAt(startWord) == barray[i]){
    startWord++;
    if(startWord > endWord) {

现在假设您的for循环从0到5迭代,您将尝试:

i =0//iteration 1
if(wordToFind.charAt(0) == barray[i]){
    startWord++;// is now 1
    if(startWord > endWord) {//1>3 no

i =1//iteration 2
if(wordToFind.charAt(1) == barray[i]){
    startWord++;// is now 2
    if(startWord > endWord) {//2>3 no

i =2 //iteration 3
if(wordToFind.charAt(2) == barray[i]){
    startWord++;// is now 3
    if(startWord > endWord) {//3>3 no

i =3
if(wordToFind.charAt(3) == barray[i]){//see you are accessing charAt(3)
    startWord++;// is now 4
    if(startWord > endWord) {//4>3 yes

现在对于i为3,你试图从(String)中访问第3个元素,这个数组正在String中使用(它不存在),因此你得到了异常。

所以你应该改变你的状况

if(startWord > endWord) {

要:

if(startWord >= endWord) {

答案 1 :(得分:0)

这种错误主要是通过循环来完成的。它告诉你String太大而且不适合你的数组。或者您正在尝试读取不存在的char / string。

答案 2 :(得分:0)

endWord是您的单词的长度,但charAt(int)是从零开始的。这意味着你可以访问的最高索引是长度 - 1.所以如果你要说

String str = "abcd";
char ch = str.charAt(str.length());

这会引发异常,因为str.length()返回4,而索引的范围是0到3.

因此,在您的代码中,当您选中startWord > endWord时,这应该是startWord >= endWord。如果该检查成功,则startWord不能再用作索引,应重置。就目前而言,代码将一直运行到startWord等于endWord,这意味着它太高而不能用作索引,因此会引发异常。

答案 3 :(得分:0)

抛出异常
wordToFind.charAt(startWord)

因为startword等于wordToFind.length()。如果你看一下docs of charAt,你会发现这会引发一场惊悚。

我还删除了try catch块,以便您可以看到发生异常的位置以及整个异常堆栈跟踪。

此行将修复异常:

if(startWord&gt; = endWord){

我还修改了逻辑来打印我们找到的单词,这样就可以按照我的修改来修复异常。

这是你修改的代码:

private static String wordToFind = "mi6"; //word what i need find

public static void main(String[] args) throws FileNotFoundException, IOException {

    int endWord = wordToFind.length(); //size word, maby this error
    int startWord = 0;
    String myWord = ""; // this value create word
    char[] barray = new char[1024]; //byte array
    System.out.println("searching:"+wordToFind);
    BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("/home/bpgergo/Workspace/mi6-REST_API/handover/README.md"))); //read t.txt
    int value;
    while((value = reader.read(barray, 0, barray.length)) != -1) {

        for(int i = 0; i < value; i++) {
            if(wordToFind.charAt(startWord) == barray[i]){
                startWord++;
                myWord += barray[i];
                if(startWord >= endWord) {

                    System.out.println("Bingo:"+myWord);
                    startWord = 0;
                    myWord = "";
                } 
            }
        }
    }
}