Локальные переменные, на которые ссылается внутренний класс, должны быть окончательными или эффективно конечными

Пожалуйста, посмотрите на код ниже

private void displayInitialRevenue_Method() {
    //Get the dates from the combo
    String selectedCouple = revenueYearCombo.getSelectedItem().toString();
    if (selectedCouple.equals("Select Year")) {
        return;
    }
    String[] split = selectedCouple.split("/");
    //Related to DB
    double totalAmount = 0.0;
    //Get data from the database
    dbConnector = new DBHandler();
    dbConnector.makeConnection();
    DefaultTableModel model = (DefaultTableModel) initialRevenueTable.getModel();
    model.setRowCount(0);
    ResultSet selectAllDetails = dbConnector.selectAllDetails("SQL CODE ");
    try {
        if (selectAllDetails.isBeforeFirst() == false) {
            JOptionPane.showMessageDialog(null, "This table is empty");
        } else {
            while (selectAllDetails.next()) {
                String clientName = selectAllDetails.getString("Client Name");
                String providerName = selectAllDetails.getString("Provider Name");
                Double amountInvested = selectAllDetails.getDouble("Invest_Amount");
                //Update the table
                SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                        Object[] row = {clientName, providerName, amountInvested};
                        model.addRow(row);
                    }
                });
                //Get the total
                totalAmount = totalAmount + amountInvested;
            }
            //Add the sum
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    Object[] blankRow = {null};
                    model.addRow(blankRow);
                    Object[] row = {totalAmount};
                    model.addRow(row);

                }
            });
        }
    } catch (SQLException sql) {
        JOptionPane.showMessageDialog(null, sql.getLocalizedMessage());
    }
}

Весь этот метод выполняется внутри другого потока. Обновления интерфейса работают внутриSwingUtilities.InvokeLater(), Однако просьба обратить внимание на ниже.

Object[]row = {totalAmount};
model.addRow(row);

ПеременнаяtotalAmount не является окончательным и не может быть окончательным, потому что это должно быть рассчитано в приведенном вышеwhile loop, Так как это неfinal Я не могу использовать его внутриSwingUtilities.InvokeLater() как говорит ошибкаLocal variables referred from inner class must be final or effectively final

Ответы на вопрос(1)

Ваш ответ на вопрос