编辑我正在添加我的源代码的pastebin,以使其更容易查看我的代码.
起始类[http://pastebin.com/Q7w3pbC5]
机器人[http://pastebin.com/BbZRFM5K]
敌人[http://pastebin.com/N98Ly1uY]
我是一个新的Java程序员,刚遇到他的第一个空指针异常.我在课堂上追逐野鹅,但一无所获.
我正在关注Kilobolt的Java游戏开发教程(http://www.kilobolt.com/game-development-tutorial.html),并且到了最后.不幸的是,我在游戏敌人类的更新函数中遇到了空指针异常.如果需要,我可以发布完整的源代码,但这是我认为最相关的代码片段.
空指针来自
} else if (Math.abs(robot.getCenterX() - centerX) < 5) {
我进行了一些调查,发现敌人班级内的打印机器人打印的内容为空.更深入,我们必须.我从这里的吸气功能获得机器人:
private Robot robot = StartingClass.getRobot();
并且StartingClass中的相应函数是:
public static Robot getRobot() {
return robot;
}
机器人定义为:
private static Robot robot;
我可以告诉Robot在BeginningClass中不为null,因为我可以调用相同的getter函数并打印出结果.我不明白为什么它不能通过getter函数保留下来.
谢谢.
解决方法:
用该片段了解情况很复杂.
但是分析情况
我假设你有一堂课
class static StartingClass{
private static Robot robot;
public static Robot getRobot() {
return robot;
}
}
在某些班级
class someClass{
someMethod(){
//Business logic
if{
//Business logic x2
}else if (Math.abs(robot.getCenterX() - centerX) < 5) { //NULLPOINTER
}
}
}
如果您得到一个空指针,并且您还说在那个momentment机器人为空,那么问题显然是,您无法执行null.getCenterX(),显然这将引发异常.
另外,您说在Startingclass机器人中不为null,但实际上没有任何意义,因为如果在StartingClass中robot不为null,则应获取robot的实例.
我们提供了三个可能的修复程序(取决于您应用程序的业务逻辑):
1)假设robot可能为null,我们检查robot不为null:
class someClass{
someMethod(){
//Business logic
if{
//Business logic x2
}else if (robot!= null && Math.abs(robot.getCenterX() - centerX) < 5) { //NULLPOINTER
}
}
}
2)假设错误可能是我们在分配之前获取了机器人,而我们恰好在方法执行之前获取了机器人:
class someClass{
someMethod(){
//Business logic
private Robot robot = StartingClass.getRobot();
if{
//Business logic x2
}else if (robot && Math.abs(robot.getCenterX() - centerX) < 5) { //NULLPOINTER
}
}
}
3)在开始时添加到somemethod(){
private Robot robot = StartingClass.getRobot();
if(robot==null){
return
}