线程“main”中的异常java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:269

时间:2017-03-26 17:40:22

标签: java

我正在编写一个计算文本文件中单词数量的程序,但只计算其中包含2个以上字符的单词。它之前工作正常,但突然间我收到了错误

  

线程“main”中的异常java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:269?

有人可以帮忙吗?

import java.io.*;

class count_words {

    public static int countWords(String str)
    {
        int count = 1, num_of_letters = 0, final_count=1;

        for (int i=0;i<=str.length()-1;i++)
        {
            if (str.charAt(i) == ' ' && str.charAt(i+1)!=' ')
            {
                if(num_of_letters <= 2)
                {
                    count --;
                }

                System.out.println("count is " + num_of_letters);
                num_of_letters = 0;
                count++;
            }
            else if(str.charAt(i) == ',')
            {
                num_of_letters --;
            }
            else
            {
                num_of_letters++;
            }
        }

        return count;
    }

    public static void main(String[] args){

        //name of file to open
        String fileName = "/Users/Chris/Desktop/comp 1 McPhee.txt";
        //reference one line at a time
        String line = null;
        int num;

        try 
        {
            //Filereader reads text file in the default encoding.
            FileReader filereader = new FileReader(fileName);
            BufferedReader bufferedreader = new BufferedReader(filereader);

            while ((line = bufferedreader.readLine()) != null) 
            {
                num = countWords(line);
                System.out.println(num);
            }
        } 

        //Always close file
        catch(FileNotFoundException ex)
        {
            System.out.println("Unable to open file '" + fileName + "'");
        }

        catch(IOException ex)
        {
            System.out.println("Error reading file '" + fileName + "'");
        }
    } 
}

2 个答案:

答案 0 :(得分:0)

问题的根源在这里。

<fieldset class="form-group">
    <legend>Rating system</legend>
    <div class="form-check" *ngFor="let rating of ratingSystem">
      <label class="form-check-label" (mouseenter)="currentRatingId = rating.id">
        <input 
          type="radio" 
          class="form-check-input" 
          name="ratingsRadio" 
          [value]="rating.id"
          [(ngModel)]="movie.rating.id"
          required
          />
        {{rating.short_tag}}
      </label>
      <small [hidden]="currentRatingId !== rating.id">  &nbsp; &ndash; &nbsp; {{rating.description}}</small>
    </div>
  </fieldset>

因为你让我一直走到str.length() - 1,str.charAt(i + 1)将超过最后一个索引位置。

单词&#34;拍摄&#34;

str.length()= 5;

指数位置0-4。

当我是4时,src.charAt(i + 1)将为5。

我认为这会解决它。

public static int countWords(String str)
{
  int count = 1, num_of_letters = 0, final_count=1;

  for (int i=0;i<=str.length()-1;i++)
  {
    //This line
    if (str.charAt(i) == ' ' && str.charAt(i+1)!=' ')

答案 1 :(得分:0)

因为使用str.charAt(i + 1)!=''而得到异常。如果i为0且字符串的长度为1,则i + 1将尝试在位置1处找到将抛出异常的元素。您可能需要添加条件以检查i之前是否小于(数组-1的长度)。