2014-10-12 88 views
0

該程序看起來稍微先進;不是這樣。簡單的數組操作。 該程序編譯正確,但是,它遇到異常運行時。Nullpointer異常java運行時

Exception in thread "main" java.lang.NullPointerException 
at Ordliste.leggTilOrd(Tekstanalyse.java:85) 
at Tekstanalyse.main(Tekstanalyse.java:23) 

所以if(s.equalsIgnoreCase(ordArray [k]))有問題。 我看不出爲什麼。它甚至提供了正確的輸出。

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

public class Tekstanalyse { 
    public static void main(String[] args) throws FileNotFoundException { 

     Ordliste ol = new Ordliste(); 
     ol.lesBok("scarlet.text"); 
     ol.leggTilOrd("A"); 
    } 
} 

class Ordliste { 
    private int i = 0; 
    private String[] ordArray = new String[100000]; 
    private int antForekomster; 
    private int arrStorrelse = 0; 

    public void lesBok(String filnavn) throws FileNotFoundException { 

     File minFil = new File(filnavn); 
     Scanner scan = new Scanner(minFil); 

     while (scan.hasNextLine()) { 
      ordArray[i] = scan.nextLine(); 
      //System.out.println(ordArray[i]); 
      i++; 
      arrStorrelse++; 
     } 
     System.out.println("Array size: " + arrStorrelse + " Capacity: " + ordArray.length); 
    } 

    public void leggTilOrd(String s) { 

     for (int k = 0; k < ordArray.length; k++) { 
      if (s.equalsIgnoreCase(ordArray[k])) { 
       antForekomster++; 
       System.out.println("Den har vi sett for!"); 
      } else { 
       s = ordArray[arrStorrelse]; 
      } 
     } 
    } 
} 
+1

您可以在自己的代碼中使用任何代碼格式/縮進,但在詢問其他人的幫助時,請花時間合理地設置代碼的格式。這次我爲你做了這個(並且從最後加了兩個缺失的'}' - 如果它們不在你的真實代碼中,使用「編輯」鏈接去除它們,但是當然你會有編譯錯誤)。 – 2014-10-12 11:39:16

回答

0

我敢肯定的錯誤就在這裏:

for (int k = 0; k < ordArray.length; k++) { 
    if (s.equalsIgnoreCase(ordArray[k])) { 
     antForekomster++; 
     System.out.println("Den har vi sett for!"); 
    } else { 
     s = ordArray[arrStorrelse]; // <- dangerous 
    } 
} 

正如我在評論說,ordArray可能包含null元素;如果讀文本文件不包含100.000行文字。如果是這種情況,則上面的行會將null寫入s,因爲s.equalsIgnoreCase(null)爲false。

您應該考慮使用列表而不是數組。

private List<String> ordList = new ArrayList<String>(); 

(或使用不同的變量名,它是由你)

然後你就可以添加新條目使用ordList.add(scan.nextLine());列表。此列表不包含任何null元素,您提到的問題應該消失。

0

我強烈建議你簡單地使用調試器來調試你的代碼,但是這裏是: 在你的lesBok方法中,你用字符串填充你的數組,並做一個計數器arrStorrelse。是你所做的數組中元素的數量。但是數組填充索引0到n-1。並且arrStorrelse等於N,但是您仍然在數組中爲此分配空間。所以當leggTilOrd()你迭代在第一時間和您進入else子句你這樣做

for (int k = 0; k < ordArray.length; k++) { 
      if (s.equalsIgnoreCase(ordArray[k])) { 

       antForekomster++; 
       System.out.println("Den har vi sett for!"); 
      } 

      else { 
       int arrStorrelse2=arrStorrelse; 
       s = ordArray[arrStorrelse]; 

      } 
在else子句小號

設置爲ordArray [arrStorrElse]然而arrStorrElse在這個時候比你的數組的最後一個初始化元素高一個。所以它將s設置爲空指針。 那麼你的循環的下一次迭代中的if語句

if (s.equalsIgnoreCase(ordArray[k])) { 

        antForekomster++; 
        System.out.println("Den har vi sett for!"); 

的s.equalsIgnoreCase()調用一個S是空這就是空指針異常來源於完成。

你需要改變你還沒有解釋arrStorrElse分配它應該做的,所以我不能爲你做的還嘗試學習如何在這裏調試你的代碼是一個有用的鏈接:

http://www.tutorialspoint.com/eclipse/eclipse_debugging_program.htm

0

我編譯並測試了你的代碼。

s.equalsIgnoreCase(null) 

throws nullPointerException。

也許你應該嘗試使用ArrayList而不是Array來避免遍歷空值。

+0

如果's'不爲null,則此行不會拋出NPE。 – Tom 2014-10-12 12:06:27

+0

@Tom這是正確的,但在給定的代碼中's'可以是'null'(通過在'else'分支中給出的代碼) – 2014-10-12 12:36:49

+0

@StefanFreitag我知道(見我的答案)。他發佈的代碼不會像他說的那樣拋出異常。他的代碼暗示空論證導致NPE。 – Tom 2014-10-12 12:37:54

0

我花了一些時間來弄清楚爲什麼會發生NullPointerException和我有彼得和湯姆同意:將NPE由線

s.equalsIgnoreCase(ordArray[k]) 

,並在你的代碼的副作用引起的。通過重新分配參數s中的else分支引入此副作用至null(此值來自ordArray[arrStorrelse])。在此之後重新分配發生了,你就會有這樣的事情:

null.equalsIgnoreCase(ordArray[k]) 

瞧,有NullPointerException