diff --git a/graphics/java/android/graphics/PathIterator.java b/graphics/java/android/graphics/PathIterator.java
index bfda690e0b056..48b29f4e81f49 100644
--- a/graphics/java/android/graphics/PathIterator.java
+++ b/graphics/java/android/graphics/PathIterator.java
@@ -29,8 +29,6 @@ import libcore.util.NativeAllocationRegistry;
import java.lang.annotation.Retention;
import java.util.ConcurrentModificationException;
import java.util.Iterator;
-import java.util.NoSuchElementException;
-
/**
* PathIterator can be used to query a given {@link Path} object, to discover its
@@ -54,7 +52,8 @@ public class PathIterator implements Iterator {
/**
* The Verb indicates the operation for a given segment of a path. These
* operations correspond exactly to the primitive operations on {@link Path}, such as
- * {@link Path#moveTo(float, float)} and {@link Path#lineTo(float, float)}.
+ * {@link Path#moveTo(float, float)} and {@link Path#lineTo(float, float)}, except for
+ * {@link #VERB_DONE}, which means that there are no more operations in this path.
*/
@Retention(SOURCE)
@IntDef({VERB_MOVE, VERB_LINE, VERB_QUAD, VERB_CONIC, VERB_CUBIC, VERB_CLOSE, VERB_DONE})
@@ -109,7 +108,6 @@ public class PathIterator implements Iterator {
* @throws ArrayIndexOutOfBoundsException if the points array is too small
* @throws ConcurrentModificationException if the underlying path was modified
* since this iterator was created.
- * @throws NoSuchElementException if the iteration has no more elements
*/
@NonNull
public @Verb int next(@NonNull float[] points, int offset) {
@@ -126,8 +124,8 @@ public class PathIterator implements Iterator {
/**
* Returns true if the there are more elements in this iterator to be returned.
* A return value of false means there are no more elements, and an
- * ensuing call to {@link #next()} or {@link #next(float[], int)} )} will throw a
- * {@link NoSuchElementException}.
+ * ensuing call to {@link #next()} or {@link #next(float[], int)} )} will return
+ * {@link #VERB_DONE}.
*
* @return true if there are more elements to be iterated through, false otherwise
* @throws ConcurrentModificationException if the underlying path was modified
@@ -135,14 +133,10 @@ public class PathIterator implements Iterator {
*/
@Override
public boolean hasNext() {
- try {
- if (mCachedVerb == -1) {
- mCachedVerb = nextInternal();
- }
- return true;
- } catch (NoSuchElementException e) {
- return false;
+ if (mCachedVerb == -1) {
+ mCachedVerb = nextInternal();
}
+ return mCachedVerb != VERB_DONE;
}
/**
@@ -171,12 +165,13 @@ public class PathIterator implements Iterator {
* is helfpul for managing the cached segment used by {@link #hasNext()}.
*
* @return the segment to be returned by {@link #next()}
- * @throws NoSuchElementException if the iteration has no more elements
+ * @throws ConcurrentModificationException if the underlying path was modified
+ * since this iterator was created.
*/
@NonNull
private @Verb int nextInternal() {
if (mDone) {
- throw new NoSuchElementException("No more path segments to iterate");
+ return VERB_DONE;
}
if (mPathGenerationId != mPath.getGenerationId()) {
throw new ConcurrentModificationException(
@@ -198,7 +193,6 @@ public class PathIterator implements Iterator {
* requires a little more manual effort to use.
*
* @return the next segment in this iterator
- * @throws NoSuchElementException if the iteration has no more elements
* @throws ConcurrentModificationException if the underlying path was modified
* since this iterator was created.
*/