我正在准备一个可以处理hexgrid的类。我正在尝试创建一个2D数组字段来保存该网格的数据。我准备了以下代码。它没有显示编译错误,但是有一个运行时错误。我是java编程的新手,不知道这是什么意思。
任何人都可以帮我解决错误或告诉我更好的解决方法吗?
Hex grid Class(HexGrid.java)
import java.lang.reflect.Array;
public class HexGrid <T>{
int row,col;
T[][] grid;
public HexGrid(T[] data){
int n = data.length;
int r = (int) Math.ceil(Math.sqrt(n));
LoadData(r, r, data);
}
public HexGrid(int r,T[] data){
this(r,(int)(Math.ceil(data.length/r)),data);
}
public HexGrid(int r){
this(r,r,null);
}
public HexGrid(int r, int c){
this(r,c,null);
}
public HexGrid(int r,int c,T[] data) {
LoadData(r, c, data);
}
@SuppressWarnings("unchecked")
public void LoadData(int r, int c, T[] data){
Class<? extends T> cls = (Class<? extends T>) data.getClass();
row = r;
col = c;
grid = (T[][]) Array.newInstance(data.getClass(),r, c+(int) Math.floor(r/2.0));
if(data!=null)
AssignValues(data);
}
private void AssignValues(T[] data) {
int dbug=0;
for(int i=0; i<row; i++)
{
for(int j= (int)(Math.ceil(i/2));j<col+(int)(Math.floor(row/2)); j++)
{
dbug++;
if(dbug<data.length)
grid[i][j] = data[i];
else grid[i][j] = null;
}
}
System.out.println(dbug+"");
}
}
以下是我希望如何使用它的示例示例(Test.java)
public class Test {
public static void main(String[] args) {
Integer[] data= new Integer[96];
for(int i=0;i<96;i++)
data[i] = i+1;
HexGrid<Integer> objHexGrid = new HexGrid<Integer>(data);
}
}
我收到的错误如下:
Exception in thread "main" java.lang.ArrayStoreException: java.lang.Integer
at hexGrid.HexGrid.AssignValues(HexGrid.java:46)
at hexGrid.HexGrid.LoadData(HexGrid.java:35)
at hexGrid.HexGrid.<init>(HexGrid.java:13)
at hexGrid.Test.main(Test.java:12)
答案 0 :(得分:2)
问题是因为您分配了Integer[][][]
数组,但将其用作Integer[][]
。
在以下行data.getClass()
中返回Integer[]
,因此您分配了一个Integer[]
- s的矩阵,而不是Integer
- s:
grid = (T[][])Array.newInstance(data.getClass(),r, c+(int) Math.floor(r/2.0));
将以上行更改为:
grid = (T[][])Array.newInstance(
data.getClass().getComponentType(), r, c + r / 2);