2012-09-03 33 views
1

這是用於計算保齡球分數一個代碼,我需要幫助在定影此錯誤:在螺紋保齡球得分和異常處理

異常「主」 java.lang.StringIndexOutOfBoundsException:字符串索引超出範圍:0

這裏是我的輸入(我存儲在一個名爲bowling.txt的文本文件中)。

0 P 5 3 4 2 4 4 3 5 0 8 3 1 2 1 6 4 3 4

遊戲有10幀,每幀兩次嘗試,所以我認爲我需要20個數字(分數)的文本文件。

這裏是我所得到的:

The score is 66 
The score is 77 
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 2 
    at java.lang.String.charAt(Unknown Source) 
    at pin.main(pin.java:77) 

N.B:我會爲+1所有有用的答案!

import java.io.BufferedReader; 
import java.io.FileNotFoundException; 
import java.io.FileReader;  
import java.io.IOException;  

public class pin  
{ 
    static String tries;  
    public static int value(int index) 
    {  
     int i = 0; 
     if (tries.charAt(index) == 'T') 
      i = 10; 
     else if (tries.charAt(index) == 'P') 
      i =10 -(tries.charAt(index-2)-'0'); 
     else 
      i = tries.charAt(index)-'0' ; 
     return i; 
    } 

    public static void main(String[] args) throws FileNotFoundException, IOException  
    { 
     int score = 0;  
     int frameIndex;  
     int i = 0;  
     FileReader fr = new FileReader("C:/Users/PC4599/Desktop/programming/bowling.txt"); 
     BufferedReader br = new BufferedReader(fr); 
     tries = br.readLine(); 

     while (tries != null) 
     { 
      score = 0; 
      frameIndex = 0; 
      i = 0; 
      while (frameIndex != 10) 
      { 
       if (tries.charAt(i)=='T') //Strike 
       { 
        score =(score + 10 + value(i + 2) + value(i + 4)); 
        i = i + 2; 
       } 
       else if (tries.charAt(i+2)=='P') //Spare 
       { 
        score =(score + 10 + value(i + 4)); 
        i = i + 4; 
       } 
       else 
       { 
        score =(score + (tries.charAt(i)-'0') + (tries.charAt(i + 2)-'0'));//Neither Strike nor Spare 
        i = i + 4; 
       } 
       frameIndex = frameIndex + 1; 

      } 

      System.out.println("The score is "+score); 
      tries = br.readLine();  
     }  
     br.close();  
     fr.close();  
    }  
} 
+0

實際上,您需要21個數字,因爲如果您備用/打擊它,則可以在第十幀中投擲三次。此外,你應該閱讀關於得分的[一些文字](http://en.wikipedia.org/wiki/Bowling#Scoring),因爲如果你有打擊和備用,你會得到乘數以用於後面的投擲......並且你沒有'噸佔他們呢。 – brimborium

+0

你是對的,我沒有考慮到「第十幀,當你有權獲得3次嘗試」的情況。 – user1639637

回答

1

好像while (tries != null)循環正在運行三次。你的輸入文件可能在最後有一行,這可能只是空白。

鑑於數據輸入的格式,最小正確的分數線將有23個字符(12個空格分隔),因此您可以將該檢查更改爲while ((tries != null) && (tries.length() >= 23))之類的內容。這應該可以解決這個問題,無論如何,這似乎是一件非常合理的事情。 (如果我不記得如何正確評分保齡球,您可以進行適當的調整。)

+0

我同意David的觀點。看起來最後還有一個額外的'\ n'字符。 – MagikWorx

+0

你的回答很好!如果我有問題,我會回來的。 – user1639637