什么是NullPointerException?
我正在尝试在java中创建一个tic-tac-toe游戏作为大学项目。 到目前为止,我所做的只是创建了gameBoard方法的骨架代码。 我已经遇到一个错误说:
java.lang.NullPointerException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272)
我也不确定如何完成整个项目。 我的基本想法是使用gameBoard方法每回合打印一次。 我试图让变量变为全局变量,这样我就可以在玩家移动时改变它们。 我如何做到这一点,以及如何解决我得到的错误? 任何帮助将不胜感激,这是我目前的代码:
import javax.swing.JOptionPane; public class Assignment5 { public static String top1 = " "; public static String top2 = " "; public static String top3 = " "; public static String mid1 = " "; public static String mid2 = " "; public static String mid3 = " "; public static String bot1 = " "; public static String bot2 = " "; public static String bot3 = " "; //Generate the game board public static void gameBoard() { System.out.println("+-----------+"); System.out.println("| " + top1 + " | " + top2 + " | " + top3 + " |"); System.out.println("+-----------+"); System.out.println("| " + mid1 + " | " + mid2 + " | " + mid3 + " |"); System.out.println("+-----------+"); System.out.println("| " + bot1 + " | " + bot2 + " | " + bot3 + " |"); System.out.println("+-----------+"); } public void main(String args[]) { gameBoard(); } }
关于空指针exception,它是exception当应用程序在需要对象的情况下尝试使用null时,该exception。
这是java中对应的类: java.lang.NullPointerException
关于你的代码,我建议你使用像Eclipse这样的IDE,你可以在下面的情况下点击你输入的编译错误
public void main(String args[])
它应该是
public static void main(String args[])
你有一个NPE
因为你的类没有main()
,其中包含一个static
关键字。 您似乎已经使用run
命令而不是java
命令来执行您的代码(使用DrJava的java编译器)。
在DrJava的SourceForge页面上有一个Bug报告 ,它显示了一个误导性的stacktrace
无论何时使用run
而不是java
,对于main()
没有给出static
关键字的情况。
那么如何解决这个问题呢?
您需要提供main()
方法的正确签名,如下所示。
public static void main(String args[]) // static keyword required
您可能希望用一系列数组来表示您的游戏板,例如
String[][] board = {new String[3], new String[3], new String[3]}; for(int i = 0; i < board.length; i++) { for(int j = 0; j < board[i].length; j++) { board[i][j] = " "; } }
这样,您可以使用嵌套循环打印出电路板的内容,而不必分别引用每个元素; 您还可以更轻松地确定板元素邻接(例如,您可以确定是否有人使用循环而不是使用地狱般的if-elseif或switch语句)。
关于你的空指针exception,你发布的代码中没有任何东西应该导致一个; 错误必须位于代码的其余部分。
在创建用于保存对象的变量时,实际上是在创建一个引用,然后必须将该引用分配给声明类型(或子类型)的对象实例。
例如
Car c = new Car();
变量c
是一个引用,它被指定为指向新创建的对象new Car()
。
如果你刚才这样说:
Car c;
现在你有一个不指向任何东西的参考。 因为它没有指向任何东西,所以它指向null,换句话说它是一个空指针。 null是一个表示虚无的抽象。 所以,如果您现在尝试使用该空指针,就好像它包含一些内容:
c.drive();
您现在将获得NullPointerException。 这意味着您尝试在实际上未指向任何内容的引用上调用方法。