从某个KeyEvent开始的类强制转换异常

时间:2015-03-09 23:35:40

标签: java debugging classcastexception

在同一个游戏中我的旧问题仍在改进,但这次我现在有四个类和另一个异常错误。仍然相同" Java是第二语言,但似乎无法证明我的中间C ++标签。"

Briefer:在2到2。5年的时间里制作游戏,必须用我不熟悉的语言来做,因为我们团队中的多数统治(三个java,一个C ++,一个php家伙)。我用这个"迷你"测试机械。游戏并试图修复破坏的东西,但这个(以及其他)是我似乎无法自己解决的另一个问题。 我试过论坛并且已经撇去通过我们的一些旧的自学java书籍。

我需要帮助来解决如何修复类强制转换异常的情况。

我的代码并简要说明了应该发生的事情:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import javax.swing.JPanel;
import javax.swing.Timer;

public class Stage extends JPanel implements ActionListener
{
private static final long serialVersionUID = 1L;
private Timer start_stop;
private SPRITES player;
public Stage()
{
    addKeyListener(new TAdapter());
    setFocusable(true);
    setBackground(Color.black);
    setDoubleBuffered(true);

    player = new SPRITES();

    start_stop = new Timer(5, this);
    start_stop.start();

}

public void paint(Graphics character)
{
    super.paint(character);

    Graphics2D G2D = (Graphics2D) character;
    G2D.drawImage(player.getImage(), player.getX(), player.getY(), this);

    @SuppressWarnings("rawtypes")
    ArrayList ms = player.getMissiles();
    Toolkit.getDefaultToolkit().sync();
    character.dispose();

      for (int i = 0; i < ms.size(); i++ ) 
      {
            SPRITES m = (SPRITES) ms.get(i); //error here
            G2D.drawImage(m.getImage(), m.getX(), m.getY(), this);

            if(m.isVisible())
                m.move();
            else ms.remove(i);
      }
      }

      public void actionPerformedjuan(ActionEvent e) 
      {
            @SuppressWarnings("rawtypes")
            ArrayList ms = player.getMissiles();

            for (int i = 0; i < ms.size(); i++) 
            {
                SPRITES m = (SPRITES) ms.get(i);
                if (m.isVisible()) 
                    m.move();
                else ms.remove(i);  
            }
      player.move();
      repaint();
      }

public void actionPerformed(ActionEvent arg0) 
{
    player.move();
    repaint();
}

private class TAdapter extends KeyAdapter
{
    public void keyReleased(KeyEvent e)
    {
        player.keyReleased(e);
    }

    public void keyPressed(KeyEvent e)
    {
        player.keyPressed(e);
    }
}
}

设置舞台,获取背景色并准备好导入的图片。

import java.awt.event.KeyEvent;
import java.awt.Image;
import java.util.ArrayList;

import javax.swing.*;

public class SPRITES extends JPanel
{
private static final long serialVersionUID = 1L;

private static int x_sped;
private static int y_sped;
private static int x;
private static int y;
private Image sprite;

@SuppressWarnings("rawtypes")
private static ArrayList missiles;
private final static int sprite_size = 20;
@SuppressWarnings("rawtypes")
public SPRITES()
{
    ImageIcon pine = new ImageIcon(this.getClass().getResource("/resouse/SHIP.png")); 
    sprite = pine.getImage();
    missiles = new ArrayList();
    x = 40;
    y = 60;
}

public void move()
{
    x += x_sped;
    y += y_sped;
}

public int getX()
{
    return x;
}

public int getY()
{
    return y;
}

public Image getImage()
{
     return sprite;
}

@SuppressWarnings("rawtypes")
public ArrayList getMissiles()
 {
        return missiles;
 }
 @SuppressWarnings("unchecked")
public static void fire() 
{
    missiles.add(new Mussiles(x + sprite_size, y + sprite_size/2));
}
public void keyPressed(KeyEvent e)
{
    int key = e.getKeyCode();

    if(key == KeyEvent.VK_SPACE)
    {
        fire();
    }
    if(key == KeyEvent.VK_A)
    {
        x_sped = -1;
    }

    if(key == KeyEvent.VK_D)
    {
        x_sped = 2;
    }

    if(key == KeyEvent.VK_W)
    {
        y_sped = -1;
    }

    if(key == KeyEvent.VK_S)
    {
        y_sped = 1;
    }


}


public void keyReleased(KeyEvent e)
{
int key = e.getKeyCode();

    if(key == KeyEvent.VK_A)
    {
        x_sped = 0;
    }

    if(key == KeyEvent.VK_D)
    {
        x_sped = 0;
    }

    if(key == KeyEvent.VK_W)
    {
        y_sped = 0;
    }

    if(key == KeyEvent.VK_S)
    {
        y_sped = 0;
    }
}
}

进行动作并导入图片。它也应该用空格键从船上射出我的导弹,或者至少建立这个想法的结构。

import java.awt.Image;

import javax.swing.ImageIcon;

public class Mussiles 
{
private int x, y;
private Image missile;
boolean visible;

private final int width = 30;
private final int missile_sped = 2;

public Mussiles(int x, int y)
{
    ImageIcon pine = new ImageIcon(this.getClass().getResource("/resouse/missile.png"));
    missile = pine.getImage();
    visible = true;
    this.x = x;
    this.y = y; 
}

public Image getImage()
{
    return missile;
}

public int getX()
{
    return x;
}

public int getY()
{
    return y;
}

public boolean isVisible()
{
    return visible;
}

public void move()
{
    x += missile_sped;
    if(x > width)
        visible = false;
}
}

进口导弹,并在它不直接出现在屏幕上时看不见。

import javax.swing.JFrame;

@SuppressWarnings("serial")
public class Framing extends JFrame
{
public Framing()
{
    add(new Stage());

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(800, 600);
    setLocationRelativeTo(null);
    setTitle("Failing Mini Game");
    setResizable(false);
    setVisible(true);
}
public static void main(String[] args)
{
        new Framing();  
}
}

将所有课程联系在一起,使其全部运转。

我遇到的问题是当我按空格按钮开火时。它只是在控制台上出现错误,如果我读到了eclipse回溯,它会在第一堂课中显示出来:

          SPRITES m = (SPRITES) ms.get(i); //error here

据我所知,这是因为我导入的是非扩展或已实现的对象。这就是我如何解决这个问题的方法。 我是否将此一般代码区域放在另一个类中,或者是否有更智能的方法来解决此问题?

我还想知道是否有人知道一个好的几乎是外行的简单指导调试,我还没有听说过任何详细的解释,但不是太麻烦的麻烦细节。

2 个答案:

答案 0 :(得分:3)

public class Mussiles { ...这不是SPRITES的类型,而是将其添加到missiles ArrayList

missiles.add(new Mussiles(x + sprite_size, y + sprite_size/2));

这是ClassCastException的原因,因为Mussiles无法将SPRITES视为Mussiles的实例。

首先,确保SPRITESArrayList延伸,然后将SPRITES更新为仅限于private static ArrayList<SPRITES> missiles; 类型

static

(nb:对于实例类,你应该避免@SuppressWarnings("rawtypes"),它们只会给你带来问题)

这也意味着你可以摆脱public ArrayList<SPRITES> getMissiles() { //... ,你真的应该避免,因为编译器试图警告你刚刚遇到的潜在问题......

同时更新您的方法以反映此限制......

ArrayList<SPRITES> ms = player.getMissiles();

for (int i = 0; i < ms.size(); i++) 
{
    SPRITES m = ms.get(i);

这也意味着你不需要盲目的案例值,因为现在类型将被更严格地定义......

{{1}}

查看Generics Trail了解更多详情

答案 1 :(得分:2)

您的班级Mussiles不是SPRITE。

另外,正常ArrayList并不能保证您返回SPRITE。尝试将其声明更改为ArrayList<SPRITE>,以便它只能保存SPRITE对象(并相应地更新其他值)这样更安全。