Вы используете объект в пределах области видимости в вашем коде. Для этого необходимо сделать объект JsonArray
постоянным. Ключевое слово final
в Java используется для объявления постоянного значения. Итак, ошибка говорит о том, что вы должны завершить (сделать постоянным) объект resultData
, чтобы использовать его внутри этой connection.query
области. Итак, просто добавьте ключевое слово final
перед JsonArray
в строке 60 вашего кода:
final JsonArray resultData = new JsonArray();
UPDATE: Если вы не можете объявить его окончательным, вам нужно использовать обходной путь, как указано в этом блоге. Вы можете объявить массив типа JsonArray размером 1, а затем изменить или использовать значение в 0-й позиции массива. Таким образом, объект будет объявлен окончательным без какого-либо ущерба. В строке 60 объявите final JsonArray[] resultData = { new JsonArray() };
Затем используйте resultData[0]
везде, где вы sh, чтобы использовать значение или изменить значение resultData[0] = value;
. Он также использует одно значение типа данных int, поэтому дополнительная память не будет использоваться.
Вот отредактированный код, который вы можете использовать:
@Override
public JsonArray fetchAllPages*JDBCClient dbClient) {
LOG.fo("INSIDE fetchAllPages method ");
final JsonArray[] resultData = {new JsonArray()}; //created an array of type JsonArray
dbClient.getConnection(ar->{
if(ar.failed()) {
LOG.error("Could not open a database connection",ar.cause());
} else {
SQLCollection connectionh = ar.result();
connection.query("select * from test",rs->{
if(rs.failed()) {
LOG.error("Database preparation error",rs.cause());
} else {
for(JsonArray line:rs.result().getResults()) {
System.out.println("Table result: "+line.encode());
resultData[0]=line; //replaced resultData with resultData[0]
}
connection.close(done->{
if(done.failed()) {
throw new RuntimeException(done.cause());
}
});
}
});
}
});
return resultData[0]; //replaced resultData with resultData[0]
}