Object (final int row, final int col) { Pair<Integer, Integer> key = itemToChunkKey(row, col); try { ListenableFuture<ArrayChunk> chunk = myChunkCache.get(key); if (chunk.isDone()) { Object[][] data = chunk.get().getData(); int r = row % CHUNK_ROW_SIZE; int c = col % CHUNK_COL_SIZE; if (r < data.length) { if (c < data[r].length) { return correctStringValue(data[r][c]); } } } else { myQueue.queue(new Update("get chunk from debugger") { @Override public void run() { chunk.addListener(() -> UIUtil.invokeLaterIfNeeded(() -> fireTableDataChanged()), myExecutorService); myExecutorService.execute(((ListenableFutureTask<ArrayChunk>)chunk)); } }); } return EMPTY_CELL_VALUE; } catch (Exception e) { return EMPTY_CELL_VALUE; //TODO: handle it } }