Vaadin UI.access()抛出ExecutionException异常

4

我在Vaadin项目中看到了这个异常。然而,功能并没有真正的出现问题。在run()方法中的代码完成了它预期的任务,但是这个异常还是会出现。

E 140619 124701.131 [Thread-2] MainUI - Uncaught throwable: 
java.util.concurrent.ExecutionException: java.lang.NullPointerException
    at java.util.concurrent.FutureTask.report(FutureTask.java:122)
    at java.util.concurrent.FutureTask.get(FutureTask.java:188)
    at com.vaadin.server.VaadinSession$FutureAccess.get(VaadinSession.java:123)
    at com.vaadin.server.VaadinService.runPendingAccessTasks(VaadinService.java:1802)
    at com.vaadin.server.VaadinSession.unlock(VaadinSession.java:1012)
    at com.vaadin.server.VaadinService.ensureAccessQueuePurged(VaadinService.java:1763)
    at com.vaadin.server.VaadinService.accessSession(VaadinService.java:1729)
    at com.vaadin.server.VaadinSession.access(VaadinSession.java:1402)
    at com.vaadin.ui.UI.access(UI.java:1372)

这里发生了什么

ui.acccess(new Runnable() {
    @Override
    public void run() {
        //code here
    }
} 

我应该做什么?我能够捕获异常并忽略它吗,还是我的代码中存在错误?

这段代码使用@Push注解对MainUI进行了扩展,并且包含以下代码:

@Override
protected void init(VaadinRequest request) {
    WrappedSession wrappedSession = request.getWrappedSession();
    final String id = wrappedSession.getId();
    log.info("Created new UI for session id {}", id);

    VaadinSession.getCurrent().setErrorHandler(new DefaultErrorHandler() {
        @Override
        public void error(com.vaadin.server.ErrorEvent event) {
            super.error(event);
            log.error("Uncaught throwable: ", event.getThrowable());
        }
    });

    ...
}

另一个例子

[这部分由另一位作者添加]

我,Basil Bourque,在使用中遇到了似乎与此处相同的异常。该异常在生产环境中抛出(而非开发环境)。

使用Vaadin 7.1.3与Push,在Java 8 Update 20上使用Tomcat 8.0.12,在Mac OS X Mountain Lion上运行。

异常:

Nov 04, 2014 4:45:50 AM com.vaadin.server.DefaultErrorHandler doDefault
SEVERE: 
java.util.concurrent.ExecutionException: java.lang.NullPointerException
    at java.util.concurrent.FutureTask.report(FutureTask.java:122)
    at java.util.concurrent.FutureTask.get(FutureTask.java:192)
    at com.vaadin.server.VaadinSession$FutureAccess.get(VaadinSession.java:123)
    at com.vaadin.server.VaadinService.runPendingAccessTasks(VaadinService.java:1800)
    at com.vaadin.server.VaadinSession.unlock(VaadinSession.java:1013)
    at com.vaadin.server.VaadinService.ensureAccessQueuePurged(VaadinService.java:1761)
    at com.vaadin.server.VaadinService.accessSession(VaadinService.java:1727)
    at com.vaadin.server.VaadinSession.access(VaadinSession.java:1403)
    at com.vaadin.ui.UI.access(UI.java:1389)
    at com.rainwatersoft.powerwrangler.curr_sup_dem.CurrSupDemReportUpdater.update(CurrSupDemReportUpdater.java:164)
    at com.rainwatersoft.powerwrangler.curr_sup_dem.CurrSupDemReportUpdater.checkForUpdate(CurrSupDemReportUpdater.java:125)
    at com.rainwatersoft.powerwrangler.curr_sup_dem.CurrSupDemReportUpdater.lambda$considerUpdate$2(CurrSupDemReportUpdater.java:110)
    at com.rainwatersoft.powerwrangler.curr_sup_dem.CurrSupDemReportUpdater$$Lambda$3/1011224121.run(Unknown Source)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException

有问题的代码是使用Java 8的Lambda语法将一个Runnable传递给UI::access方法。

layout.getUI().access( () -> { // Runnable
    layout.freshen( this.interval );
} );

我觉得在会话管理中出现NPE很奇怪。你是否使用了某种形式的服务器推送? - André Schild
什么是服务器推送? - Nikolay Kuznetsov
https://vaadin.com/book/vaadin7/-/page/advanced.push.html - André Schild
是的,@Push public class MainUI extends UI { - Nikolay Kuznetsov
你调试过Vaadin服务器源代码并检查了什么导致了NullPointerException吗? - miq
显示剩余2条评论
2个回答

0

这是我代码的摘录:

// remember UI and request attributes
val ui = UI.getCurrent
val attributes = RequestContextHolder.getRequestAttributes

future.onSuccess {
  case e => ui.access(
    new Runnable {
      override def run(): Unit = {
        try {
          RequestContextHolder.setRequestAttributes(attributes)
          success.apply(e)
        } finally {
          RequestContextHolder.resetRequestAttributes()
        }
      }
    }
  )
}

future.onFailure {
  case t => ui.access(
    new Runnable {
      override def run(): Unit = {
        try {
          _logger.error("Something goes wrong in async await request", t)
          RequestContextHolder.setRequestAttributes(attributes)
          failure.apply(t)
        } finally {
          RequestContextHolder.resetRequestAttributes()
        }
      }
    }
  )
}

我正在使用最新的Vaadin 7.2.x与spring4vaadin。


0
我建议在jvm中使用-ea参数运行应用程序,以启用断言。通常情况下,这种异常是由其他有缺陷的代码引起的,例如您的ui.access(..)可能是正确的,但某些其他代码实际上锁定了UI,因此会抛出异常。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接