奇怪的java行为,嵌套闭包失去捕获的变量值

时间:2016-09-28 00:43:36

标签: java debugging

好的,这将有点长而复杂,我希望这里有一些橡皮筋。 我有这个代码,实际上有点复杂,但我认为我做了一个合理的工作来简化它:

private Result getResult(Request request, RequestType type) {                                                             
   final String date = request.getData(); // marker 1
   final DataSource jdbcDataSource = getDataSource();
   final JdbcOperations jdbcTemplate = newJdbcOperations(jdbcDataSource);
   final TransactionTemplate transactionTemplate = createTransactionTemplate(jdbcDataSource);      
   Supplier<Integer> createResult = () -> transactionTemplate.execute(transactionStatus -> {
      List<Map<String, Object>> rs = jdbcTemplate.queryForList("SELECT * FROM table");
      if (rs.size() > 0) {
         return ((Number) rs.get(0).get("count")).intValue();         
      } else {
         log.info(request + " not found in table");
      }
      if (type == TYPE1) {
         //...
      } else {
         throw new RuntimeException("unexpected type:" + type); // marker2
      }
      return 0;
   });
   int retryCount = 0;
   while (retryCount < 5) {
      try {
         totalCount = createResult.get();            
         break;
      } catch (DuplicateKeyException | DeadlockLoserDataAccessException e) {
         // log
      }
      retryCount++;
   }
}

这很好,除了今天app服务器进入停止工作的状态。该方法进入,过去行&#34; marker1&#34;所以我们知道请求不是null,然后继续记录&#34; null表中未找到&#34;建议请求变为null然后抛出runtimeException&#34; marker2&#34;因为类型也变成了null。 我不想这么说,但这真的只是闻起来像JVM中的一个错误,但这真的应该是最后一个考虑,所以我希望你,亲爱的橡皮鸭,会有一些想法。

0 个答案:

没有答案