字符串索引超出范围:7错误

时间:2014-10-31 21:07:36

标签: java

您好我正在编写一个代码,要求用户提供推文,然后告诉用户推文是否正确长度以及有多少#' s和它,但每次我运行这个我得到错误字符串索引或范围:7。任何想法?

import java.util.Scanner;
import java.lang.Math; 

class Main {
    public static void main(String[] args)
    {
        Scanner scan = new Scanner (System.in);
        System.out.println ("Please enter a tweet: ");
        String tweet = scan.nextLine();

        int hashtags = 0;
        int attributions = 0;
        int links = 0;


        if (tweet.length() > 140) {
          int excess = tweet.length()-140;
          System.out.println ("Excess Characters: " + excess);
        } else {
          System.out.println ("Length Correct.");
          while (tweet.length() <= 140) {
            if (tweet.charAt(0) == '#'){
              hashtags ++;
            }
            if (tweet.charAt(0) == '@'){
              attributions ++;
            }
            if (tweet.substring(0,8) == "http://") {
              links ++;
            }
            tweet = tweet.substring(1);
            }
          System.out.println ("Number of Hashtags: " + hashtags);
          System.out.println ("Number of Attributions: " + attributions);
          System.out.println ("Number of Links: " + links);
        }
    }
}

3 个答案:

答案 0 :(得分:1)

至少有两个问题。首先,你不应该在一个太短的字符串上使用substring。使用String.startsWith

要好得多
if (tweet.startsWith("http://")) ...

这样您就不必担心担心字符串的长度,或者让您的字符数错误,或者因为您使用==而不是{{ 3}}: - )


其次,关于以下代码:

while (tweet.length() <= 140) {
    :
    tweet = tweet.substring(1);
}

一旦你的字符串为空,这将保持,只是因为零(以及每个负数)小于140。

当然,在空字符串上执行tweet.charAt(0)之类的操作会给您带来一些问题,类似于您对substring的使用。您需要重新检查循环的终止条件,使其类似于:

while (tweet.length() > 0) {

答案 1 :(得分:0)

第一个问题是你在不知道推文有多长的情况下试图获得推文字符串的8长子字符串。如果推文只有6个字符怎么办?如果是,则会得到索引超出范围的异常,因为您正在查看数组结束的两个索引。

你应该添加一个条件守卫:

if (tweet.length() >= 8 && tweet.substring(0,8).equals("http://")) {
    links++;
}

&amp;&amp;运算符意味着如果字符串的长度小于8,则永远不会检查tweet.substring(),因此您可以避免跳出界限。

第二个问题是,即使你添加了那个条件守卫,你所做的事也没有任何意义。 substring返回的字符串长度(beginIndex,endIndex)等于endIndex - beginIndex,在这种情况下为8。字符串&#34; http://&#34;只有七个字母,所以它在逻辑上不可能使8个字符的字符串永远等于它。使用startsWith()函数代替0位置的子字符串:

之前的行应如下所示:

if (tweet.startsWith("http://")) {
    links++;
}

答案 2 :(得分:-1)

你肯定应该使用for循环:

String string= "hello";
for (int i = 0; i < string.length(); ++i)
{
    if (string.charAt( i ) == '#')
    {
        //do something
    }
}

这将确保您正确遍历整个字符串。

其次,在假设之前,您需要确保子串(0,8)是先进的。这可能是在某些测试用例中导致错误的原因。