2010-01-14 121 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