Traversing List of Integers and ending on the last index which should be 0
This function relies on no object state, so I would make it static.

You don't need both listSize and lastIndex.  To reduce clutter, I would keep just lastIndex.

currentIndexValue is too cumbersome a name, in my opinion.  "Current" is superfluous, especially when there is no "previous" or "next" involved.  "Index" just adds confusion.  So, I'd simply call it value.

The for loop is trying to do too much.  Considering that currentIndexValue is defined elsewhere, you can't understand how the loop behaves just by looking at the loop header.  So, I would just make it count iterations.

If currentIndexValue is 0, but i is not lastIndex, then i is never going to move.  You might as well return false immediately in that case.

It would be better to avoid triggering IndexOutOfBoundsException when i is negative.

public static boolean isSolvable(List&lt;Integer&gt; list) {
    if (list == null) {
        throw new IllegalArgumentException("List is null");
    }

    int lastIndex = list.size() - 1;
    int i = 0;
    for (int loopCounter = 1; loopCounter &lt;= lastIndex; loopCounter++) {
        if (i &lt; 0 || i &gt; lastIndex) {
            return false;
        }
        int value = list.get(i);
        if (value == 0) {
            return i == lastIndex;
        }
        i += value;
    }

    return false;    
}