什么是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。 这意味着您尝试在实际上未指向任何内容的引用上调用方法。