Конечная локальная переменная dc не может быть назначена, так как она определена в типе включения - PullRequest
1 голос
/ 15 октября 2019
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();
}

Мне было просто интересно, как я могу решить эту проблему. Я также получаю сообщение об ошибке «Состояние локальной переменной, определенное во внешней области видимости, должно быть окончательным или фактически окончательным» в переменной «состояние». Я считаю, что это потому, что я использую какой-то старый исходный код, который я нашел, однако я не могу найти решение.

1 Ответ

1 голос
/ 15 октября 2019

В Java вы ничего не можете назначить переменной, помеченной как final, кроме как в объявлении. С другой стороны, вам нужно, чтобы эти переменные были окончательными для использования в этом замыкании. Это может расстраивать после JS. Так что вам, возможно, потребуется сделать с этим конкретным кодом, чтобы переместить объявления переменных в замыкание, удалив модификатор final. Если вам все еще нужен доступ к ним извне, вы, вероятно, определите класс, который реализует интерфейс Runnable, и сделаете эти переменные полями экземпляров этого класса, хотя и получите методы.

Кроме того, действительно ли вынужен этот код для асинхронного запуска?

...