Почему я получаю это исключение NullPointerException? - PullRequest
1 голос
/ 14 января 2010

У меня есть класс User, который содержит атрибуты: ник, 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();
    }
}

Однако, когда я запускаю его, я не могу получить список файлов. Выдает исключение:

Исключение в теме "главная" java.lang.NullPointerException на User.showTheList (User.java:35) at User.main (User.java:52) Результат Java: 1

Я знаю, что это, вероятно, крошечная ошибка, но я не могу ее исправить :( Пожалуйста, помогите.

Ответы [ 8 ]

6 голосов
/ 14 января 2010

listOfFiles как статическое поле должно быть инициализировано в статическом блоке, а не в конструкторе.

т.е.

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

или вы также можете инициализировать его на сайте самой декларации.

т.е.

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

В вашем коде вы не создаете никакой объект класса, и, следовательно, для ссылки listOfFiles никогда не назначается экземпляр ArrayList. Вот почему вы получаете NullPointerException.

5 голосов
/ 14 января 2010

ваша функция "showTheList" предполагает, что listOfFiles уже заполнен. Однако эта переменная не будет создана, пока вы не запустите конструктор User.

Практически не рекомендуется инициализировать статическую переменную внутри конструктора экземпляра. Если вы делаете это таким образом, неясно, кому принадлежат данные. В этом случае, поскольку listOfFiles зависит от состояния экземпляра User, он не должен быть статическим, и ваш вызов будет выглядеть как

 User u = new User(..., ..., ...);
 u.showTheList(); 
4 голосов
/ 14 января 2010

NullPointerException является наиболее распространенным исключением в Java. Вы должны научиться справляться с этим самостоятельно.

Это происходит, когда:

  • Вызов метода экземпляра нулевого объекта.
  • Доступ или изменение поля нулевого объекта.
  • Принимая длину нуля, как если бы это был массив.
  • Доступ или изменение пустых слотов, как если бы это был массив.
  • Бросить ноль, как если бы это было значение Throwable.

  • (не входит в документы) Распаковка пустого номера.

3 голосов
/ 14 января 2010

Вам нужно инициализировать listOfFiles

static ArrayList<String> listOfFiles = new ArrayList<String>();
1 голос
/ 14 января 2010

Я бы переписал весь класс следующим образом ( Код завершен - Глава 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();
}
}
1 голос
/ 14 января 2010

Полагаю, вы запускаете метод main в этом классе. В этом случае вы пропускаете вызов вашего конструктора.

1 голос
/ 14 января 2010

Похоже, listOfFiles не был инициализирован. Сначала вы должны либо создать нового пользователя, либо инициализировать и заполнить его статическим методом

1 голос
/ 14 января 2010

Попробуйте это:

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

}

Вы не указали никакого значения в showList, поэтому вы получаете NullPointerException. Кстати, мы обычно называем это просто NPE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...