2016-03-30 58 views
0

現在做我的AP計算機科學家庭作業,但我堅持運行時錯誤。有人知道我的代碼有什麼問題嗎? 程序工作正常上Dr.Java但它顯示了在edhesive我的網站上測試運行時錯誤...爲什麼我得到運行時錯誤:StringIndexOutOfBounds?

class Main{ 

public static void main (String str[]) throws IOException { 
    Scanner scan = new Scanner(System.in); 

    System.out.println("Please enter a tweet:"); 
    String tweet = scan.nextLine(); 

    int hash = 0; 
    int attr = 0; 
    int link = 0; 
    int ch = 0; 
    if(tweet.length()>140) 
    { 
    System.out.println("Excess Characters: " + (tweet.length() - 140)); 
    } 

    else 
    { 
    tweet=tweet.toLowerCase(); 
    System.out.println("Length Correct"); 


    for(ch=0; ch<tweet.length(); ch++) 
    { 
    if(tweet.charAt(ch) == '#' && ((ch++)<=(tweet.length())) && (tweet.charAt(ch++)!=' ' && tweet.charAt(ch++)!='\t')) 
    { 
    hash++; 
    } 
    if(tweet.charAt(ch) == '@' && ((ch++)<=(tweet.length())) && (tweet.charAt(ch++)!=' ' && tweet.charAt(ch++)!='\t')) 
    { 
    attr++; 
    } 
    if(tweet.charAt(ch) == 'h' && ((ch + 7)<=(tweet.length()))) 
    { 
    String a = new String("http://"); 
    String sub = new String(tweet.substring(ch, ch + 7)); 
    if (sub.equals(a)) 
    {link++;} 
    } 



    } 

    System.out.println("Number of Hashtags: " + hash); 
    System.out.println("Number of Attributions: " + attr); 
    System.out.println("Number of Links: " + link); 

    } 

} 
} 
+1

什麼布爾函數'(ch ++)<=(tweet.length())'當tweet只包含'#','@'或'h'時返回?接下來的檢查 - tweet。 charAt(ch ++)!=''' - 會拋出接收到的異常。'tweet.charAt(ch ++)'拋出異常。 –

+0

什麼樣的輸入String得到運行時錯誤?能否告訴我更多細節?運行你r程序,這是工作。也許IDE問題... – Alice

+0

@Alice嘗試運行程序,只輸入'#'或'@'。 –

回答

1

由於ch++ ch的值是越來越檢查這個條件(ch++)<=(tweet.length())後遞增。

說明:

if(tweet.charAt(ch) == '#' && ((ch++)<=(tweet.length())) && (tweet.charAt(ch++)!=' ' && tweet.charAt(ch++)!='\t')) 
    { 
    hash++; 
    } 

對於上面的代碼有4個條件(對於i = 0):

  1. tweet.charAt(CH)CH = 0
  2. ((CH ++)< =(tweet.length()))ch = 0,但是ch ++所以在條件檢查之後這個值會被增加。 。
  3. (tweet.charAt(CH ++)CH = 1(監守第2號點)的
  4. tweet.charAt(CH ++)CH = 2(出於同樣的原因)

試試:

class Main{ 

public static void main (String str[]) throws IOException { 
    Scanner scan = new Scanner(System.in); 

    System.out.println("Please enter a tweet:"); 
    String tweet = scan.nextLine(); 

    int hash = 0; 
    int attr = 0; 
    int link = 0; 
    int ch = 0; 
    if(tweet.length()>140) 
    { 
    System.out.println("Excess Characters: " + (tweet.length() - 140)); 
    } 

    else 
    { 
    tweet=tweet.toLowerCase(); 
    System.out.println("Length Correct"); 


    for(ch=0; ch<tweet.length(); ch++) 
    { 
    if(tweet.charAt(ch) == '#' && ((ch+1)<(tweet.length())) && (tweet.charAt(ch+1)!=' ' && tweet.charAt(ch+1)!='\t')) 
    { 
    hash++; 
    } 
    if(tweet.charAt(ch) == '@' && ((ch+1)<(tweet.length())) && (tweet.charAt(ch+1)!=' ' && tweet.charAt(ch+1)!='\t')) 
    { 
    attr++; 
    } 
    if(tweet.charAt(ch) == 'h' && ((ch + 7)<(tweet.length()))) 
    { 
    String a = new String("http://"); 
    String sub = new String(tweet.substring(ch, ch + 7)); 
    if (sub.equals(a)) 
    {link++;} 
    } 



    } 

    System.out.println("Number of Hashtags: " + hash); 
    System.out.println("Number of Attributions: " + attr); 
    System.out.println("Number of Links: " + link); 

    } 

} 
} 
+0

您的代碼對於長度爲1的推文失敗,例如,只有'#'或'@'的推文會拋出索引超出限制例外。當ch = 0時,由於推文的長度爲1,所以ch + 1 <= tweet.length'和'tweet.charAt(ch + 1)'拋出異常。 –

+0

thnx ..我編輯了答案。 –

+0

是的。這很好。原來我對ch ++和ch + 1感到困惑,但現在很清楚。非常感謝:) –

相關問題