[英]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的解决方案是正确的。 但这并不能解释错误的原因。
简短的答案是,您不能在内部类中使用非最终局部变量。 它可以有效地是最终的(因此它实际上不需要关键字)。
使用的但未在内部类中声明的任何局部变量,形式参数或异常参数必须声明为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.