2010-01-14 123 views
1

我有一個類包含屬性的用戶:暱稱,ipAddress,sharedFolder。這個想法是讓用戶擁有這些屬性和來自共享文件夾的文件列表。爲什麼我得到這個NullPointerException?

這是我的代碼:

import java.io.*; 
import java.util.*; 

public class User { 

    String nickname; 
    String ipAddress; 
    static ArrayList<String> listOfFiles; 
    File sharedFolder; 
    String fileLocation; 

    public User(String nickname, String ipAddress, String fileLocation) { 

     this.nickname = nickname.toLowerCase(); 
     this.ipAddress = ipAddress; 
     sharedFolder = new File(fileLocation); 

     File[] files = sharedFolder.listFiles(); 
     listOfFiles = new ArrayList<String>(); 

     for (int i = 0; i < files.length; i++) { 
      listOfFiles.add(i, files[i].toString().substring(fileLocation.length())); 
     } 
    } 

    public static void showTheList() { 
     for (int i = 0; i < listOfFiles.size(); i++) { 
      System.out.println(listOfFiles.get(i).toString()); 
     } 
    } 

    @Override 
    public String toString() { 
     return nickname + " " + ipAddress; 
    } 

    public static void main(String[] args) { 
     showTheList(); 
    } 
} 

然而,當我運行它,我不能得到的文件列表。它拋出一個異常:

異常線程 「main」 顯示java.lang.NullPointerException 在User.showTheList(User.java:35) 在User.main(User.java:52)Java結果: 1

我知道這可能是一個小小的錯誤,但我似乎無法修復它:( 請幫

回答

5

listOfFiles是一個靜態字段,應該在靜態塊中初始化,而不是構造函數。

static{ 
    listOfFiles = new ArrayList<String>(); 
} 

,或者您也可以在聲明本身的網站進行初始化。

static ArrayList<String> listOfFiles = new ArrayList<String>(); 

在代碼中,你是不是創建類的任何對象,因此listOfFiles引用從未分配一個ArrayList實例。這就是你得到NullPointerException的原因。

+0

其他類謝謝!這是如此明顯:( 我得小心翼翼地睡個好覺,直接編程13小時不好 – AmateurProgrammer 2010-01-14 14:37:28

1

試試這個:

public static void main(String[] args) { 
    new User(..., ..., ...); 
    showTheList(); 

} 

你沒有給showList添加任何值,這就是爲什麼你得到NullPointerException。順便說一句,我們通常稱之爲NPE

+0

我想,在要求用戶,並創建一個新的,但它仍然無法工作 – AmateurProgrammer 2010-01-14 14:32:57

3

需要初始化listOfFiles

static ArrayList<String> listOfFiles = new ArrayList<String>(); 
3

NullPointerException是在Java中最常見的異常。你應該學會自己應付它。

  • 調用一個空對象的實例方法:

    它時發生。

  • 訪問或修改空對象的字段。
  • 將null的長度當作數組。
  • 訪問或修改null的插槽,就好像它是一個數組。
  • 將null作爲Throwable值拋出。

  • (未包含在文檔中)取消裝箱空號碼。

+3

*取消裝箱空號/布爾值 – BalusC 2010-01-14 14:32:06

+0

是這樣,這是不幸的不包括在文檔中 – Bozho 2010-01-14 14:33:12

+0

-1這不是真的回答這個問題, – nfechner 2010-01-14 14:34:01

1

看起來像listOfFiles尚未初始化。 你必須先創建一個新的用戶,或者初始化並用靜態方法填充它

5

你的「showTheList」函數假定listOfFiles已經被填充了。但是,只有在運行User構造函數之前,纔會創建該變量。

作爲一個練習點,在實例構造函數中初始化一個靜態變量並不是一個好主意。如果你這樣做,目前還不清楚數據屬於誰。在這種情況下,由於listOfFiles取決於用戶實例的狀態,它不應該是一成不變的,您的通話將看起來更像

User u = new User(..., ..., ...); 
u.showTheList(); 
+0

謝謝,這也是非常有幫助 – AmateurProgrammer 2010-01-14 14:40:12

1

我想,你正在運行在這個類的主要方法。在這種情況下,你錯過了對你的構造函數的調用。

1

我會改寫這樣整個班級(Code Complete - 第7章):

import java.io.File; 
import java.util.ArrayList; 

public class User { 

private String nickname; 
private String ipAddress; 
private String sharedFolder; 

public User(String nickname, String ipAddress, String sharedFolder) { 
    //TODO do some params check 
    this.nickname = nickname.toLowerCase(); 
    this.ipAddress = ipAddress; 
    this.sharedFolder = sharedFolder; 
} 

public void showFiles() { 
    ArrayList<String> listOfFiles = this.retrieveFileNames(); 
    for (String fileName : listOfFiles) { 
     System.out.println(fileName); 
    } 
} 

private ArrayList<String> retrieveFileNames() { 
    File folder = new File(this.sharedFolder); 
    File[] files = folder.listFiles(); 
    ArrayList<String> listOfFiles = extractFileName(files); 
    return listOfFiles; 
} 

private ArrayList<String> extractFileName(File[] files) { 
    ArrayList<String> listOfFiles = new ArrayList<String>(); 
    for (int i = 0; i < files.length; i++) { 
     listOfFiles.add(i, files[i].getPath().substring(
       sharedFolder.length() + 1)); 
    } 
    return listOfFiles; 
} 

public String toString() { 
    return nickname + " " + ipAddress; 
} 

public static void main(String[] args) { 
    User user = new User("tom", "127.0.0.1", "/tmp"); 
    user.showFiles(); 
} 
} 
+0

謝謝SOOO很多,我會試試看,並拿起一些提示:) – AmateurProgrammer 2010-01-14 15:10:06

+0

這是偉大的。我測試了它,它工作正常:) 你是男人。謝謝 – AmateurProgrammer 2010-01-14 15:22:17

相關問題