繁体   English   中英

使用Java在内部方法中使用非最终变量

[英]Use non-final variable inside inner method using 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?

您的代码存在一些问题:

    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;
}

Stultuske的解决方案是正确的。 但这并不能解释错误的原因。

简短的答案是,您不能在内部类中使用非最终局部变量。 它可以有效地是最终的(因此它实际上不需要关键字)。

JLS-8.1.3。 内部类和封闭实例

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

解释你的问题。

不是最终的,而且肯定不是有效的最终的,因为您的内部类会更改局部变量。

另一个解决方案:

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

如果需要最终的可变布尔值,可以使用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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM