![](/img/trans.png)
[英]Storing data into Object Array Elements returns NullPointerException
[英]NullPointerException, Collections not storing data?
我早些時候發布了這個問題,但沒有完整地發布代碼。 下面的coe還調用了我在底部包含的其他類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;
}
}
啊。 您的Hydro課程完全錯誤。 您正在將參數分配給未初始化的成員。
例如
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.使調試更容易2.和3.意味着編譯器將防止您發生上述(所有常見的錯誤)(嘗試在方法參數中使用final
並查看會發生什么!)4.將迫使您執行以下操作在較低級別進行測試,並保持您的代碼正確。
出於調試目的,一次僅引用一個參考很有用。 這可以幫助您識別意外的空引用,例如,如果以下給出NullPointerException
a.getB().getC().getD()
其中的a
, getB()
getC()
給了空引用? 每行取消引用一個較為冗長,但會給您更多信息(對象純粹主義者將反對上述內容,並請您參考Demeter定律 -在本示例中,我將忽略它)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.