Olha só. No caso da raiz quadrada, o problema é que o método sqrt da classe Math não lança exceção em momento algum, mesmo quando você tenta passar um valor negativo para o método!!! :shock:
Neste caso, o método retorna o que chamamos de Not-a-Number, mais conhecido por “NaN”. Este NaN é representado em Java por uma constante do tipo double com o mesmo nome, disponibilizada pela classe Double.
Uma maneira para forçar seu método a lançar alguma exceção seria a seguinte:
public double squareRoot() {
if(Double.isNaN(num))
throw new ArithmeticException("Value is not a number");
double result = Math.sqrt(num);
if(Double.isNaN(result))
throw new ArithmeticException("Value is negative");
return result;
}
Ou seja, você deve verificar se o valor retornado é um NaN, através do método Double.isNaN(double). Se for, você lança uma exceção, ou faz o que quiser.
No caso do seno e cosseno, provavelmente deve ser a mesma coisa, caso vc esteja novamente utilizando métodos da classe Math. Se aos métodos sin e cos for passado um NaN ou um número infinito (Double.NEGATIVE_INFINITY ou Double.POSITIVE_INFINITY), será retornado por esses métodos o bendito NaN… Outro agravante é que parece que qualquer operação envolvendo um NaN, resulta em NaN, mesmo que seja, por exemplo “Double.NaN / 0”.
Tente contornar a situação sempre verificando se o resultado da conta se equipara ao Double.NaN.
Obs: Não compare um double diretamente com o Double.NaN. Não sei por quê, mas não funciona… Utilize o Double.isNaN(double)