使用Java在内部方法中使用非最终变量
我正在使用Jdbctemplate并试图在mapRow方法中设置一个布尔值。但它说,这是不允许的使用Java在内部方法中使用非最终变量,java,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 QiibExcepti
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 ;
}
public boolean isEveryTransactionNotClosed(字符串txIds)引发异常{
字符串sql=“”;
info(“ISeveryTransactionNotClosedSQL:+SQL”);
布尔值isEveryTransactionNotClosed=true;
试一试{
ISeveryDetailNotClosed=getJdbcTemplate().queryForObject(sql,新对象[]{dealId},
新的行映射器(){
公共布尔映射行(ResultSet rs,int rowNum)抛出SQLException{
如果(!rs.next()){
isEveryTransactionNotClosed=false;-->
}
}
});
}捕获(EmptyResultDataAccessE异常){
logger.error(“空结果数据-isEveryTransactionNotClosed”);
}
返回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 ;
}
将代码更改为:
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;
}
public boolean isEveryTransactionNotClosed(字符串txIds)引发异常{
字符串sql=“”;
info(“ISeveryTransactionNotClosedSQL:+SQL”);
布尔值IseveryDetailNotClosed=true;
试一试{
ISeveryDetailNotClosed=getJdbcTemplate().queryForObject(sql,新对象[]{dealId},
新的行映射器(){
公共布尔映射行(ResultSet rs,int rowNum)抛出SQLException{
返回rs.next();
}
});
}捕获(EmptyResultDataAccessE异常){
logger.error(“空结果数据-isEveryTransactionNotClosed”);
}
返回值为verydeallnotclosed;
}
您的代码存在一些问题:
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 ;
}
将代码更改为:
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;
}
public boolean isEveryTransactionNotClosed(字符串txIds)引发异常{
字符串sql=“”;
info(“ISeveryTransactionNotClosedSQL:+SQL”);
布尔值IseveryDetailNotClosed=true;
试一试{
ISeveryDetailNotClosed=getJdbcTemplate().queryForObject(sql,新对象[]{dealId},
新的行映射器(){
公共布尔映射行(ResultSet rs,int rowNum)抛出SQLException{
返回rs.next();
}
});
}捕获(EmptyResultDataAccessE异常){
logger.error(“空结果数据-isEveryTransactionNotClosed”);
}
返回值为verydeallnotclosed;
}
的解决方案是正确的。但这并不能解释错误的原因
简而言之,您不能在内部类中使用非最终局部变量。它可以是有效的最终版本(因此它实际上不需要关键字)
从
在内部类中使用但未声明的任何局部变量、形式参数或异常参数都必须声明为final
解释你的问题
它是非final,并且肯定不是有效的final,因为您的内部类更改了局部变量
其他解决方案:
- 允许内部类访问和修改成员变量
- 使用包装器创建最终实例,并保存您的值
- 允许内部类访问和修改成员变量
- 使用包装器创建最终实例,并保存您的值
- 的解决方案是正确的。但这并不能解释错误的原因
简而言之,您不能在内部类中使用非最终局部变量。它可以是有效的最终版本(因此它实际上不需要关键字)
从
在内部类中使用但未声明的任何局部变量、形式参数或异常参数都必须声明为final
解释你的问题
它是非final,并且肯定不是有效的final,因为您的内部类更改了局部变量
其他解决方案:
原子布尔值
代替布尔值。有关代码的更改,请参见下文
但是,正如其他人所说,代码中还有一些其他错误。为了使它工作,您可能也需要更改它
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();
}
public boolean isEveryTransactionNotClosed(字符串txIds)引发异常{
字符串sql=“”;
info(“ISeveryTransactionNotClosedSQL:+SQL”);
//换行
最终AtomicBoolean isEveryTransactionNotClosed=新的AtomicBoolean(真);
试一试{
ISeveryDetailNotClosed=getJdbcTemplate().queryForObject(sql,新对象[]{dealId},
新的行映射器(){
公共布尔映射行(ResultSet rs,int rowNum)抛出SQLException{
如果(!rs.next()){
//换行
isEveryTransactionNotClosed.set(false);
}
}
});
}捕获(EmptyResultDataAccessE异常){
logger.error(“空结果数据-isEveryTransactionNotClosed”);
}
返回isEveryTransactionNotClosed.get();
}
如果需要最终的可变布尔值,可以使用原子布尔值
代替布尔值。有关代码的更改,请参见下文
但是,正如其他人所说,代码中还有一些其他错误。为了使它工作,您可能也需要更改它
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();
}
public boolean isEveryTransactionNotClosed(字符串txIds)引发异常{
字符串sql=“”;
info(“ISeveryTransactionNotClosedSQL:+SQL”);
//换行
最终AtomicBoolean isEveryTransactionNotClosed=新的AtomicBoolean(真);
试一试{
ISeveryDetailNotClosed=getJdbcTemplate().queryForObject(sql,新对象[]{dealId},
新的行映射器(){
公共布尔映射行(ResultSet rs,int rowNum)抛出SQ