首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java.lang.NullPointerException,但对象不为空(我想)

java.lang.NullPointerException,但对象不为空(我想)
EN

Stack Overflow用户
提问于 2012-07-07 23:46:07
回答 3查看 2.3K关注 0票数 2

我的最后一个项目(也是最大的项目:)是乒乓球游戏。我正在尝试实现"AI",但我不能这样做,因为

代码语言:javascript
复制
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 (只有两个超链接,防止垃圾邮件)

代码写得不是很好,我希望你不会去(get?)盲人:)

欢迎光临,禤浩焯

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-07 23:49:56

你得了竞赛症。

当您调用Ball构造函数时,它会立即调用movement(),它会调度有问题的代码(诚然是在不同的线程中)。在分配Main.player之前,所有这些都发生在Main构造函数的中间。所以在这里的movement()行中:

代码语言:javascript
复制
if(main.player.intersects(main.ball) && hitP == false){

...如果计时器线程启动得足够快,main.player仍然为null,因此main.player.intersects调用抛出异常。(main.ball也是空的,但这实际上并不会导致您看到的问题。不过,这仍然是一个问题。)

以下是需要学习的几个经验:

  • 不要在constructor
  • Ideally,中做太多的事情尽量避免创建这种循环引用,或者如果你必须有一个循环引用,在你开始实际工作之前确保一切都初始化了
  • 让你的类名更有意义:Main作为程序的入口点是很好的,但是创建一个Main类型的对象对我来说听起来非常可疑。什么是Main?你将如何描述它?
  • 不要滥用继承-没有理由Ball应该扩展Thread (您说implements Runnable,但在与truefalseBall)
  • Avoid比较中,您没有自己提供run()方法-编写if (foo)而不是D30和D31,而不是像我之前的评论所说的那样有意义地使用变量名,在具有名为pPlayer变量的同一个类中调用Rectangle变量player是在自找麻烦
  • 使所有变量都是私有的,如果需要的话,可以通过属性公开它们。(不要公开它们,除非您确实需要though)
  • Indentation是很重要的-适当地缩进您的代码可以更容易地阅读
  • ,直到您真正熟悉该语言的基础知识,避免线程化-这很难,并且会在

中引入各种微妙的问题

票数 8
EN

Stack Overflow用户

发布于 2012-07-07 23:49:56

在代码中,在第17行调用ball.movement()之后,在第18行为main赋一个非空值。

票数 2
EN

Stack Overflow用户

发布于 2012-07-07 23:52:52

这一行:主行18中的player = new Rectangle(p.getX(), p.getY(), 10, 50);必须在主行15中的b = new Ball(this);之前。否则,当您调用移动时,播放器为空。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11376391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档