Esta decisão de design aparece principalmente pela nomeação.
O nome ArrayList sugere ao leitor uma funcionalidade semelhante às matrizes - e é natural para O Java Collections Framework espera que a grande maioria dos utilizadores da API dependa do seu funcionamento semelhante aos arrays.
Isso, em particular, envolve o tratamento de elementos nulos. Usuário da API sabendo que abaixo funciona OK:
array[0] = null; // NPE won't happen here
seria bastante surpreso para descobrir se código semelhante para ArrayList jogaria NPE:
arrayList.set(0, null); // NPE => WTF?
O raciocínio como acima é apresentado em JCF tutorial enfatizando pontos que sugerem uma similaridade próxima entre ArrayList e matrizes simples:
ArrayList... offers constant-time positional access and is just plain fast...
Se você quiser uma implementação de Lista que não permita nulos, é melhor que ela seja chamada como NonNullableArrayList
ou algo assim, para evitar confundir os usuários da API.
Nota lateral há uma discussão auxiliar nos comentários abaixo, junto com considerações adicionais apoiando o raciocínio apresentado aqui.