为什么我会得到这个NullPointerException?

时间:2010-01-14 14:26:03

标签: java nullpointerexception

我有一个包含属性的类User:nickname,ipAddress,sharedFolder。我们的想法是让拥有这些属性的用户和来自共享文件夹的文件列表。

这是我的代码:

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

我知道这可能是一个小小的错误,但我似乎无法解决它:( 请帮忙。

8 个答案:

答案 0 :(得分:6)

作为静态字段的

listOfFiles应该在静态块中初始化,而不是构造函数。

即。

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

或者您也可以在声明本身的网站上初始化它。

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

在您的代码中,您没有创建该类的任何对象,因此永远不会为listOfFiles引用分配ArrayList实例。这就是你获得NullPointerException的原因。

答案 1 :(得分:5)

你的“showTheList”函数假设已经填充了listOfFiles。但是,在运行User构造函数之前,不会创建该变量。

作为一种实践,在实例构造函数中初始化静态变量不是一个好主意。如果以这种方式进行,则不清楚数据属于谁。在这种情况下,由于listOfFiles依赖于User实例的状态,因此它不应该是静态的,并且您的调用看起来更像

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

答案 2 :(得分:4)

NullPointerException是Java中最常见的例外。你应该学会自己应对它。

发生在:

  • 调用null对象的实例方法。
  • 访问或修改空对象的字段。
  • 将null的长度视为数组。
  • 访问或修改null的插槽,就像它是一个数组一样。
  • 抛出null,就好像它是一个Throwable值。

  • (未包含在文档中)取消装箱空号码。

答案 3 :(得分:3)

您需要初始化listOfFiles

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

答案 4 :(得分:1)

试试这个:

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

}

您没有为showList添加任何值,这就是您获得NullPointerException的原因。顺便说一句,我们通常称之为NPE

答案 5 :(得分:1)

看起来listOfFiles尚未初始化。 您必须先创建一个新用户,或者在静态方法中初始化并填充它

答案 6 :(得分:1)

我想,您正在运行此类中的main方法。在这种情况下,您错过了对构造函数的调用。

答案 7 :(得分: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();
}
}