使用Java

时间:2017-10-23 07:15:48

标签: java

我正在使用Jdbctemplate并尝试在mapRow方法中设置一个布尔值。但它不允许,它说

Cannot refer to a non-final variable isEveryTransactionNotClosed inside an inner class defined in a different method

这是我的代码

public boolean isEveryTransactionNotClosed (String txIds) throws QiibException {
    String sql = "<Query> ";
    logger.info("isEveryTransactionNotClosed SQL :"+sql);
    boolean isEveryTransactionNotClosed = true;
    try {
        isEveryDealNotClosed =  getJdbcTemplate().queryForObject(sql, new Object[] {dealIds}, 
                new RowMapper<Boolean>()  {
                public Boolean mapRow(ResultSet rs, int rowNum) throws SQLException {
                    if (!rs.next()) {
                        isEveryTransactionNotClosed = false;    -->                         
                    }
                }
        });
    } catch(EmptyResultDataAccessException e) {
        logger.error("Empty result data - isEveryTransactionNotClosed ");   
    }
   return isEveryTransactionNotClosed ;
}

如何在类中使用isEveryTransactionNotClosed?

3 个答案:

答案 0 :(得分:1)

您的代码存在一些问题:

    public boolean isEveryTransactionNotClosed (String txIds) throws QiibException {
        String sql = "<Query> ";
        logger.info("isEveryTransactionNotClosed SQL :"+sql);
        try {
            final boolean isEveryDealNotClosed =  getJdbcTemplate().queryForObject(sql, new Object[] {dealIds}, 
                    new RowMapper<Boolean>()  {
                    public Boolean mapRow(ResultSet rs, int rowNum) throws SQLException {
                        if (!rs.next()) {
                            isEveryTransactionNotClosed = false;    -->                         
                        }
                    }
            });
        } catch(EmptyResultDataAccessException e) {
            logger.error("Empty result data - isEveryTransactionNotClosed ");   
        }
       return isEveryTransactionNotClosed ;
    }

将解决您现在遇到的问题,这将带来两个新问题:

 1. You would try to re-assign a final variable
 2. Your method has a return value Boolean, but doesn't return anything.

将您的代码更改为:

public boolean isEveryTransactionNotClosed (String txIds) throws QiibException {
    String sql = "<Query> ";
    logger.info("isEveryTransactionNotClosed SQL :"+sql);
    boolean isEveryDealNotClosed = true;
    try {
        isEveryDealNotClosed =  getJdbcTemplate().queryForObject(sql, new Object[] {dealIds}, 
                new RowMapper<Boolean>()  {
                public Boolean mapRow(ResultSet rs, int rowNum) throws SQLException {
                    return rs.next();
                }
        });
    } catch(EmptyResultDataAccessException e) {
        logger.error("Empty result data - isEveryTransactionNotClosed ");   
    }
   return isEveryDealNotClosed;
}

答案 1 :(得分:1)

Stultuske的解决方案是正确的。但它没有解释错误的原因。

简短的回答是,你不能在内部类中使用非最终的局部变量。它可以是有效的最终(因此它并不真正需要关键字)。

来自JLS - 8.1.3. Inner Classes and Enclosing Instances

  

使用但未在内部类中声明的任何局部变量,形式参数或异常参数必须声明为final。

解释你的问题。

不是最终的并且确定无效最终,因为您的内部类会更改局部变量。

另一种解决方案:

  • 允许内部类访问和修改成员变量
  • 使用包装器创建价值的最终实例

答案 2 :(得分:1)

如果需要最终可更改的布尔值,可以使用AtomicBoolean代替布尔值。请参阅下面的代码更改。

但是,正如其他人所说,您的代码中还存在其他一些错误。您可能还需要对其进行更改以使其正常工作。

public boolean isEveryTransactionNotClosed (String txIds) throws QiibException {
    String sql = "<Query> ";
    logger.info("isEveryTransactionNotClosed SQL :"+sql);
    // changed line
    final AtomicBoolean isEveryTransactionNotClosed = new AtomicBoolean(true);
    try {
        isEveryDealNotClosed =  getJdbcTemplate().queryForObject(sql, new Object[] {dealIds}, 
                new RowMapper<Boolean>()  {
                public Boolean mapRow(ResultSet rs, int rowNum) throws SQLException {
                    if (!rs.next()) {
                        // changed line
                        isEveryTransactionNotClosed.set(false);                         
                    }
                }
        });
    } catch(EmptyResultDataAccessException e) {
        logger.error("Empty result data - isEveryTransactionNotClosed ");   
    }
   return isEveryTransactionNotClosed.get();
}