我有一个包含属性的类User:nickname,ipAddress,sharedFolder.我们的想法是让拥有这些属性的用户和来自共享文件夹的文件列表.
这是我的代码:
import java.io.*; import java.util.*; public class User { String nickname; String ipAddress; static ArrayListlistOfFiles; 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 (); 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.main中的User.showTheList(User.java:35)中的线程"main"java.lang.NullPointerException中的异常(User.java:52)Java结果:1
我知道这可能是一个小小的错误,但我似乎无法解决它:(请帮忙.
listOfFiles
作为静态字段应该在静态块中初始化,而不是构造函数.
即
static{ listOfFiles = new ArrayList(); }
或者你也可以在声明本身的网站上初始化它.
即
static ArrayListlistOfFiles = new ArrayList ();
在您的代码中,您不是在创建类的任何对象,因此listOfFiles
永远不会为引用分配ArrayList
实例.这就是你得到一个原因的原因NullPointerException
.
你的"showTheList"函数假设已经填充了listOfFiles.但是,在运行User构造函数之前,不会创建该变量.
作为一种实践,在实例构造函数中初始化静态变量不是一个好主意.如果以这种方式进行,则不清楚数据属于谁.在这种情况下,由于listOfFiles依赖于User实例的状态,因此它不应该是静态的,并且您的调用看起来更像
User u = new User(..., ..., ...); u.showTheList();