2010-03-20 35 views
0

我之前發佈了這個問題,但沒有完整的代碼。下面的coe還會調用其他類的Background和Hydro,我已經在底部包含這些類。NullPointerException,集合不存儲數據?

我有一個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); 
    } 

} 
} 

Background類

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; 

}} 

並且水力CLASS

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

我會強烈建議a)還原以上到最低限度B)打印出實際的異常細節 – 2010-03-20 11:07:31

+1

我沒有看到任何星號的代碼 – Bozho 2010-03-20 11:07:52

+0

有代碼中沒有星號。 NPE在哪裏發生? – 2010-03-20 11:11:18

回答

6

阿。你的水電班是完全錯誤的。您將參數分配給未初始化的成員。

例如

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() 

其中agetB()getC()給空引用?每行提取一個更詳細,但會給你更多的信息(對象純粹主義者會反對上面的,並將你引用到Law Of Demeter--我將忽略這個例子)。