Java 检查网格,抛出越界异常
目前,我正在尝试检查网格单元格周围所有单元格中的数据。上、左、下、右和所有对角线。我如何使用异常抛出,这样我就不必对边和角单独编码了 这就是我目前拥有的。isIsAlive()只是检查单元格是否处于“活动”状态。单元的邻居包括其周围的所有活动单元Java 检查网格,抛出越界异常,java,arrays,exception,Java,Arrays,Exception,目前,我正在尝试检查网格单元格周围所有单元格中的数据。上、左、下、右和所有对角线。我如何使用异常抛出,这样我就不必对边和角单独编码了 这就是我目前拥有的。isIsAlive()只是检查单元格是否处于“活动”状态。单元的邻居包括其周围的所有活动单元 public void calcNeighbors() throws ArrayIndexOutOfBoundsException{ int x =0; int y =0; int neighbors = 0;
public void calcNeighbors() throws ArrayIndexOutOfBoundsException{
int x =0;
int y =0;
int neighbors = 0;
while(x < 9){
while(y < 9){
if(generation[x+1][y+1].isIsAlive()){
neighbors++;
}
if(generation[x+1][y].isIsAlive()){
neighbors++;
}
if(generation[x+1][y-1].isIsAlive()){
neighbors++;
}
if(generation[x][y-1].isIsAlive()){
neighbors++;
}
if(generation[x-1][y-1].isIsAlive()){
neighbors++;
}
if(generation[x-1][y].isIsAlive()){
neighbors++;
}
if(generation[x-1][y+1].isIsAlive()){
neighbors++;
}
if(generation[x][y+1].isIsAlive()){
neighbors++;
}
y++;
}
x++;
neighbors = 0;
}
}
public void calcNeighbors()引发ArrayIndexOutOfBoundsException{
int x=0;
int y=0;
int=0;
而(x<9){
而(y<9){
如果(生成[x+1][y+1].isIsAlive()){
邻居++;
}
如果(生成[x+1][y].isIsAlive()){
邻居++;
}
如果(生成[x+1][y-1].IsSalive()){
邻居++;
}
if(生成[x][y-1].isIsAlive()){
邻居++;
}
if(生成[x-1][y-1].isIsAlive()){
邻居++;
}
if(生成[x-1][y].isIsAlive()){
邻居++;
}
如果(生成[x-1][y+1].isIsAlive()){
邻居++;
}
如果(生成[x][y+1].isIsAlive()){
邻居++;
}
y++;
}
x++;
邻居=0;
}
}
您的if块列表丑陋(直截了当)且危险。而是使用嵌套for循环,但计算for循环的上下界,同时考虑边
for (int x = 0; x < MAX_X; x++) {
for (int y = 0; y < MAX_Y; y++) {
int minRow = Math.max(0, x - 1);
int maxRow = Math.min(MAX_X - 1, x + 1);
int minCol = Math.max(0, y - 1);
int maxCol = Math.min(MAX_Y - 1, y + 1);
for (int row = minRow; row <= maxRow; row++) {
for (int col = minCol; col <= maxCol; col++) {
if (row != x || col != y) {
if(generation[row][col].isIsAlive()){
neighbors[x, y]++;
}
}
}
}
}
}
for(int x=0;x for(int row=minRow;row您的if块列表很难看(很钝)也很危险。请改用嵌套for循环,但计算for循环的上界和下界时要考虑边
for (int x = 0; x < MAX_X; x++) {
for (int y = 0; y < MAX_Y; y++) {
int minRow = Math.max(0, x - 1);
int maxRow = Math.min(MAX_X - 1, x + 1);
int minCol = Math.max(0, y - 1);
int maxCol = Math.min(MAX_Y - 1, y + 1);
for (int row = minRow; row <= maxRow; row++) {
for (int col = minCol; col <= maxCol; col++) {
if (row != x || col != y) {
if(generation[row][col].isIsAlive()){
neighbors[x, y]++;
}
}
}
}
}
}
for(int x=0;x 对于(int row=minRow;row,如果假设的邻居超出边界,则不应抛出自己的异常。Java无论如何都会抛出一个ArrayIndexOutOfBoundsException
在访问数组之前,需要检查边界;如果x
或y
超出范围,则不要访问数组。如果假设的邻居超出边界,则不应引发自己的异常。Java无论如何都会引发ArrayIndexOutOfBoundsException
在访问数组之前,您需要检查边界;如果x
或y
超出范围,则不要访问数组。不建议为此使用异常。但是,如果您坚持,您可以通过以下方式来做。首先,定义一个方法
public boolean isAlive(int x,int y) {
try {
return this.generation[x][y].isIsAlive() ;
} catch(IndexOutOfBoundsException ex) {
return false ; // Or whatever you want to be the default
}
}
然后使用isAlive(x+1,y+1)
而不是generation[x+1][y+1].isIsAlive()
等等
此外,我的印象是,您错误地声明了一个局部变量int neights=0;
。我这样说是因为您在最后一直将其设置为0
,但您没有将其存储在任何地方。我个人会在generation
的基类中定义一个字段neights
,并且:
for(int x= 0 ; x < generation.length ; x++ ) {
for(int y= 0 ; y < generation[x].length ; y++ ) {
generation[x][y].neighbors= 0 ;
for(int dx= -1 ; dx <= 1 ; dx++ ) {
for(int dy= -1 ; dy <= 1 ; dy++ ) {
if( ! ( dx == 0 && dy == 0 ) && isAlive(x+dx,y+dx) ) {
generation[x][y].neighbors++;
}
}
}
}
现在,没有滥用异常(这是目前最推荐的),我想说添加一个函数
public boolean isValidNeighbor(int i,int j) {
return 0 <= i && i < generation.length && 0 <= j && j < generation[i].length ;
}
公共布尔值isValidNeighbor(int i,int j){
返回0不建议为此目的使用异常。但是如果您坚持,可以通过以下方式执行。首先,定义一个方法
public boolean isAlive(int x,int y) {
try {
return this.generation[x][y].isIsAlive() ;
} catch(IndexOutOfBoundsException ex) {
return false ; // Or whatever you want to be the default
}
}
然后使用isAlive(x+1,y+1)
而不是generation[x+1][y+1].isIsAlive()
等等
此外,我的印象是,您错误地声明了一个局部变量int neights=0;
。我这样说是因为您在最后一直将其设置为0
,但您没有将其存储在任何地方。我个人会在generation
的基类中定义一个字段neights
,并且:
for(int x= 0 ; x < generation.length ; x++ ) {
for(int y= 0 ; y < generation[x].length ; y++ ) {
generation[x][y].neighbors= 0 ;
for(int dx= -1 ; dx <= 1 ; dx++ ) {
for(int dy= -1 ; dy <= 1 ; dy++ ) {
if( ! ( dx == 0 && dy == 0 ) && isAlive(x+dx,y+dx) ) {
generation[x][y].neighbors++;
}
}
}
}
现在,没有滥用异常(这是目前最推荐的),我想说添加一个函数
public boolean isValidNeighbor(int i,int j) {
return 0 <= i && i < generation.length && 0 <= j && j < generation[i].length ;
}
公共布尔值isValidNeighbor(int i,int j){
返回0答案是:不要。不要对非异常控制流使用异常。这是一个类似的通过预期的代码流问题:除了常见的可读性问题外,我还做了一些效率测试。这会导致糟糕的读取。“太长的未读取”是异常比实例慢20倍(这本身相当慢)根据一般建议;使用“9”是一个神奇的数字;不好。如果数组大小发生变化,请使用array.length。您可以使用array[0].length获得第二个维度。您使用的if语句几乎相同;有点不好。使用两个嵌套for语句,每个语句都介于-1和1之间(如果两者都是0,则使用continue)。这避免了复制和粘贴代码的重复使用,并使您的逻辑在以后发生更改时更易于重写(并为您节省了编写无聊ifs的工作量)您正在使用一段时间模拟for循环。为什么要这样做?这会使代码难以读取,并可能导致代码中出现错误,因为每次通过x循环y都没有重置为0。答案是:不要。不要对非异常控制流使用异常。这是一个类似的通过期望的代码流问题:除了通常的可读性问题我做了一些关于效率的测试。这会导致糟糕的阅读。根据一般建议,“太长时间没有阅读”是异常的速度比一个实例慢20倍(它本身相当慢);使用“9”是一个神奇的数字;