我的上一个项目(以及最大的:)是Ping Pong游戏。 我正在尝试实现“AI”,但由于
,我不能这样做Exception in thread "Timer-0" java.lang.NullPointerException
at main.Ball$1.run(Ball.java:25)
at java.util.TimerThread.mainLoop(Unknown Source)
at java.util.TimerThread.run(Unknown Source)
我认为我已经编写了完整的代码,但肯定存在错误。
Main.java - http://pastebin.com/nvHwQAFD
Ball.java - http://pastebin.com/cgE5r5eW
Player.java - pastebin.com/7QeiNciz
Ai.java - pastebin.com/xsGhJ7Zb(只有两个超链接,防止垃圾邮件)
代码写得不好,我希望你不会去(得到?)盲目:)
问候, 阿德里安
答案 0 :(得分:8)
你有竞争条件。
当你调用Ball
构造函数时,会立即调用movement()
来调度有问题的代码(诚然在不同的线程中)。所有这些都发生在分配了 Main
之前Main.player
构造函数的中间。所以在这里movement()
行:
if(main.player.intersects(main.ball) && hitP == false){
如果计时器线程足够快地启动,则 ... main.player
仍然为空,因此main.player.intersects
调用会抛出异常。 (main.ball
也是null,但实际不会导致你看到的问题。但它仍然是一个问题。)
要学习一些课程:
Main
可以只是是程序的入口点,但创建类型为{{1}的对象对我来说听起来很可疑。什么 一个Main
?你会怎么描述它?Main
没有理由延伸Ball
(你说Thread
但你没有在{implements Runnable
中提供run()
方法1}})Ball
或true
进行比较 - 写false
代替if (foo)
和if (foo == true)
代替if (!foo)
if (foo == false)
变量Rectangle
,您有一个名为player
的{{1}}变量正在询问麻烦答案 1 :(得分:2)
在代码中,您在第17行调用ball.movement()
,然后在第18行分配main
非空值。
答案 2 :(得分:0)
此行:主线18中的player = new Rectangle(p.getX(), p.getY(), 10, 50);
必须在主线15中b = new Ball(this);
之前。否则当您调用移动时,播放器为空。