0

5 つの整数のリストを取り、それぞれを 6 つのメンバーの 1 つに割り当てる短い Java プログラムを作成しています。min値と値の間の値を受け取っているメンバーの数を最大化したいと考えていmaxます。
とにかく、私にはわからない何らかの理由で、私のプライベートmemberクラスは NullPointerException をスローしているようですが、その理由については完全に途方に暮れています。任意の提案をいただければ幸いです。

import java.util.*;
public class assign {
    private class member {
        private String name;
        private int min;
        private int max;
        public member(String name, int min, int max) {
            this.name = name;
            this.min = min;
            this.max = max;
        }
    }

    public member[] members = {
        new member("Phil", 1, 20),
        new member("Molly", 1, 20),
        new member("Connor", 21, 40),
        new member("Sam", 21, 40),
        new member("Dan", 41, 60),
        new member("Theresa", 41, 60)
    };

    public void main(String[] args) {
        System.out.println("test");
        String s = StdIn.readLine();
        String[] temp = s.split(" ");
        ArrayList<Integer> nums = new ArrayList<Integer>(5);
        for (int i = 0; i < 5; i++) {
            nums.add(Integer.parseInt(temp[i]));
        }
        ArrayList<member> mems = new ArrayList<member>(Arrays.asList(members));

        for (int n : nums) {
            for (member m : mems) {
                if (n > m.min && n < m.max) {
                    System.out.println(m.name + " : " + n);
                    nums.remove(n);
                    mems.remove(m);
                }
            }
        }
        for (int n : nums) {
            member m = mems.remove(0);
            System.out.println(m.name + " : " + n);
        }
    }
}

OPのコメントから:

java.lang.NullPointerException 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.jav‌​a:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:27‌​2) 
4

2 に答える 2

3

あなたのエラーは、現在の main メソッドが static ではないということだと思います:

// this should be a static method
public void main(String[] args) {
  // ...
}

解決策: main メソッドを静的にする必要があります。

public static void main(String[] args) {
  // ...
}

これを修正すると、主に非静的なものに静的な方法でアクセスしようとしているという他のエラーが表示されます。これを修正するには、assign クラス (大文字で始まるようにこの Assign の名前を変更してください) を呼び出すパブリック メソッドを指定し、メイン メソッドで Assign インスタンスを作成してこれらのメソッドを呼び出すようにします。

たとえば、ここに:

ArrayList<member> mems = new ArrayList<member>(Arrays.asList(members));

静的コンテキストで非静的メンバー配列を使用しようとしています。パブリック メソッド内の Assign クラス内でのみ処理する必要があります。それかmembers静的にするかのどちらかです。

于 2013-11-03T03:35:03.730 に答える
0

誰もがそうであるように、最初の大きな質問は、 static main なしでコードをどのように実行していますか?

あなたのコードには多くのフローがあります。ロジックを再確認し、コードに対してさまざまなテスト ケースを実行してみてください (有効なものと無効なもの)。これは良い問題文です。

例として

for (int n : nums) {
            for (member m : mems) {
                if (n > m.min && n < m.max) {
                    System.out.println(m.name + " : " + n);
                    nums.remove(n);
                    mems.remove(m);
                }
            }
        }

ConcurrentModificationExceptionが発生するのを待っています。

この行が必要ですか: nums.remove(n);
IndexOutOfBoundsException

于 2013-11-03T05:13:54.593 に答える