2

次の2つのクラスがあります。

import java.io.*;
import java.util.*;

public class User {

    public static String nickname;
    public static String ipAddress;
    public static ArrayList<String> listOfFiles;
    public static File sharedFolder;
    public static String fileLocation;

    public User(String nickname, String ipAddress, String fileLocation) {

        this.nickname = nickname.toLowerCase();
        this.ipAddress = ipAddress;

        Scanner userTyping = new Scanner(System.in);
        fileLocation = userTyping.nextLine();

        sharedFolder = new File(fileLocation);

    }

    public static List<String> fileList() {

        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()));
            System.out.println(listOfFiles.get(i));

        }

       return listOfFiles;

    }

    @Override
    public String toString() {
        return nickname + " " + ipAddress;
    }



}

そして次のもの:

import java.util.*;


public class UserCollector {

    static List<User> allUsers;

    public static void addUserToTheList() {

        Scanner keyboardInput = new Scanner(System.in);

            System.out.println("Type nickname: ");
        String nickname = keyboardInput.nextLine();
            System.out.println("Type IP: ");
        String ipAddress = keyboardInput.nextLine();
            System.out.println("Type File Location: ");
        String fileLocation = keyboardInput.nextLine();

        System.out.println("User that is attempting to log in is: "+ nickname + " and his IP is: " + ipAddress);

        User inputUser = new User(nickname, ipAddress, fileLocation);

        allUsers = new ArrayList<User>();

        if (keyboardInput.nextLine().equalsIgnoreCase("INSERT") && !allUsers.contains(inputUser)) {

            allUsers.add(inputUser);
            System.out.println("User has been successfully added to your list.");
        }
        else
            System.out.println("This user already exists on the list!");

    }

    public static void currentStateOfTheList() {

        for (User u : allUsers) {
               System.out.println("nick: "+u.nickname +", ip: "+ u.ipAddress );
           }

    }

    public static void main(String[] args) {

        UserCollector.addUserToTheList();
        UserCollector.currentStateOfTheList();

    }

}

これで、addUserToTheList()メソッドのアイデアは単純です。UserタイプのオブジェクトをArrayListに追加します。また、コンソールにニックネーム、ipAddress、fileLocationを入力してください。初めて実行したときは正常に動作しましたが、例外(NullPointer)がスローされました。これを実行すると、正常にコンパイルされますが、常に異なるニックネーム/ ipAddress / fileLocationを指定しているにもかかわらず、リストにそのユーザーがすでに含まれていると表示されます。

Userオブジェクトに何か問題があり、実行しようとするたびに同じままになると思います。

誰かが私を助けてくれることを願っています。ありがとう

4

2 に答える 2

2

あなたのプログラムには、このような1つの呼び出しを持つメインがあります

 UserCollector.addUserToTheList();

プログラムが完了すると、リストは破棄されます。次に実行すると、新しいリストが表示されます。多くのユーザーを追加することを目的としている場合は、さらに多くのユーザーを求めるプロンプトを表示し続けるか、作成しているリストをどこかに保存する必要があります。

あなたが呼ぶ

  allUsers = new ArrayList<User>();

addUserToTheListで毎回、したがって、新しいユーザーごとに新しいリストを作成します。代わりに、コンストラクターで初期化する必要があります。ただし、静的メソッドを使用するべきではありません。私が前にあなたに忠告したように、あなたのメインはすべきです

 UserCollector myCollector = new UserCollector();

 myCollector .addUserToTheList();

UserCollectorコンストラクターは、ユーザーリストを初期化できます

public class UserCollector {

    private List<User> allUsers;
    public UserCollector() {
          allUsers = new ArrayList<User>();
    }

そうすれば、静的メソッドは必要ありません。

これを見てください:

    if (keyboardInput.nextLine().equalsIgnoreCase("INSERT") 
              && !allUsers.contains(inputUser))    {
        allUsers.add(inputUser);
        System.out.println("User has been successfully added to your list.");
    }
    else
        System.out.println("This user already exists on the list!");

「INSERT」ypu以外のものを入力して、「useralreadyexists」メソッドをヒットした場合。私はいつも条項を分けて、異なるメッセージを出します。

于 2010-01-10T19:16:31.117 に答える
0

System.inオブジェクトを取得しようとしている2つの異なることがあるため、問題が発生しているのではないかと思います。UserクラスにSystem.inを要求するスキャナーがあり、他のクラスにSystem.inを要求するスキャナーがあります。コンソールは、入力を渡すオブジェクトをどのように認識しますか?

これは問題ではないかもしれませんが、コマンドラインからのユーザー入力を受け入れるのは1つだけになるように、クラスを再設計することをお勧めします。

于 2010-01-10T18:57:23.177 に答える