NullPointerException, коллекции не хранят данные? - PullRequest
0 голосов
/ 20 марта 2010

Я разместил этот вопрос ранее, но не с кодом в полном объеме. Коэффициент ниже также вызывает другие классы Background и Hydro, которые я включил внизу.

У меня есть Nullpointerexception в строке, отмеченной звездочками. Что подсказало бы мне, что Коллекции не хранят данные должным образом. Хотя, когда я проверяю их размер, они кажутся правильными.

Спасибо заранее. PS: Если кто-то хотел бы дать мне совет о том, как лучше отформатировать мой код, чтобы сделать его читаемым, это будет оценено.

Эллиот

>package exam0607;

>import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.Collection;
import java.util.Scanner;
import java.util.Vector;

>import exam0607.Hydro;
import exam0607.Background;// this may not be necessary???? FIND OUT 


>public class HydroAnalysis {

 public static void main(String[] args) {

  Collection<Hydro> hydroList = null;
  Collection<Background> backList = null;

  try{hydroList = readHydro("http://www.hep.ucl.ac.uk/undergrad/3459/exam_data/2006-07/final/hd_data.dat");}
  catch (IOException e){
   e.getMessage();}
  try{backList = readBackground("http://www.hep.ucl.ac.uk/undergrad/3459/exam_data/2006-07/final/hd_bgd.dat");
   //System.out.println(backList.size());
  }

  catch (IOException e){
   e.getMessage();}

  for(int i =0; i <=14; i++ ){ 
   String nameroot = "HJK";  
   String middle = Integer.toString(i);
   String hydroName = nameroot + middle + "X";
   System.out.println(hydroName);
   ALGO_1(hydroName, backList, hydroList);
  }
 }

 public static Collection<Hydro> readHydro(String url) throws IOException {
  URL u = new URL(url); 
  InputStream is = u.openStream(); 
  InputStreamReader isr = new InputStreamReader(is); 
  BufferedReader b = new BufferedReader(isr); 
  String line ="";

  Collection<Hydro> data = new Vector<Hydro>();
  while((line = b.readLine())!= null){
   Scanner s = new Scanner(line);
   String name = s.next(); 
   System.out.println(name);
   double starttime = Double.parseDouble(s.next());
   System.out.println(+starttime);
   double increment = Double.parseDouble(s.next());
   System.out.println(+increment);
   double p = 0;
   double nterms = 0;

   while(s.hasNextDouble()){
    p = Double.parseDouble(s.next());
    System.out.println(+p);
    nterms++;
    System.out.println(+nterms);  
   }
   Hydro SAMP = new Hydro(name, starttime, increment, p);
   data.add(SAMP);  
  }
  return data;
 }

 public static Collection<Background> readBackground(String url) throws IOException {
  URL u = new URL(url); 
  InputStream is = u.openStream(); 
  InputStreamReader isr = new InputStreamReader(is); 
  BufferedReader b = new BufferedReader(isr); 
  String line ="";
  Vector<Background> data = new Vector<Background>();
  while((line = b.readLine())!= null){
   Scanner s = new Scanner(line);
   String name = s.next();    
   //System.out.println(name);
   double starttime = Double.parseDouble(s.next());
   //System.out.println(starttime);
   double increment = Double.parseDouble(s.next());
   //System.out.println(increment);
   double sum = 0;
   double p = 0;
   double nterms = 0;
   while((s.hasNextDouble())){
    p = Double.parseDouble(s.next()); 
    //System.out.println(p);
    nterms++;
    sum += p;
   }
   double pbmean = sum/nterms;
   Background SAMP = new Background(name, starttime, increment, pbmean);
   //System.out.println(SAMP);
   data.add(SAMP);  
  }
  return data;
 }

 public static void ALGO_1(String hydroName, Collection<Background> backgs, Collection<Hydro> hydros){
  //double aMin = Double.POSITIVE_INFINITY;
  //double sum = 0;
  double intensity = 0;
  double numberPN_SIG = 0;
  double POSITIVE_PN_SIG =0;
  //int numberOfRays = 0;
  for(Hydro hd: hydros){
   System.out.println(hd.H_NAME);
   for(Background back : backgs){
    System.out.println(back.H_NAME);
    if(back.H_NAME.equals(hydroName)){//ERROR HERE 
     double PN_SIG = Math.max(0.0, hd.PN - back.PBMEAN);
     numberPN_SIG ++; 
     if(PN_SIG > 0){ 
      intensity += PN_SIG;
      POSITIVE_PN_SIG ++;
     } 
    }    
   }
   double positive_fraction = POSITIVE_PN_SIG/numberPN_SIG;
   if(positive_fraction < 0.5){
    System.out.println( hydroName + "is faulty" );
   }
   else{System.out.println(hydroName + "is not faulty");} 
   System.out.println(hydroName + "has instensity" + intensity);
  }   

 } 
}

ФОНОВЫЙ КЛАСС

package exam0607;
public class Background {

 String H_NAME;
 double T_START;
 double DT;
 double PBMEAN;



 public Background(String name, double starttime, double increment, double pbmean) {

 name = H_NAME;
 starttime = T_START;
 increment = DT;
 pbmean = PBMEAN;

 }}

И ГИДРОКЛАСС

public class Hydro {

 String H_NAME;
 double T_START;
 double DT;
 double PN;
 public double n;

 public Hydro(String name, double starttime, double increment, double p) {

  name = H_NAME;
  starttime = T_START;
  increment = DT;
  p = PN;
 }

}

1 Ответ

6 голосов
/ 20 марта 2010

Ах. Ваш класс Гидро совершенно не прав. Вы присваиваете параметры неинициализированным членам.

например.

 public Hydro(String name, double starttime, double increment, double p) {
  name = H_NAME;

но H_NAME не инициализирован. Вы должны обратить это, например,

 public Hydro(String name, double starttime, double increment, double p) {
   H_NAME = name;

Некоторые подсказки:

  1. написать метод toString () для каждого класса, чтобы вы могли выводить его содержательно
  2. объявите параметры вашего метода как окончательные, если вы не ожидаете, что они изменятся
  3. объявите переменные-члены как окончательные, если вы ожидаете, что ваш класс будет неизменным (неизменным)
  4. исследовать юнит-тесты и JUnit

В приведенном выше примере 1. облегчает отладку 2. и 3. означает, что компилятор предотвратит вашу (слишком распространенную) ошибку, описанную выше (попробуйте добавить параметры вашего метода в final и посмотрите, что произойдет!) 4 . заставит вас тестировать на низком уровне и держать ваш код корректным.

В целях отладки полезно использовать только одну ссылку за раз. Это поможет вам определить неожиданные нулевые ссылки, например, если следующее дает NullPointerException

a.getB().getC().getD()

кто из a, getB(), getC() дал нулевую ссылку? Разыменование по одной на строку более многословно, но даст вам гораздо больше информации (объектные пуристы будут возражать против вышеизложенного и отсылать вас к Закон Деметры - я проигнорирую это для этого примера).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...