2014-11-05 100 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

相關問題