1

我有一个包含属性的用户类:昵称、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();
    }
}

但是,当我运行它时,我无法获取文件列表。它抛出一个异常:

User.showTheList(User.java:35) 处的线程“main”java.lang.NullPointerException 中的异常在 User.main(User.java:52) Java 结果:1

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

4

8 回答 8

6

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

IE

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

或者您也可以在声明本身的位置对其进行初始化。

IE

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

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

于 2010-01-14T14:29:00.287 回答
5

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

作为一个实践点,在实例构造函数中初始化静态变量并不是一个好主意。如果您这样做,则不清楚数据属于谁。在这种情况下,由于 listOfFiles 取决于 User 实例的状态,它不应该是静态的,您的调用看起来更像

 User u = new User(..., ..., ...);
 u.showTheList(); 
于 2010-01-14T14:30:56.923 回答
4

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

它发生在:

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

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

于 2010-01-14T14:30:21.480 回答
3

你需要初始化listOfFiles

static ArrayList<String> listOfFiles = new ArrayList<String>();
于 2010-01-14T14:29:37.287 回答
1

试试这个:

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

}

您没有为 showList 赋予任何价值,这就是您得到NullPointerException. 顺便说一句,我们通常称之为NPE.

于 2010-01-14T14:28:03.800 回答
1

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

于 2010-01-14T14:30:49.780 回答
1

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

于 2010-01-14T14:31:33.667 回答
1

我会像这样重写整个类(代码完成- 第 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();
}
}
于 2010-01-14T14:53:53.353 回答