【问题标题】:Calling a method through an extended class only works if the Method is overridden java [closed]只有在方法被覆盖 java [关闭] 时,通过扩展类调用方法才有效
【发布时间】:2014-01-06 01:50:21
【问题描述】:

我有 4 个类(Core、GameMain、Spriter、Character)
- GameMain 扩展核心(核心 >> GameMain)
- 字符扩展 Spriter(Spriter >> 字符)

如果我调用 - b.get...() - 方法而不在 Character 中覆盖它们,我会得到 NullPointerException(它们最初在 Spriter 中,我从 GameMain 通过 Character 调用它们)。

我在 Core 中创建 Character 对象并将其放入 ArrayList 中

public abstract class Core {
  ArrayList<Character> mon = new ArrayList<Character>();
  void gameloop(){
     while(running){
       //some code
       while(mon.size() < 2){
          mon.add(new Character(blk_1,5,1));// Character(Spriter, Long, Long){}
       }
       draw(g);
     }
  }
}

然后在 GameMain 中我调用了一个原本在 Spriter 中的方法,但我通过 Character 调用它。

public class GameMain extends Core{
  public  void draw(Graphics2D g){
     for(Character b : mon){ //mon is the ArrayList<Character>

        if(test.getCoordY() <= b.getCoordY() - (b.getHeight()/2)){ //<<<< NullPointerException caused by these two Methods , test is a Spriter class

            g.drawImage(chChange(), Math.round(test.getX()), Math.round(test.getY()), test.getWidth(), (test.getHeight()), null); 
            g.drawImage(b.getImage(), Math.round(b.getX()), Math.round(b.getY()), null);

        }else {
            g.drawImage(b.getImage(), Math.round(b.getX()), Math.round(b.getY()), null);
            g.drawImage(chChange(), Math.round(test.getX()), Math.round(test.getY()), null);
        }
     } 
   }
}

这是 Spriter 的方法,除非我重写它,否则我会得到错误。

public class Spriter {
   Spriter(Image i){
      this.i = i;
      scenes = new ArrayList();

   }

   Spriter(){
      scenes = new ArrayList();
      start();
   }

   public int getHeight(){
    return i.getHeight(null);
   }
   public float getCoordY(){
      float cy;
      cy = y + i.getHeight(null); //<<<< NullPointerException happens here, Image i;
      return cy;
   }

   public void setX(float x){
    this.x = x;
   }

   public void setY(float y){
    this.y = y;
   }
   // other similar Methods but no problem with them
   //-------------------------------------- Animation Part ----------------------------------------------

public synchronized void addScene(Image i,long t){
    total_t+=t;
    scenes.add(new oneScene(i, total_t));
}

//start animation
public synchronized void start(){
    mov_time = 0;
    scn_indx = 0;
}

    // get current scene
public synchronized Image getAnimeImage(){
    if(scenes.size()==0){
        return null;
    }else{
        return getScene(scn_indx).pic;
    }
}


//get the scene
private oneScene getScene(int x){
    return (oneScene)scenes.get(x);
}


 private class oneScene{
    Image pic;
    long endTime;

    public oneScene(Image pic, long endTime){
        this.pic = pic;
        this.endTime = endTime;

    }
}
}

如果我这样做会起作用:

public class Character extends Spriter{
  public Character(Spriter s, long health, long power) {
     this.s = s;
     this.health = health;
     this.power = power;

     s.setX(randomY());
     s.setY(randomY());
  }

  public float getCoordY(){
     return s.getCoordY();
  }

  public float getHeight(){
     return s.getgetHeight();
  }
  //some other methods for health and power 
}

但是如果我这样做它可以工作吗(它已经给出了错误但如何避免它):

public class Character extends Spriter{
  public Character(Spriter s, long health, long power) {
      this.s = s;
      this.health = health;
      this.power = power;

      s.setX(randomY()); //setting x for the dynamiclly generated Character Object
      s.setY(randomY()); // same for y
  }

  //some methods for power and health
}

设置 x,y 进行测试(它是一个精灵并且工作得很好)

public class GameMain extends Core{
  public void init(){
    test.setX(500); test.setY(488);
  }

  public  void draw(Graphics2D g){
    //the above code
  }
}

如果它们完全相同,我看不出覆盖它们的意义。

【问题讨论】:

  • 您是在问如何修复异常,还是在问如何设计您的类以及是否要覆盖?在任何一种情况下,您都需要显示所有相关代码,而不是需要猜测才能填写 deyails 的零碎代码。
  • 什么是i,设置它的代码在哪里?
  • @atk 如果我覆盖该错误将不会出现......所以我问为什么我必须覆盖以及是否有导致此问题的错误
  • 除非您向我们展示您的代码并更具体地说明 NPE 发生的位置,否则我们无法判断。
  • @Sotirios,他指出了它发生的地方。我认为他在两个类之间有一个重复的字段,他正在设置一个副本并取消引用另一个。但这只是一个猜测——这就是我问这个问题的原因。

标签: java class methods extends dynamically-generated


【解决方案1】:

您的问题是,当您创建Character 时,您调用的是Spriter 的无参数构造函数,而不是带有Image 参数的构造函数。这意味着您的图像永远不会被设置;这就是为什么你有空指针异常。

您可能应该将Image 添加到Character 的构造函数参数中,并将其传递给超类构造函数,如下所示。

public Character(Spriter s, long health, long power, Image img) {
    super(img);

    // and so on.

@ElliottFrisch - 如果这就是你试图用你的答案说的话,我很抱歉。我不是要复制;我只是不太确定这是否是你的意思。无论如何,这绝对是问题所在。

【讨论】:

  • mon.add(new Character(test,5,1));mon.add(new Character(new Spriter(monster_pic),5,1)); 试过了,但结果是一样的
  • 您在此处评论中的 sn-ps 表明您根本没有接受我的建议。如果您更改了 Character 构造函数,这两个将无法编译。
  • 我将Spriter s 替换为Image img 还是保留它...如果我将img 传递给super,我看不到Spriter s 的使用,再加上图像保持其动画(精灵)
  • @DavidWallace 当我回答时没有代码......此时我不确定他尝试过什么。
  • 阅读我的代码,按照我的建议去做。您现有的所有构造函数都将保留 - 您将多出一个参数,并在顶部多出一行。
【解决方案2】:

我相信你的问题是你的班级 Character is-a Spriter 和 has-a Spriter (可能不应该“有”Spriter 但我不知道,因为你没有不要发布您的所有代码)。您从未初始化您的Charactersuper 实例。

public class Character extends Spriter{
  public Character(Spriter s, long health, long power) {
    // super(health, power); // <-- Speculation, no constructors shown in your code.
    this.s = s;
    this.health = health;
    this.power = power;

    super.setX(randomY()); //<-- set the super value
    super.setY(randomY()); //<-- again.
    // s.setX() // <-- not sure, why do you have s?
  }

【讨论】:

  • 抱歉,我困了,无法思考......我现在将发布更多代码,至于s,我用它来识别传入的精灵,就像它不是怪物还是老板一样对我来说,但为了平局(g)
  • @OmAr 听起来应该是雪碧……没有。
  • 你的意思是我删除了 Character 类?
  • @OmAr 我的意思是从 Character 类中删除 Sprite s 实例(如果需要,您可以从构造函数中保存一些状态)或者您可以继续“装饰”它。 . 这真的是你的电话。
  • 如果我删除了Spriter s,那么g.drawImage 将如何在行中获取图像:g.drawImage(b.getImage(), Math.round(b.getX()), Math.round(b.getY()), null);
猜你喜欢
  • 2023-03-12
  • 1970-01-01
  • 2011-12-13
  • 2018-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-28
  • 2011-08-21
相关资源
最近更新 更多