2014-03-31 55 views
1

因此,我有一個程序應該通過名爲dictionary.txt的文件並檢查輸入的單詞是否在字典文本文件中。檢查一個單詞是否在文本文件中

import java.io.File; 
import java.io.FileNotFoundException; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Scanner; 

public class Main { 


public static void main(String[] args){ 

    String word = null; 
    Scanner scan = new Scanner(System.in); 
    word = scan.nextLine(); 

    try { 
     if(isInDictionary(word, new Scanner(new File("dictionary.txt")))){ 
      System.out.println(word + " is in the dictionary"); 
     } else System.out.println(word + " is NOT in the dictionary"); 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

public static boolean isInDictionary(String word, Scanner dictionary){ 

    List<String> dictionaryList = new ArrayList<String>(); 
    for(int i = 0; dictionary.hasNextLine() != false; i++){ 
     ++i; 
     dictionaryList.add(dictionary.nextLine()); 
     if(dictionaryList.get(i) == word){ 
      return true; 
     } 
    } 

    return false; 

} 

} 

當我嘗試運行它,我得到這個錯誤:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 1 
at java.util.ArrayList.rangeCheck(ArrayList.java:635) 
at java.util.ArrayList.get(ArrayList.java:411) 
at io.github.mediocrelogic.checkDictionary.Main.isInDictionary(Main.java:34) 
at io.github.mediocrelogic.checkDictionary.Main.main(Main.java:19) 

我爲什麼在這裏接受IndexOutOfBoundsException異常?代碼沒有語法錯誤。 dictionary.txt文件大約是19.95mb,這就是爲什麼我收到此異常?

+0

「沒有語法錯誤」 的JVM說,有。 – aliteralmind

+1

@aliteralmind Pedantic:編譯器會捕獲語法錯誤,而不是JVM。 :) –

+0

JVM根據代碼中的錯誤報告了運行時錯誤。 OP是正確的,代碼的語法不是這個問題的根本原因。 –

回答

4

如果您在循環中刪除了雜散++i,它應該解決您的問題。

for(int i = 0; dictionary.hasNextLine() != false; i++){ 
    //++i; // <-- THIS SHOULD GO AWAY! 
    dictionaryList.add(dictionary.nextLine()); 
    if(dictionaryList.get(i) == word){ 
     return true; 
    } 
} 

你已經在你的for聲明遞增i。通過在循環內再次遞增它,i越過字典的末尾,因此是例外。

順便說一句,請參閱How do I compare strings in Java?,因爲您不想使用==來比較那裏的字符串。

+0

啊,那麼字典列表會變大一倍呢?謝謝! – user3479380

+0

@ user3479380不,它沒有。但是,索引的增長速度是詞典的兩倍,因此當您嘗試訪問字典中的索引時,您肯定會遇到超出界限的異常。我已經刪除了這個陳述,因爲它是爲了解釋,但它似乎誤導了你。 –

+0

@ user3479380您可能希望閱讀['ArrayList.get()']的文檔(http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#get(int )),這清楚地解釋了這種例外的含義。 –

4

請完整刪除代碼行++i;i已在for循環中增加。

+0

會做什麼,忘了那些小細節,因爲它最初是一個while循環。 – user3479380

2
for(int i = 0; dictionary.hasNextLine() != false; i++){ 
    ++i; 

之後代碼的計數器增加兩次,但在這之後

dictionaryList.add(dictionary.nextLine()); 

只是增加了一個ArrayList中這意味着你總是試圖從ArrayList的項目隨着我的指數等於到ArrayList的指數+ 1

您應該刪除此++我從你的代碼和它的將工作

你也可以得到更好的方法來搜索詞成使用正則表達式txt文件,並匹配對象

http://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html

或INDEXOF的伶俐搜索

http://www.homeandlearn.co.uk/java/indexOf.html

相關問題