А любопытно устроен менталитет программистов - если чего не хватает, типа файл не найден, то это всё считается чьи-то ошибки. Кругом ошибки, и если программа валится по npe, а корневая причина отсутствие какого-нибудь файла по предполагаемому пути, то это "ошибка". Сегодня за обедом с архитектором беседую, говорю, слышь, ты тут класс написал, "декорированный брокер", у него есть делегат, которого ты называешь _decorated, и ты нигде вообще не проверяешь что он null, не null, а делегируешь себе - это типа as designed? На что он ответствует - ну npe будет если только система неправильно сконфигурирована, тогда вообще сервер должен завершать работу.
Он, конечно, ни хера работу не завершает, а хуярит и хуярит, извините за выражение, исключение за исключением.
И я не думаю, что мы с ним когда-нибудь договоримся.
Но меня что-то нынче пробило писать примерно вот так:
def existingFile(file: File) = {
require(file.exists(), "File " + file.getAbsolutePath + " must exist")
file
}
def existingFile(path: String) = existingFile(new File(path))
def existingFile(folder: File, name: String) = existingFile(new File(existingFile(folder), name))
Да затрахало елозить с юниттестами да дебагерами. Кусок кода может сам признаться, чего ему не хватает, сразу, а не после трагических ошибок.
P.S. Надеюсь вы понимаете, что этот дешевый приёмчик есть замена правильному решению
class ExistingFile(File file)...