我模仿网上的多线程不同写了一个自动提款机的小程序,一运行就扔空指针错误。我eclipse提示是Thread.start()方法错误了,可是我看不出这里怎么就空指针了,我明明创建了对象啊。
- Java code
public class my{ public static void main(String[] args){ ATM[] pArr=new ATM[100]; for(int i=0;i<pArr.length;++i){ pArr[i].start(); } } static class Account{ int m_amount; String m_name; Account(int m,String name){ m_amount=m; m_name =name; } void Deposit(int m){ try{ int a=m_amount; a+=m; Thread.sleep(100); m_amount=a; }catch(InterruptedException e){ e.printStackTrace(); } } void WithDraw(int m){ try{ int a=m_amount; a-=m; Thread.sleep(100); m_amount=a; }catch(InterruptedException e){ e.printStackTrace(); } } } static class ATM extends Thread{ static Account m_acc=new RevertList.Account(10,"self"); public void run(){ m_acc.Deposit(1); m_acc.WithDraw(1); } }}
------解决方案--------------------------------------------------------
创建了数组,数组里的对象默认是null,需要初始化!
------解决方案--------------------------------------------------------
如果是基本类型的数组的话,系统会分配一个默认初始值,比如int数组就是0
但如果是引用类型的话,分配了内存但没有初始化,即null,因而提示空指针异常
------解决方案--------------------------------------------------------
对象数组为空
可以再for循环里创建多个线程
------解决方案--------------------------------------------------------
初学者常见错误:
你只是创建了数组,但没有创建数组中的元素:
for(int i=0;i<pArr.length;++i){
pArr[i] = new ATM(); // 这才真的创建了数组中的元素所引用的对象。
pArr[i].start();
}
------解决方案--------------------------------------------------------
------解决方案--------------------------------------------------------
ATM[] pArr=new ATM[100];
你只是创建了数组,但没有创建数组中的元素所以是个长度为100的空数组
------解决方案--------------------------------------------------------
ATM[] pArr=new ATM[]{new ATM()};
------解决方案--------------------------------------------------------
------解决方案--------------------------------------------------------
------解决方案--------------------------------------------------------
与其在这里告诉LZ是什么引起了空指针异常,还不如告诉LZ怎么用Debug调试。你这次知道原因了,下次一粗心,不会又来这里发个帖子吧。
Debug断点到发生错误的地方,然后看变量,(x)=Variables窗口你调试的时候看过多少次?出了问题就一头裁进代码里看,睁大了眼睛,自信满满的以为看一眼就能知道哪里出错,总有一天你会感觉到头昏脑胀的。
------解决方案--------------------------------------------------------
关于第10楼----
难道你认为'Final amount=10'的结果是正确的? 它可以是这样的情况
1. 所有ATM的线程都还没跑到run里面(毕竟需要时间),就输出了
2. 所有ATM的线程都还没跑到给m_amount赋值那里,就输出了
3. 有一个ATM的线程'刚好'跑完一个run而其它线程处于1 或 2的情况,就输出了.
---
要重现错误,只要在Debug下控制不同线程在run里一步一步跑上去就很容易看到了.
------解决方案--------------------------------------------------------