2014-11-05 99 views
0

我试图写一段代码,可以让人们增加约到不同的地震数据运行不同的观测站,并允许您提取有关它们的数据。我不明白为什么我得到一个显示java.lang.NullPointerException错误消息,当我通过我的IO

当我运行终端时,我可以添加天文台,但是当涉及到添加地震并将它们放入特定天文台时,我得到一个java.lang.Nullpointerexception错误。

public void AddQuake(String name, int magnitude, int latitude, int longitude, int year) { 
    Observatory myObservatory = getObservatory(name); 
    // specify an observatory to store it in every time a quake is created. 
    Earthquake currentQuake = (new Earthquake(name, magnitude, latitude, longitude, year)); //setting local variable 
    allQuakes.add(currentQuake); //adding to arraylist 
    if (currentQuake.GetMagnitude() > 4) { 
     bigQuakes.add(currentQuake); 
    } 
    if (currentQuake.GetMagnitude() >= biggestMagnitudeEver) { 
     biggestQuakeEver = currentQuake; // decides the biggest earthquake ever recorded. 
    } 

    myObservatory.addQuakeHere(currentQuake); //adding to specified observatory 
} 

的getObservatory方法是从天文台的数组列表中选择对象的天文台,它工作正常,在其他地方的迭代器。

这一切都工作正常,直到最后一行。 addQuakeHere是一种从天文台类中提取的方法,用于在阵列列表中添加和保存地震,但是当我通过终端运行它并获取到这部分时,我会得到一个Java.lang.nullpointerexception消息。为什么?

的要求,对于天文台类的代码:

public class Observatory 
{ 
    private ArrayList <Earthquake> quakes; 

    public Observatory(String name, String country, int startYear, int area) { 
    quakes = new ArrayList<Earthquake>(); //array list containing quakes. 
    //other constructors and things omitted. 

    } 
    public void addQuakeHere(Earthquake quake){ 
    quakes.add(quake); 
    } 
} 

的要求,该方法getObservatory:

public Observatory getObservatory(String name){ // method to select a certain observatory. 
    Iterator iter = allObservatories.iterator(); 
    while(iter.hasNext()) { //while there is another observatory in the queue. 
    Observatory currentObserve =(Observatory) iter.next(); //move on to the next one. 
    if(name == currentObserve.GetName()){ 
     return currentObserve; //if the name matches the input parameter, return the observatory. 
    } 
    } 
    return null; 
} 
+1

'getObservatory'必须返回null,可我们看到,方法 – Quince 2014-11-05 21:02:05

+0

要么myObservatory中的代码为空或addQuakeHere抛出异常。我们可以看到天文台课程的代码,看看为什么? – 2014-11-05 21:03:55

+0

确实有帮助吗? – Finlay 2014-11-05 21:13:04

回答

0

if(name == currentObserve.GetName()){

该行。

你比较字符串,而没有使用.equals()。所以它比较了两个String对象的内存位置,这是不相等的,所以它只是继续前进......并且从来没有找到任何,所以返回null。 (不知道为什么它显然作品别处...)

一般情况下,你会希望把支票无效,如果你调用该方法返回null的能力。这一个可能无法找到一个天文台,因此可以返回null。因此,为了防止将来出现NPE,检查getObservatory()实际上返回的内容将会是GoodPractice®。

+0

这是钉了它,非常感谢。长久以来一直在努力解决这个问题,这样的解脱。 – Finlay 2014-11-05 22:00:18

相关问题