2010-01-14 4 views
1

У меня есть класс User, который содержит атрибуты: nickname, ipAddress, sharedFolder. Идея состоит в том, чтобы иметь пользователя с этими атрибутами и список файлов из общей папки.Почему я получаю это исключение NullPointerException?

Это мой код:

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) на User.main (User.java:52) Java Результат: 1

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

ответ

5

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

т.е.

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

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

т.е.

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

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

+0

Благодаря! Это было так очевидно :( Я должен серьезно поспать. 13 часов программирования прямо не в порядке – AmateurProgrammer

1

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

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

} 

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

+0

я попробовал, что в другом классе, который требует пользователя и создает новый, но он все равно не будет работать – AmateurProgrammer

3

Вы должны инициализировать listOfFiles

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

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

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

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

  • (не включен в документы) Снятие нулевого номера.

+3

* Unboxing null Number/Boolean. – BalusC

+0

yup. Это несчастливо не включено в документы – Bozho

+0

-1 Это не совсем ответьте на вопрос – nfechner

1

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

5

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

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

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

Спасибо, было также очень полезно – AmateurProgrammer

1

Я полагаю, вы работаете основной метод в этом классе. В этом случае вам не нужен вызов для вашего конструктора.

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(); 
} 
} 
+0

Спасибо, СООО, я попробую и подниму несколько подсказок :) – AmateurProgrammer

+0

Это замечательно. Я тестировал его, и он отлично работает :) Ты мужчина. спасибо – AmateurProgrammer

Смежные вопросы