というわけで、Specを見てみた。
The Expression must either have type Iterable or else it must be of an array type (§10.1), or a compile-time error occurs.
とあり、特にnullがOKなのかどうかは書いていない。ただし、続きを読むと、拡張forは通常のforと変わらないようなことが書いてある。
つまり、
for ( VariableModifiers Type Identifier: Expression) Statement
は、
for (I #i = Expression.iterator(); #i.hasNext(); ) {
VariableModifiers Type Identifier = #i.next();
Statement
}
や
T[] a = Expression;
L1: L2: ... Lm:
for (int i = 0; i < a.length; i++) {
VariableModifiers Type Identifier = a[i];
Statement
}
と同等とのこと。
こうなると、nullチェックはしてくれなさそう。
実際に、試してみた。
public static void main(String[] args) {
String[] values = {"abc", "def"};
for (String val : values) System.out.println(val);
String[] values2 = null;
for (String val : values2) System.out.println(val);
}すると、実行するまでもなく、Warningがはかれた。当然無理矢理実行したら、NullPointerException。
というわけで、拡張forでも面倒なnullチェックは必要。