1) Непроверяемые исключения
2) Nullable типы
3) Type-driven development на нём вроде не получится нормальный
С первым пунктом не знаешь какие исключения кидает функция, приходится в документации описывать (которой почти всегда нет), ну и тогда в исходниках шариться или catch (Exception e)
. А можешь просто пропустить поставить try-catch блок и всё, дядя, прощай.
Со вторым пунктом вроде все знакомы, тоже порождает ошибки, когда по null-ссылке вызываешь метод. Была статья от создателя null, называлась "Ошибка на миллиард долларов", как-то так, где он приносил свои извинения)
Ну а третий пункт позволяет больше вещей на этапе компиляции проверять.