当前位置: 首页 > 知识库问答 >
问题:

在正在运行的线程对象中调用方法

孙佐
2023-03-14

我是Java初学者。我想在运行的Java线程对象中调用一个方法。它总是引发以下异常:

线程“AWT-EventQueue-0”java中出现异常。lang.NullPointerException:无法调用“Graphic\u handler.next()”,因为“this.this$0.grap”为null

public class Graphic_handler extends Thread {

    int off = 0;


    int columns = 7;
    int rows = 7;
    public Graphic_handler(Instagram_bot bot) {
    }

         

    public void run() {
   
        while (true) {
            try {
                Thread.sleep(1000);
            } catch (Exception e) {
                //TODO: handle exception
            }
            set_time();
        }

    }


    private void set_time() {
        Date date = Calendar.getInstance().getTime();
        DateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy    hh:mm:ss");
        String strDate = dateFormat.format(date);
        bot.date.setText(strDate);

    }

    public void change_center(int offset) {
    }

    public synchronized void next() {
        off++;
        notify();
    }

    public synchronized void last() {
        off--;
        notify();
    }
}

(代码已简化)

下面是我调用该方法的代码部分:

ActionListener right_ear = new ActionListener() {
    public void actionPerformed(ActionEvent e) {

        grap.next();
    };
};
ActionListener left_ear = new ActionListener() {
    public void actionPerformed(ActionEvent e) {

        grap.last();
    };
};


public static void main(String[] args) {

    Graphic_handler grap = new Graphic_handler(bot);
    grap.start();
    
}

我试图在这里调用方法Next()和last()。

共有1个答案

钱星华
2023-03-14

发生的事情是您有一个隐藏实例变量的局部变量。

class SomeClass {

   Graphic_handler grap;
   public static void main(String[] args) {

      Graphic_handler grap = new Graphic_handler(bot);
                      ^^^ this *hides* the other grap
      grap.start();
    
}

要解决这个问题,只需删除方法中grap前面的声明。

class SomeClass {

   Graphic_handler grap;
   public static void main(String[] args) {

      grap = new Graphic_handler(bot);
      grap.start();
    
}
 类似资料:
  • 我使用(全局声明)同时运行多线程。需要一个小时才能完成任务。因此,我需要获得当前运行的线程详细信息,如活动线程,排队线程和完成线程。 但事情是我需要停止在15分钟内发送新的请求到服务器或调用一些方法。 这里shutdown或shutdowNow停止执行器,但不停止这5个线程。这就是问题所在。所以我需要手动杀死那些线程。如何杀死executor服务中手动附加的线程?

  • 问题内容: 我是Java新手。有人可以帮我为什么不调用Run方法。提前致谢。 问题答案: 您需要将的实例传递给构造函数,以告诉新线程运行什么: (这是不幸的是,类已经以各种方式被设计得不好。这将是更有益的,如果它 不 具有方法本身,但 没有 强迫你传递到构造函数,然后你会发现在编译的问题-时间。)

  • 我正在尝试使用codeception和他的Mock和Stub库运行测试。发生的事情是,当我试图用存根运行测试时,它引发了一个在我的实际类中实现的错误。 我认为存根是隔离测试和模拟真实对象的方法。为什么它叫我真正的方法? 所以当我运行代码欺骗(PHPcodeception.phar运行): 问题是: 回溯会一直持续到类LoadAVG的真正实现,在这里我真正调用了rewind()函数,很明显,一旦这个

  • 是否可以强制Hazelcast在调用线程的TransactionalMap上运行put()、replace()和delete()方法?我希望XA事务从写到Hazelcast转移到写到MapStore中的数据库,但是Hazelcast正在排队等待在其他线程上运行的更改,因此它们不在相同的事务上下文中。 我已经将它设置为一个直写持久性,但我看到它将TxnSetOperation排队,并在单独的线程上运

  • 问题内容: 我有一个正在运行的线程,但是从外面我无法绕过一个值来停止该线程。如何在内部发送false / true值或调用运行线程的公共方法?当我按下按钮1?例如: 或 跟进(校对): 问题答案: 如果您通过类而不是通过a定义它,则可以调用实例方法。 还要注意,由于多个内核具有自己的关联内存,因此您需要警告处理器该状态可能在另一个处理器上更改,并且它需要监视该更改。听起来很复杂,但只需将’vola

  • 我创建了一个可运行的类a,它为我执行一些任务。我使用ExecutorService提交这个类,以便并行执行这些任务。 可运行类A调用另一个对象B,该对象发送一个AsyncFuture请求(future.get()one)。 我将可运行类A的单独对象提交给ExecutorService,但是,类B的对象由bean(单例)引用。这会导致线程执行出现问题吗? 我注意到类A的一些对象没有被任何线程执行。