遇到了两次这样的提示,逐个解析之。
一、只声明,未创建。如下代码:
public class SortMallFragment extends Fragment {
... ...
private ArrayList rightFragments;
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
//rightFragments = new ArrayList<>();
for (int i = 0; i < leftTitles.length; i++){
rightFragments.add(RightSortMallFragment.newInstance(leftTitles[i],"0"));
}
... ...
}
}
错误提示为:Attempt to invoke virtual method ‘boolean java.util.ArrayList.add(java.lang.Object)’ on a null object reference,即:尝试在空对象引用上调用虚拟方法“boolean java.util.ArrayList.add(java.lang.Object)”。
主要原因对象rightFragments只声明,未创建,是空的(null),当调用其add()方法时,就不符合逻辑了。改正方法就是将上述代码中的双斜杠去掉,即创建一下对象就可以了。
二、循环过程中无法生成对象。如下代码:
for (int i = 0; i<5; i++){
LinearLayout v0 = (LinearLayout) tabLayout.getChildAt(i);
LinearLayout v1 = (LinearLayout) v0.getChildAt(0);
... ...
}
若tabLayout中只有2个子项,而循环要进行5轮。等循环到第3轮时,v0就是一个空对象,调用其getChildAt()方法,试图从里面拿出些什么,恐怕什么也拿不出来,所以报错:
Attempt to invoke virtual method ‘android.view.View android.view.ViewGroup.getChildAt(int)’ on a null object reference
这时虽然语法不错,但逻辑肯定有问题,应朝这个方向寻找问题。
三、小结
出现“Attempt to invoke virtual method ‘…’ on a null object reference”提示,首先说明有一个空对象,其次还要调用这个对象的方法,代码形如:“空对象.方法()”。这好比还没发工资,就拿着“钱影子”去买东西,逻辑上很荒谬。解决的方向应该是仔细研究这个“空对象”的由来。



