今天我犯了一个经典的错误,使用一个值为null的对象。我仔细检查代码的逻辑,没有发现任何问题。理论上来说,不可能会创建值为null的对象。
我找到程序报错行,添加如下语句
if(shot != null && ...)
此时我的整个程序可以正常运行,但并没有解决问题。我在创建Shot对象的代码处添加如下打印信息
if(shot == null) System.out.println("warning");
之后的确打印出了错误信息,然后我检查上面的代码,并添加最后一行代码打印信息。
1 public void shotEnemy() 2 { 3 int x = this.x; 4 int y = this.y; 5 Shot shot = null; 6 7 switch (this.direction) 8 { 9 case 0: 10 shot = new Shot(x + 22, y - 11, direction, 1); 11 break; 12 case 1: 13 shot = new Shot(x + 22, y + 55, direction, 1); 14 break; 15 case 2: 16 shot = new Shot(x - 11, y + 22, direction, 1); 17 break; 18 case 3: 19 shot = new Shot(x + 55, y + 22, direction, 1); 20 break; 21 default: 22 break; 23 } 24 25 if (shot != null) 26 { 27 this.ss.add(shot); 28 Thread t = new Thread(shot); //创建一个新线程 29 t.start(); 30 } 31 else 32 System.out.println("warning" + this.direction); 33 }
之后发现direction值为4,而前面switch语句只在direction为0,1,2,3的情况下才会创建Shot实例。原来direction是我在前面用随机数生成的,而生成的随机数为0,1,2,3,4,误把4也生成了。
之前还猜测是线程并发的问题,在把关键代码加了对象锁之后错误依旧,原来是在创建Shot时就给了一个null值。