【问题标题】:Java Applet - ArrayIndexOutOfBoundsExceptionJava 小程序 - ArrayIndexOutOfBoundsException
【发布时间】:2011-03-14 04:17:24
【问题描述】:

好的,所以我有这个小程序,它可以让玩家在图块之间移动他的 32x32 角色......并且任何时候他在地图边缘然后移动到其他任何地方......我得到一个 ArrayIndexOutOfBounds 异常。此外,当这种情况发生时,角色可以穿过被阻挡的瓷砖!然而,这只发生在东边和南边,但在南边,角色在离开边缘时不能穿过阻塞的瓷砖。

我不知道如何解决这个问题,也许你可以帮助我?

这是我解释我的问题的图片:

代码如下:

/** Tile Generator 程序员:Dan J. 感谢:g00se、pbl、曼尼。开始 2010 年 5 月 23 日 **/

导入 java.awt.;进口 java.awt.event.;进口 java.applet.小程序;导入 java.io.; 导入 java.util.;

公共类 tileGen 扩展 Applet 实现 KeyListener {

图像[] 瓦片; // 平铺数组图像 播放器; // 玩家图像 int x, y, px, py,tx,ty; // x 瓦片 - y 瓦片 // 玩家 x - 玩家 y // 瓷砖 x - 瓷砖 y 布尔左、右、下、上、 可以移动,重生; // 是真的?整数[][] 木板; // 最终的行图块 测绘体验!最终整数 NUM_TILES = 33; // 有多少个瓦片 我们实施?标签 lx, ly; // 到 看看我们在哪里!整数 r1, r2, u1,u2,l1,l2,d1,d2;

int lastX, lastY, row, col;标签 lbl1, lbl2, p1, p2;

公共无效初始化(){

board = loadBoard();

tiles = new Image[NUM_TILES];     for(int i = 0;i < NUM_TILES;i++) {
  tiles[i] = getImage(getClass().getResource(String.format("tiles/t%d.png",

i))); }

    player = getImage(getClass().getResource("player.png"));

// 我们的播放器 addKeyListener(this); 可以移动=真; int spawnX = 4; int spawnY = 4; 像素=0; py = 0; 最后X = 0; 最后一个 = 0; lbl1 = new Label("LastX", Label.LEFT); lbl2 = new Label("LastY", Label.LEFT);

      p1 = new Label("X", Label.LEFT);
      p2 = new Label("Y", Label.LEFT);
       add(lbl1);
       add(lbl2);

       add(p1);
       add(p2);
       this.setFocusable( true );
}

private static final HashSet<Integer> BLOCKED_TILES = new

HashSet();静态{
BLOCKED_TILES.add(24);
BLOCKED_TILES.add(0);
BLOCKED_TILES.add(6);
BLOCKED_TILES.add(25);
BLOCKED_TILES.add(3); //添加更多 瓷砖在这里}

public void keyPressed(KeyEvent e) {

if (isInBound(lastX,lastY) == true) { System.out.println("\n你走了 网格。\n"); }

  if (lastX > 0) {        r1 = lastX + 1;
  }else{      r1 = 0;         }       r2 = lastY;

  u1 = lastX;         if (lastY > 0) {         u2 = lastY - 1;         }else{
   u2 = 0;
   }



  if (lastX > 0) {        l1 = lastX - 1;
  }else{      l1 = 0;         }       l2 = lastY;

  d1 = lastX;         if (lastY > 0) {            d2

= 最后一个 Y + 1; }否则{ d2 = 0; }

  right = true;       left = true;        up =

真;向下=真;

尝试 { if (blocked(r1,r2) == true) 对=假; // 我们不能正确 如果(阻塞(u1,u2)==真)向上= 错误的; // 如果我们不能上升 (阻塞(l1,l2)==真)左=假; // 如果我们不能向左走 (阻塞(d1,d2)==真)向下=假; // 我们不能下去

  }catch(ArrayIndexOutOfBoundsException

dap) { System.out.println("数组索引 超出范围...:(\n" + dap.getCause()); }

如果(左==真){如果 (e.getKeyCode() == KeyEvent.VK_LEFT) { 左=真; 像素 = 像素 - 32; 最后X = 最后X - 1; } }

如果(对 == 真){ 如果 (e.getKeyCode() == KeyEvent.VK_RIGHT) { 对=真; 像素 = 像素 + 32; 最后X = 最后X + 1; } }

if (down == true) { 如果 (e.getKeyCode() == KeyEvent.VK_DOWN) { 向下=真; py = py + 32; 最后一个 = 最后一个 + 1; } }

如果(向上 == 真){

      if (e.getKeyCode() ==

KeyEvent.VK_UP) { 向上=真; py = py - 32; 最后一个 = 最后一个 - 1; } }

字符串 txtLastX = 整数.toString(px); lbl1.setText(txtLastX);

字符串 txtLastY = 整数.toString(py); lbl2.setText(txtLastY);

字符串 txtLastX1 = Integer.toString(lastX); p1.setText(txtLastX1);

字符串 txtLastX2 = Integer.toString(lastY); p2.setText(txtLastX2);重绘();

} public void keyReleased(KeyEvent e){

} // 忽略公共 void keyTyped(KeyEvent e){} // 忽略

public void paint(Graphics g) {

    for (row = 0; row < board.length; row++) {
        for (col = 0; col < board[row].length; col++) {
            int index = board[row][col];
            g.drawImage(tiles[index], 32 * col, 32

* 行,这个);

        }
    }
    if (respawn == false) {
    g.drawImage(player, px, py, this);    }   if (respawn == true) {      

g.drawImage(播放器, 0,0, this);
System.out.println("重生!");
重生=假; } } // 结束绘制方法

 public void update(Graphics g)
 {
      paint(g);
 }

public int[][] loadBoard() {
    int[][] board = {
            { 2,2,24,24,24,24,24,1,3,0,0,0 },
            { 2,2,24,23,23,23,24,1,3,0,0,0 },
            { 1,1,24,23,23,23,24,1,3,3,3,1 },
            { 1,1,24,24,23,24,24,1,1,1,1,1 },
            { 1,1,1,1,7,1,1,1,1,1,1,1 },
            { 5,1,1,1,7,7,7,7,7,1,1,1 },
            { 6,1,3,1,1,1,3,1,7,7,7,1 },
            { 6,1,3,1,3,1,1,1,1,1,7,3 }
        };    return board;
}

公共布尔阻塞(int tx,int ty) { 返回 BLOCKED_TILES.contains(board[ty][tx]); }

public boolean isInBound(int r, int C) { 返回 (r >= 0) && (r = 12) && (c

} // 结束整个事情

如果解决了,这会让我非常不伤心。 :-D 我确定问题出在地图板上... :\ 我的猜测...

谢谢, 丹

【问题讨论】:

  • 1.给出异常的堆栈跟踪。 2. 只给出代码的相关部分——即在发生异常的行附近。
  • 每当我添加 .printStackTrace 时,我都会收到错误“不允许使用 void”或类似...
  • 一堆编程风格的小问题:if ... inBound()... "You went off the grid!" - 这听起来像是倒退逻辑。如果你在界限之内,按照通常的定义,你就不会脱离网格。此外,所有== true 都是不必要的。您可以将if (right == true) 替换为if (right),将if (respawn == false) 替换为if (!respawn)
  • @Dan - 弄清楚导致编译错误的原因!
  • 我的意思是斯蒂芬... printStackTrace 错误发生在 java 小程序骨架上...@Carl...我知道...但我仍然不明白您可能的答案。

标签: java arrays applet


【解决方案1】:

我引用:

if (lastX > 0) {        r1 = lastX + 1;
  }else{      r1 = 0;         }       r2 = lastY;

  u1 = lastX;         if (lastY > 0) {         u2 = lastY - 1;         }else{
   u2 = 0;
   }

只有当 X 已经大于 0 时才增加 X?我认为您想确保它小于 x 的最大允许值!

编辑:更详细:

这是您正确的检查:

if (lastX > 0) {        r1 = lastX + 1;
  }else{      r1 = 0;         }       r2 = lastY;

  u1 = lastX;         if (lastY > 0) {         u2 = lastY - 1;         }else{
   u2 = 0;
   }

...这是您向左行驶的支票:

  if (lastX > 0) {        l1 = lastX - 1;
  }else{      l1 = 0;         }       l2 = lastY;

您在两种情况下都在检查同一件事!这在逻辑上一定是错误的。事实上,第一个检查是您让异常正确运行的原因:您询问向左移动是否安全,然后您向右移动!

【讨论】:

  • 很抱歉,这对我来说毫无意义。抱歉,英语不是我的母语... :(
  • 但是你建议我怎么做?
  • @Dan - 再试一次。对于我,这说得通。 “但是你建议我怎么做?”。他的第二句话解释了这一点。
  • 查看我的编辑。如果这没有帮助,请学会更加小心地工作。
  • @Carl - “...学会更仔细地工作” ...同意。我的印象是 OP 的代码没有经过深思熟虑和执行不力;例如,格式很糟糕。
猜你喜欢
  • 1970-01-01
  • 2015-11-09
  • 2014-08-31
  • 1970-01-01
  • 2013-11-10
  • 2021-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多