diff --git a/api/src/main/java/org/apache/iceberg/io/CloseableIterable.java b/api/src/main/java/org/apache/iceberg/io/CloseableIterable.java index 71e99aaeb468..06323612a178 100644 --- a/api/src/main/java/org/apache/iceberg/io/CloseableIterable.java +++ b/api/src/main/java/org/apache/iceberg/io/CloseableIterable.java @@ -279,7 +279,9 @@ public boolean hasNext() { @Override public void close() throws IOException { if (!closed) { - currentIterable.close(); + if (null != currentIterable) { + currentIterable.close(); + } this.closed = true; this.currentIterator = null; this.currentIterable = null; diff --git a/api/src/test/java/org/apache/iceberg/io/TestCloseableIterable.java b/api/src/test/java/org/apache/iceberg/io/TestCloseableIterable.java index df4edb035861..0c001c53180b 100644 --- a/api/src/test/java/org/apache/iceberg/io/TestCloseableIterable.java +++ b/api/src/test/java/org/apache/iceberg/io/TestCloseableIterable.java @@ -201,6 +201,14 @@ public CloseableIterator iterator() { Assertions.assertThat(counter.get()).isEqualTo(items.size()); } + @Test + public void concatIterablesWithIterator() throws IOException { + CloseableIterable closeableIterable = CloseableIterable.concat(Collections.emptyList()); + closeableIterable.iterator(); + // shouldn't throw a NPE + closeableIterable.close(); + } + @Test public void count() { Counter counter = new DefaultMetricsContext().counter("x");