2013-04-05 160 views
0

,我發現了錯誤:異常線程 「main」 java.lang.ArrayIndexOutOfBoundsException:-1

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1 

at SnakeBox.neighbor(SnakeBox.java:150) 

at SnakeBox.findSnake(SnakeBox.java:86) 

at pg6a.main(pg6a.java:28) 

正在使用的類是:

/** This class can be used to manipulate 2D boxes of "snakes" for pg6. 
*/ 
    import java.util.*; 
    import java.io.*; 

public class SnakeBox { 

// instance variables 
    private char[][] box; 
    private int rows, columns; 
    private int snakeCount; 
    private int startRow, startCol; 
    private int endRow, endCol; 
    private boolean finish; 
    private int x, y; 
    private String toDisplay; 

/** Create and initialize a SnakeBox by reading a file. 
    @param filename the external name of a plain text file 
*/ 
    public SnakeBox(String filename) throws IOException{ 
    Scanner filescan = new Scanner(new FileReader(filename)); 
    rows = filescan.nextInt(); 
     columns = filescan.nextInt(); 
     snakeCount = filescan.nextInt(); 
     filescan.nextLine(); 
     box = new char[rows][columns]; 
    for (int i=0; i < rows; i++) { 
     String line = filescan.nextLine(); 
     for (int j=0; j < columns; j++) { 
      char character = line.charAt(j); 
      box[i][j] = character; 
     } 
    } 
    } 

    /** Create a new snakebox of a given size and snake count 
@param rows the height of the box 
@param cols the number of columns 
@param snakes how many snakes are in the box 
    */ 
    public SnakeBox(int rows, int cols, int snakes) { 
    this.rows = rows; 
    this.columns = cols; 
    this.snakeCount = snakes; 

    } 

/** Display the box on the screen. 
*/ 
    public void display() { 
    String toDisplay = ""; 
    for (int row = 0; row < rows; row++) { 
     for (int column = 0; column < columns; column++) { 
      toDisplay += box[row][column]; 
     } 
     toDisplay += '\n'; 
    } 
     System.out.print(toDisplay); 

    } 

/** Find the next snake, skinning to change it from S to . 
*/ 
    public void findSnake() { 
    // check to make sure there are still snakes to skin 
     if (finish = true) {    
    int row, col, nb; 
    // find an S to search from 
     outerloop: 
     for (int k=0; k < rows; k++) { 
      for (int l=0; l < columns; l++) { 
      if (box[k][l] == 'S') { 
      startRow = k; 
      startCol = l; 
      endRow = k; 
      endRow = l; 
      break outerloop; 
      } 
     } 
     } 
    // set your initial S position to both start and end 

    // search from end, updating it as you go 
    do { 
     nb = neighbor(endRow, endCol); 
     switch (nb) { 
      case 1: endRow--; endCol--; 
       break; 
      case 2: endRow--; 
       break; 
      case 3: endRow--; endCol++; 
       break; 
      case 4: endCol--; 
       break; 
      case 5: endCol++; 
       break; 
      case 6: endCol--; endRow++; 
       break; 
      case 7: endRow++; 
       break; 
      case 8: endRow++; endCol++; 
       break; 
     } 
    } while (nb != 0); 

    // search from start, updating it as you go 
    do { 
     nb = neighbor(startRow, startCol); 
     switch (nb) { 
      case 1: startRow--; startCol--; 
       break; 
      case 2: startRow--; 
       break; 
      case 3: startRow--; startCol++; 
       break; 
      case 4: startCol--; 
       break; 
      case 5: startCol++; 
       break; 
      case 6: startCol--; startRow++; 
       break; 
      case 7: startRow++; 
       break; 
      case 8: startRow++; startCol++; 
       break; 
     } 
    } while (nb != 0); 

    // update snake count 
     snakeCount = snakeCount - 1;   
     //display start/end points of the snake, then display it 
    } 
/** Change a position from S to . and find a neighboring S if one exists. 
    @param x the row number of the position to change 
    @param y the column number of the position to change 
    @return 0 if no S neighbor was found, or a number from this grid 
    indicating the position of the found neighbor 
      1 2 3 
      4 S 5 
      6 7 8 
*/ 
    } 
    private int neighbor(int x, int y) { 
     box[x][y] = '.'; 

     if (box[x--][y--] == 'S') 
     return 1; 

     if (box[x--][y] == 'S') 
     return 2; 

     if (box[x--][y++] == 'S') 
     return 3; 

     if (box[x][y--] == 'S') 
     return 4; 

     if (box[x][y++] == 'S') 
     return 5; 

     if (box[x++][y--] == 'S') 
     return 6; 

     if (box[x++][y] == 'S') 
     return 7; 

     if (box[x++][y++] == 'S') 
     return 8; 

     else   
    return 0;  

    } 

/** Display the endpoints of the snake most recently skinned. 
*/ 
    public void printEnds() { 
    System.out.print("(" + x + "," + y + ")"); 
    } 

/** Find out how many full snakes are in the box. 
    @return the snake count 
*/ 
    public int getCount() { 
    return snakeCount;  
    } 

/** Check whether all the snakes have been skinned, based on the snake count. 
    @return true if done, false otherwise 
*/ 
    public boolean finished() { 
    if (snakeCount == 0) { 
    finish = true; 
    } 
    else { 
    finish = false; 
    }  
    return finish; 
    } 

    } 

此外,驅動程序( PG6)是:

import java.util.*; 
import java.io.*; 

public class pg6a { 

    public static void main(String[] args) throws IOException { 
    Scanner keyboard = new Scanner(System.in); 

    System.out.println("Please enter the name of the file where your snake box resides, and we will try our very best to eliminate all the snakes in your snake box!"); 
    String filename; 
    filename = keyboard.nextLine(); 
    SnakeBox snakes = new SnakeBox(filename); 
    snakes.display(); 

    while (snakes.finished() == false) { 
     snakes.findSnake(); 
     snakes.printEnds(); 
     snakes.display(); 
     System.out.print(snakes.getCount()); 
    }      
    } 
} 
+0

錯誤涉及行: nb = neighbor(endRow,endCol); if(box [x - ] [y] =='S') return 2; 並從驅動程序: snakes.findSnake(); – AbsoluteBeginner 2013-04-05 05:28:55

回答

1
box[x--][y--] 

你是不是檢查的b在嘗試訪問它們之前,該框的邊界條件。而且,使用x--會在每個階段更改x的值。使用它們絕對 - x-1

你的其他變量從同一個問題,因爲在這些neighbor()陳述ifcase 2: endRow--;

+0

如何在嘗試訪問盒子之前檢查盒子的邊界條件? – AbsoluteBeginner 2013-04-05 05:39:19

+0

if(y < 0 || y > = box [x] .length)這將告訴你,如果你訪問的數組索引超出範圍。使用類似的代碼檢查x的邊界。 – 2013-04-05 05:43:37

2

其苦。

if (box[x--][y--] == 'S') - 這個結果是否爲true or false,這將減小您的x & y

同樣,您所有的if報表將保留decrementingincrementingx & y。這就是爲什麼在某一點上,xy或兩者的值都低於0,因此數組中的index-1。因此ArrayIndexOutOfBoundsException

您可以通過使用if聲明x-1 & y+1解決它,而不是increment/decrement運營商。

此行SnakeBox.neighbor(SnakeBox.java:150)說,在neighbor方法存在錯誤,只是看在neighbor()方法if聲明,告訴你什麼可能可能出了錯。

+0

如果你添加了代碼中的錯誤(提示:讀取堆棧跟蹤可能?),那會更好嗎? – 2013-04-05 05:27:19

+0

在使用增量/減量運算符之前,我使用了x-1和y + 1,但是得到了相同的錯誤消息。 – AbsoluteBeginner 2013-04-05 05:30:47

+0

@LuiggiMendoza - 檢查更新的答案。 – SudoRahul 2013-04-05 05:31:52

相關問題