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

使用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

我正在使用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 ;
}
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