2013-11-03 3 views
0

Я пишу короткую Java-программу, которая должна взять список из 5 целых чисел и назначить каждому из 6 членов. Я хочу максимизировать количество членов, которые получают значение между их значениями min и max.
В любом случае, по какой-то причине это неизвестно мне, мой частный класс member, похоже, бросает исключение NullPointerException, но я совершенно не понимаю, почему. Мы ценим любые предложения.Java Inner Classes 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) 
+0

Вы должны действительно вернуться и прочитать FAQ. Если вам нужна помощь с кодом, который вы написали, вам нужно опубликовать, при каких условиях, что вы ожидаете на самом деле, какие-либо трассировки стека и т. Д. –

+1

Вам нужно указать, какая линия выбрасывает NPE. –

+0

java.lang.NullPointerException \t на sun.reflect.NativeMethodAccessorImpl.invoke0 (нативный метод) \t в sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:39) \t в sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl. java: 25) \t at java.lang.reflect.Method.invoke (Method.java:597) \t at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand (JavacCompiler.java:272) –

ответ

3

Я держу пари, что ваша ошибка в том, что текущий основной метод не является статическим:

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

Решение: сделать основной метод статический, как и должно быть.

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

После того, как вы это исправить, вы увидите другие ошибки, в основном, что вы пытаетесь получить доступ к нестатическим вещам статически. Чтобы исправить это, вы захотите присвоить классу назначений (пожалуйста, переименуйте это Assign так, чтобы он начинался с буквы верхнего регистра), чтобы вызвать вызов, а затем ваш основной метод создайте экземпляр Assign и вызовите эти методы.

Например здесь:

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

Вы пытаетесь использовать массив нестатические членов в статическом контексте. Вы захотите обработать его только в своем классе Assign внутри своих общедоступных методов. Либо это, либо сделать members статическим.

+1

На самом деле возникает вопрос, как запускается эта программа? – clwhisk

+0

Как он мог запустить его без статической основной? Мне кажется, что это комментарий, а не ответ. – bmargulies

+0

@clwhisk: это не так. Исключение выбрано, и он завершает работу. –

0

Первый большой вопрос, как каждый, как ваш код работает без статического основного?

Ваш код имеет много потоков, Просьба пересмотреть логику и попытаться запустить различные тестовые примеры против вашего кода (действительные, а затем недействительные). Это хорошая проблема.

Как например

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.