Lançar uma exceção ou retornar null

Se eu tenho a função abaixo, com duas escolhas

private MyObject findBlank() {
    for (int i = 0; i < pieces.length; i++) {
        if(pieces[i].isBlank()){
            return pieces[i];
        }
    }
    return null;
}

private MyObject findBlank() {
    for (int i = 0; i < pieces.length; i++) {
        if(pieces[i].isBlank()){
            return pieces[i];
        }
    }
    throw new NoSuchFieldError("No blank piece found!");
}

Deste método eu sei quedeve sempre devolver um objeto uma das 'peças' sempre éisBlank() == true , o retorno nulo no final é apenas para agradar o compilador. Desde que este é o caso e meu código não funcionaria de qualquer maneira se retornou null, este é o correto por favor lançar uma exceção?

Minhas opções são:

return null e o aplicativo receberá um NullPointerException em algum caso de bordaretornar null e envolver o uso do método com verificações (myObject! = null)lançar uma exceção que irá explodi-lo em tempo de execução

Eu acho que o que eu estou perguntando é, este é o lugar correto para lançar uma exceção? isto é, não há nada que eu possa fazer sobre isso se entrar na situação. Isso é classificado como "excepcional" ou devo verificar nulo o que meu método retorna (o que faz meu código parecer horrível). Se eu sei que não deve retornar nulo, então devo jogar a exceção certo?

Além disso, como eu escolheria qual exceção ou estenderia uma e lançaria a minha?

questionAnswers(9)

yourAnswerToTheQuestion