我将对象添加到在每个循环中初始化为null的ArrayList中,但是SonarLint给了我一个" NullPointerException"当我尝试添加每个对象时可能会抛出。为什么要指出这个错误?
public List<SatelliteData> getData()
{
SatelliteData satellite;
ArrayList<SatelliteData> satelliteList = null;
try(FileInputStream file = new FileInputStream(satelliteOutputFile))
{
TLEParser parsedFile = new TLEParser();
List<TLE> tleList = parsedFile.readFile(file);
for (TLE tle : tleList)
{
satellite = new SatelliteData(tle);
satellite.collectSatelliteData();
satelliteList.add(satellite); //A "NullPointerException" could be thrown; "satelliteList" is nullable here
}
}
catch (IOException ex)
{
LOGGER.error("IO Exception: " + ex);
notifyTheObservers("IO Exception: " + ex);
}
return satelliteList;
}
答案 0 :(得分:1)
您不应该对已初始化为nothing / null的变量调用成员方法。
在这种情况下你有
ArrayList<SatelliteData> satelliteList = null;
此变量没有分配任何内存。
此时你的电脑知道:好的,还有什么东西 称为satelliteData ,但它实际上不知道它在哪里?
在其上调用add()方法,可能会抛出 NullPointerException ,因为此变量是指向null / nothing的引用。
为了解决这个问题,你需要像这样初始化变量:
ArrayList<SatelliteData> satelliteList = new ArrayList<SatelliteData>();
此时,您的计算机创建了satteliteData并且知道 确切地说它存在于哪里因此它可以愉快地操作它。
这会为这个变量分配一些内存,现在它有自己可以调用的方法。