具有静态属性的Java代码的奇怪行为
我真的没什么好问的。见鬼,我甚至不知道这个问题应该说什么。基本上,这段Java代码运行良好,没有任何编译错误具有静态属性的Java代码的奇怪行为,java,static,Java,Static,我真的没什么好问的。见鬼,我甚至不知道这个问题应该说什么。基本上,这段Java代码运行良好,没有任何编译错误 public class Application { static String[][] tiles; public Application() { tiles = new String[9][9]; } public static void main(String[] args) { Application app
public class Application {
static String[][] tiles;
public Application() {
tiles = new String[9][9];
}
public static void main(String[] args) {
Application app = new Application();
Grid mines = new Grid();
mines.fillTiles(tiles, 9, 9, 10);
}
}
class Grid {
Random rand;
public void fillTiles(String[][] tiles, int rowSize, int colSize,
int numMines) {
rand = new Random();
int rowIndex;
int columnIndex;
while (numMines > 0) {
rowIndex = rand.nextInt(rowSize);
columnIndex = rand.nextInt(colSize);
tiles[rowIndex][columnIndex] = "M";
numMines--;
}
}
}
但是,当我移开这条线的时候
Application app = new Application();
在第一个类的main方法中,它在
tiles[rowIndex][columnIndex] = new String("M");
有什么原因吗
Application app = new Application();
如果不实例化应用程序
,平铺
将指向null
。对null引用的操作会导致NullPointerException
数组初始化逻辑位于构造函数中
public Application() {
tiles = new String[9][9];
}
构造函数将仅在对象创建时执行(newapplication()
)
如果你不想做Application-app=new-Application()代码>
只需更改静态字符串[][]tiles=新字符串[9][9]代码>
定义静态
数组变量并不意味着实例化将在加载时发生。这只意味着该变量是类变量。您正在实例的构造函数中初始化数组。如果在第一个实例之后创建另一个实例,它将重新初始化静态成员。您注意到您已经在构造函数中实例化了数组吗
static String[][] tiles;
public Application() {
tiles = new String[9][9]; <--- Here
}
或
如果在构造函数中初始化数组,则每次创建实例时,都会对每个实例重新初始化数组。由于静态
变量对所有实例都是通用的。因此,对静态变量所做的更改将反映在所有实例中。因为您正在初始化tiles=new String[9][9]在构造函数中编写>代码。只有在使用new
将对象实例创建为new Application()
时,才会调用构造函数
如果不想使用构造函数,请将初始化为的静态变量声明为:
static String[][] tiles = new String[9][9];
如果没有构造函数调用,应该可以正常工作。我想我可能知道原因:
public class Application {
static String[][] tiles;
public Application() {
tiles = new String[9][9];
}
public static void main(String[] args) {
Application app = new Application();
Grid mines = new Grid();
mines.fillTiles(tiles, 9, 9, 10);
}
}
在这里,您有一个静态2d数组,其中包含名为tiles的字符串。但是,您只能在应用程序的构造函数中初始化它。因此,当调用“mines.fillTiles(tiles)”时,tiles仍然为空且
tiles[rowIndex][columnIndex] = new String("M");
将引发NullPointerException。否,他正在构造函数中初始化数组。它在类范围中声明(如果它是静态变量,则必须声明)。
public class Application {
static String[][] tiles;
public Application() {
tiles = new String[9][9];
}
public static void main(String[] args) {
Application app = new Application();
Grid mines = new Grid();
mines.fillTiles(tiles, 9, 9, 10);
}
}
tiles[rowIndex][columnIndex] = new String("M");