GUI中的Java StackOverflowException

格里高里·博古什(Grigory Bogush)

所以我有这个小蛇游戏,并且我得到了StackOverflow错误,看起来像这样:

 Exception in thread "main" java.lang.StackOverflowError
at java.awt.Component.setBackground(Component.java:1835)
at javax.swing.JComponent.setBackground(JComponent.java:2733)
at javax.swing.LookAndFeel.installColors(LookAndFeel.java:175)
at javax.swing.LookAndFeel.installColorsAndFont(LookAndFeel.java:211)
at javax.swing.plaf.basic.BasicPanelUI.installDefaults(BasicPanelUI.java:66)
at javax.swing.plaf.basic.BasicPanelUI.installUI(BasicPanelUI.java:56)
at javax.swing.JComponent.setUI(JComponent.java:666)
at javax.swing.JPanel.setUI(JPanel.java:153)
at javax.swing.JPanel.updateUI(JPanel.java:126)
at javax.swing.JPanel.<init>(JPanel.java:86)
at javax.swing.JPanel.<init>(JPanel.java:109)
at javax.swing.JPanel.<init>(JPanel.java:117)
at SnakeGame.Animation.<init>(Animation.java:36)
at SnakeGame.Snake.<init>(Snake.java:24)
at SnakeGame.Animation.<init>(Animation.java:38)
at SnakeGame.Snake.<init>(Snake.java:24)

我知道正在进行一些无限递归,但是我不明白。似乎只是一个构造函数。所以这是Animation类的代码:

//imports are there
interface Drawable{
public void draw(Graphics g);
}


public class Animation extends JPanel implements ActionListener,   KeyListener{

JFrame frame;
List <Drawable> toDraw;
Snake snake;
Food food;
Timer timer;

public static boolean gameOver = false;
public static int UNIT = 20;
public static int SIZE = 500;


public static void main(String[] args){
   Animation animate = new Animation();
   animate.setUpFrame();
}

Animation(){

    toDraw = new ArrayList<>(); // this is line 38 from exception
    snake = new Snake(SIZE/2,SIZE/2);
    food = new Food();
    toDraw.add(snake);
    toDraw.add(food);
    initTimer();
}

void initTimer(){
    timer = new Timer(200, this);
    timer.setInitialDelay(1000);
    timer.start();
}

void setUpFrame(){
    frame = new JFrame("Snake");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(SIZE, SIZE);
    frame.setFocusable(true);
    frame.setVisible(true);
    frame.add(this);
}

void gameRun() {
       //haven't written here anything yet.  
}  

   @Override
public void paintComponent(Graphics g){
    super.paintComponent(g);
    this.setBackground(new Color(70,130,80));

    for(Drawable d : toDraw){
        d.draw(g);
    }  

}

@Override
public void actionPerformed(ActionEvent e) {
        gameRun();
        repaint();
}


@Override
public void keyTyped(KeyEvent e) {

}

@Override
public void keyPressed(KeyEvent e) {
    int c = e.getKeyCode();
    switch(c){
        case 'L':
           snake.setDirection('L');
            break;
        case 'R':
            snake.setDirection('R');         
            break;
        case 'U':
            snake.setDirection('U');
            break;
        case 'D':
            snake.setDirection('D');
            break;
    }
}

@Override
public void keyReleased(KeyEvent e) {

}

}

这是蛇类:

   public class Snake extends Animation implements Drawable {

int x;
int y;
char direction = 'N';

Snake(int x, int y){ //line 24 from exception
    this.x = x;
    this.y = y;
}


void setDirection(char way){
    direction = way;
}
void move(char direction){

    if(x < 0){
      x = SIZE;  
    } 
    else if(x > SIZE){
        x = 0;
    }
    if(y < 0){
        y= SIZE;
    }else if (y > SIZE){
        y = 0;
    }

    switch(direction){
        case 'L':
            x-= UNIT;
            break;
        case 'R':
            x+= UNIT;              
            break;
        case 'U':
            y-= UNIT;    
            break;
        case 'D':
            y+= UNIT;
            break;
    }  
}

@Override
public void draw(Graphics g) {
    g.setColor(new Color(160,2,42));
    g.fill3DRect(x, y, UNIT, UNIT, true);
  }  
}

任何帮助将不胜感激!

充满鳗鱼的气垫船

由于程序的继承结构,您会有意外的递归:

您的Snake扩展了Animation ,该动画在其构造函数中创建了一个Snake,然后又扩展了Animation 该动画在其构造函数中创建了一个Snake,并扩展了Animation 该动画在其构造函数创建了一个Snake,该动画在其构造函数中创建了Snake,在其构造函数中扩展了一个Snake,在其构造函数中扩展了Animation ,后者在其构造中创建了Snake构造函数...等等...

解决方案:没有Snake扩展动画。而且这也是合乎逻辑的,因为您的Snake并未充当JPanel之类的Swing组件,因此不应从JPanel继承。而是它是由JPanel绘制的逻辑实体-因此您想在这里使用组合(您已经在做)而不是继承(不幸的是您也在做)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Lua中处理StackOverflowException

来自分类Dev

属性设置器中的StackOverflowException

来自分类Dev

TeamCity中带有JetBrains dotCover的StackOverflowException

来自分类Dev

99个Haskell问题。F#中的#7-stackoverflowexception

来自分类Dev

使用[JsonConverter]属性时,我的JsonConverter类中的StackOverflowException

来自分类Dev

索引器c#中的System.StackOverflowException

来自分类Dev

在回调中重用回调时如何防止StackOverflowException?

来自分类Dev

在将列表连接到列表框中获取StackOverflowException

来自分类Dev

VS2017 / 2019中构建时的StackOverflowException

来自分类Dev

递归ASP.NET树视图填充中的StackOverflowException

来自分类Dev

使用[JsonConverter]属性时,我的JsonConverter类中的StackOverflowException

来自分类Dev

如何在我的 C# 代码中防止 StackoverflowException

来自分类Dev

类的StackOverflowException

来自分类Dev

为什么在F#Interactive中打印5000个数字会导致StackOverflowException?

来自分类Dev

坐在窗口asp.net MVC中添加实体后的StackOverflowException

来自分类Dev

在C#中反序列化JSON文件时出现StackOverflowException

来自分类Dev

为什么我抛出了“System.StackOverflowException”类型的异常。在我自己的 htmlhelper 中?

来自分类Dev

application.exe 中类型为“System.StackOverflowException”的未处理异常

来自分类Dev

System.StackOverflowException错误

来自分类Dev

IEnumerable的多个枚举-StackOverflowException

来自分类Dev

如何解决StackOverflowException

来自分类Dev

Spring Security OAuth stackoverflowException

来自分类Dev

如何引发StackOverflowException

来自分类Dev

LINQ查询上的StackOverflowException

来自分类Dev

如何解决StackOverflowException

来自分类Dev

递归函数内的StackOverFlowException

来自分类Dev

如何处理StackOverflowException

来自分类Dev

循环获取StackOverflowException

来自分类Dev

素数递归StackOverflowException

Related 相关文章

  1. 1

    在Lua中处理StackOverflowException

  2. 2

    属性设置器中的StackOverflowException

  3. 3

    TeamCity中带有JetBrains dotCover的StackOverflowException

  4. 4

    99个Haskell问题。F#中的#7-stackoverflowexception

  5. 5

    使用[JsonConverter]属性时,我的JsonConverter类中的StackOverflowException

  6. 6

    索引器c#中的System.StackOverflowException

  7. 7

    在回调中重用回调时如何防止StackOverflowException?

  8. 8

    在将列表连接到列表框中获取StackOverflowException

  9. 9

    VS2017 / 2019中构建时的StackOverflowException

  10. 10

    递归ASP.NET树视图填充中的StackOverflowException

  11. 11

    使用[JsonConverter]属性时,我的JsonConverter类中的StackOverflowException

  12. 12

    如何在我的 C# 代码中防止 StackoverflowException

  13. 13

    类的StackOverflowException

  14. 14

    为什么在F#Interactive中打印5000个数字会导致StackOverflowException?

  15. 15

    坐在窗口asp.net MVC中添加实体后的StackOverflowException

  16. 16

    在C#中反序列化JSON文件时出现StackOverflowException

  17. 17

    为什么我抛出了“System.StackOverflowException”类型的异常。在我自己的 htmlhelper 中?

  18. 18

    application.exe 中类型为“System.StackOverflowException”的未处理异常

  19. 19

    System.StackOverflowException错误

  20. 20

    IEnumerable的多个枚举-StackOverflowException

  21. 21

    如何解决StackOverflowException

  22. 22

    Spring Security OAuth stackoverflowException

  23. 23

    如何引发StackOverflowException

  24. 24

    LINQ查询上的StackOverflowException

  25. 25

    如何解决StackOverflowException

  26. 26

    递归函数内的StackOverFlowException

  27. 27

    如何处理StackOverflowException

  28. 28

    循环获取StackOverflowException

  29. 29

    素数递归StackOverflowException

热门标签

归档