我正在使用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?
答案 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();
}