1

ニックネーム、ipAddress、sharedFolderの属性を含むUserクラスがあります。アイデアは、これらの属性と共有フォルダーからのファイルのリストを持つユーザーを持つことです。

これは私のコードです:

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.NullPointerExceptionatUser.showTheList(User.java:35)at User.main(User.java:52)Java結果:1

私はそれがおそらく小さな小さな間違いであることを知っていますが、私はそれを修正できないようです:(助けてください。

4

8 に答える 8

6

listOfFiles静的フィールドであることは、コンストラクターではなく、静的ブロックで初期化する必要があります。

すなわち

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

または、宣言自体のサイトで初期化することもできます。

すなわち

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 の長さを配列であるかのように取得します。
  • 配列であるかのように null のスロットにアクセスまたは変更します。
  • Throwable 値であるかのように null をスローします。

  • (ドキュメントには含まれていません) null Number のボックス化を解除します。

于 2010-01-14T14:30:21.480 に答える
3

初期化する必要がありますlistOfFiles

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

listOfFiles が初期化されていないようです。最初に新しいユーザーを作成するか、初期化して静的メソッドに入力する必要があります

于 2010-01-14T14:30:49.780 に答える
1

このクラスで main メソッドを実行していると思います。その場合、コンストラクターへの呼び出しがありません。

于 2010-01-14T14:31:33.667 に答える
1

これを試して:

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

}

showList に値を入力していないため、NullPointerException. ところで、私たちは通常それを単に と呼んでいますNPE

于 2010-01-14T14:28:03.800 に答える
1

クラス全体を次のように書き直します ( Code Complete - Chapter 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 に答える