【问题标题】:The final local variable dc cannot be assigned, since it is defined in an enclosing type最终的局部变量 dc 无法赋值,因为它是在封闭类型中定义的
【发布时间】:2020-02-11 13:08:36
【问题描述】:
public static void createTable() {
    final DatabaseConnection dc;
    final Connection con;
    final String que;
    Statement state;
    new Thread(() -> {
        dc = new DatabaseConnection("check_table_exists");
        con = dc.con;
        que = "CREATE TABLE IF NOT EXISTS " + DatabaseConnection.TABLE + " (id INT(11) NOT NULL AUTO_INCREMENT,itemId INT(200), itemName VARCHAR(200), amount INT(200),uuid VARCHAR(200), timestamp BIGINT(200), PRIMARY KEY (id))";
        try {
            state = con.createStatement();
            state.execute(que);
            state.close();
            dc.close();
        }
        catch (SQLException e) {
            e.printStackTrace();
            dc.close();
        }
    }).start();
}

我只是想知道如何解决这个问题。我还在“状态”变量上收到错误“在封闭范围中定义的局部变量状态必须是最终的或有效的最终”。我相信这是因为我使用了一些我找到的旧源代码,但是,我似乎找不到解决方案。

【问题讨论】:

  • 我已经修复了上面的“在封闭范围内定义的局部变量状态必须是最终的或有效的最终状态”,但是,我现在收到以下问题 - “无法分配最终的局部变量状态,因为它是在封闭类型中定义的'
  • final DatabaseConnection dc = new DatabaseConnection("check_table_exists");

标签: java variables local-variables


【解决方案1】:

在 Java 中,您不能将任何内容分配给标记为 final 的变量,除非在声明中。另一方面,您需要这些变量是最终的才能在此闭包中使用。这在 JS 之后可能会让人感到沮丧。因此,您可能需要使用此特定代码将变量声明移动到闭包中,删除 final 修饰符。如果你还需要从外部访问它们,你可能会定义一个实现Runnable接口的类,并通过get方法使这些变量成为该类实例的字段。

另外,你真的需要这段代码异步运行吗?

【讨论】:

  • 实际上,你不能多次分配任何东西。
  • 设法把它全部弄清楚了,谢谢。
  • @StoxMC 很高兴听到!如果与建议的不同,您可能还想发布自己的解决方案并标记为最佳答案。
猜你喜欢
  • 2014-02-24
  • 1970-01-01
  • 2016-03-15
  • 2015-02-26
  • 2013-11-30
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
  • 1970-01-01
相关资源
最近更新 更多