我有一个包含属性的类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
我知道这可能是一个小小的错误,但我似乎无法解决它:( 请帮忙。
答案 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,就好像它是一个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();
}
}