2013-11-04 45 views
2

好吧。我有一個try-catch塊,沒有問題,但是當我導入文本文件的第一行時,它說String index超出範圍:33。字符串索引超出範圍,來自文件的字符串輸入

該行是「牙醫拉出我的牙齒」 我正在做的是使用for循環來評估一行中的每個字符,直到我們到達所述行的末尾。如果該字符是元音,則增加元音整數。否則,如果它是一個空格,那麼我將空格改爲波浪號(〜)。我想知道的是爲什麼它說我的字符串超出範圍,我將如何將文本行中的空格從文件更改爲代字號。我可以自己把它輸出到不同的文件(這是我必須做的)。我只是爲什麼說它超出範圍而感到困惑。下面我粘貼了我的整個程序。

該程序的目標是評估一個文本文件,逐字符,並計數元音的數量。此外,我必須更改任何空格以便翻轉,然後重新輸出到不同的文本文件。

的代碼如下:

import java.io.File; 
import java.util.Scanner; 
import java.io.IOException; 
import java.io.FileWriter; 

public class Vowels { 

    public static void main(String[] args) { 
     Scanner inFile; 
     File dentist = new File("poetry.txt"); 
     int vowels = 0; 

     try { 

      for (int i = 0; i >= 0; i++) { 
       inFile = new Scanner(new File("poetry.txt")); 
       String str1 = inFile.nextLine(); 
       for (int a = 0; a >= 0; a++) { 

        String start; 
        start = str1.substring(a, a + 1); 

        if (start.equalsIgnoreCase("a") == true) 
         vowels++; 
        else if (start.equalsIgnoreCase("e") == true) 
         vowels++; 
        else if (start.equalsIgnoreCase("i") == true) 
         vowels++; 
        else if (start.equalsIgnoreCase("o") == true) 
         vowels++; 
        else if (start.equalsIgnoreCase("u") == true) 
         vowels++; 
        else if (start.equalsIgnoreCase(" ")) 
         start = " "; 

       } 
      } 
     } catch (IOException i) { 
      System.out.println("Error"); 
     } 

    } 
} 
+1

你有調試過這個問題嗎? –

+0

您正在for循環內打開文件...我不認爲這是個好主意。 – SuperPrograman

+0

作爲提示,您可能需要考慮您正在使用什麼條件來結束for循環。 – SimonC

回答

1

這段代碼有幾件事情正在進行。

for(int i = 0; i>=0; i++){ 
inFile = new Scanner(new File("poetry.txt")); 
String str1 = inFile.nextLine(); 
  1. 也就是說將循環幾乎2^32/2 - 1次。
  2. 每次都會創建一個新的掃描儀對象。
  3. 您正在閱讀的第一次,每次。

    for(int a = 0; a >= 0; a++) { 
        String start; 
        start = str1.substring(a, a + 1); 
    } 
    
  4. 這將再次循環2^32/2 - 1次。

    由於str1不像變量'a'那樣大,所以它崩潰了。你需要使這個環路

    for(int a = 0; a < (str1.length() - 1); a++) { 
        String start = str1.substring(a, a + 1); 
    } 
    

這應該八九不離十解決您的問題。

+0

我做了你所說的 - 但缺少的一件事就是退出。出於某種原因,我認爲a是無限遞增的,並且沒有限制,因爲str1字符串有問題。我打印出文本文件的第一行,這是正確的,只是我認爲它不會移動到下一個字符。我認爲它或者卡在那裏,或者不認識str1.length()的限制@lead_the_zeppelin – allenlistar

2

你應該花new Scanner圈外,然後改變你的循環來while(inFile.hasNextLine()) ...你不使用「我」的說法。

此外,你的內循環將永遠不會結束,這就是爲什麼你會得到一個索引異常。取而代之的是a>=0,用a<str1.length()代替。

str1.charAt(a)替換子串的東西,然後使用簡單的==比較該字符(不是字符串)與單引號的字符...'a','e','i'等。 char是一個本地數據類型,所以你可以做Character.toLowerCase(start) == 'a'注意我比較之前強制字符小寫,這代替了「忽略大小寫」。但是,如果您只是說start = Character.toLowerCase(start),則不必每次都執行Character.toLowerCase

+0

這些都是很好的建議,但不解釋問題的根源以及如何解決問題。 –

+0

添加了關於您正在獲取的實際錯誤的提及。製作一個子字符串並嘗試訪問「a + 1」是爲了解決問題並且不必要。 – sdanzig

0

您可以通過使用

String STR_VOWELS = "aeiou"; 
if(STR_VOWELS.contains(start)) { 
    vowels++; 
} else if (start.equals(" ")) { 
    // you can remove this else as well, as you are not doing any thing different here. 
    start = " "; 
} 

希望這有助於破除長期的if-else結構。

0

嘗試用下面的代碼替換第二個for循環,這將解決您的問題

String str1 = inFile.nextLine(); 
      for(int a = 0; a < str1.length()-1; a++){ // a< string.length() otherwise exception will occur 
+0

我採納了你的建議....雖然現在發生了什麼事情(我在if語句之前放置了SOP語句以查看發生了什麼)是有一個無限循環...也許這是因爲當我試圖比較字母,我從來沒有告訴它何時停止... @Dark Knight – allenlistar

+0

它應該是'a

+0

仍然運行一個無限循環 - 閱讀上面 - 我認爲它是因爲我從來沒有告訴它什麼時候停止......它應該停在線的末尾。 – allenlistar

0

對於更換空白, 當你在爲一個字符串輸入然後只需使用

String my_new_str = my_str.replaceAll(" ", "~"); 

然後回寫到文件

String replace

相關問題