Given a list of words, remove the shorter word of every pair
Asking for forgiveness would be the best policy for dealing with errors that may be beyond your control, such as when opening a file for reading.  Checking beforehand is useless, because too many things could go wrong: the file might not exist, you might not have the right permissions, the disk could fail altogether, etc.  Furthermore, even if you did check beforehand, circumstances could change during the brief period between your check and the real operation.  Therefore, the only reasonable approach would be to just do it, and deal with any errors that come up.

When working with a list of words, however, the outcome is entirely deterministic.  Since it is entirely possible to write your code such that it never triggers an error, that's what you should aim for.  (Well, maybe the program is multithreaded, and some other thread is manipulating the ArrayList behind your back, but that would be your program's fault, and such errors are also preventable with proper engineering.)

Therefore, your first approach is better.  However, the list.size() != 0 check is a superfluous check, and list.size() &gt;&gt; 0 is a pointless shift.

Personally, I find the indexing confusing, because the list is being modified as you traverse it, and the termination condition (list.size() &gt;&gt; 1) - isOdd is a moving target.  Consider working backwards, so that each pair you consider is always in "virgin" territory.

public static void removeShorterStrings(ArrayList&lt;String&gt; list) {
    for (int i = (list.size() &amp; ~1) - 2; i &gt;= 0; i -= 2) {
        String first = list.get(i);
        String second = list.get(i + 1);
        if (first.length() &lt;= second.length()) {
            list.remove(i);
        } else {
            list.remove(i + 1);
        }
    }
}