我试图编写一段代码,允许人们将不同地震的数据添加到不同的天文台,并允许您提取有关它们的数据。
当我通过终端时,我可以添加天文台,但是当涉及到添加地震并将它们放入特定天文台时,我会收到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是一个从天文台类中提取的方法,用于在arraylist中添加和保持地震,但是当我通过终端运行它并到达此部分时,我得到一条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;
}
答案 0 :(得分:0)
if(name == currentObserve.GetName()){
那一行。
您正在比较字符串,但未使用.equals()
。所以它比较两个String对象的内存位置,它们不相等,所以它只是继续...而且从不找到任何,所以返回null。 (不知道为什么它显然在其他地方有用......)
通常,如果要调用的方法具有返回null的能力,则需要检查null。这个可能无法找到一个天文台,因此可以返回null。因此,为了防止将来出现NPE,检查getObservatory()
实际上是否返回了某些内容将是GoodPractice®。