以上のように、Errorをthrowしている例も少なからず存在します。特定の条件さえ満たせば、Errorをthrowすることも問題がないと考えています。
Errorを投げる身近な例というか、一般的なプログラマでも書きそうなシチュエーションというとCloneableをimplementsしてcloneメソッドをオーバーライドするときとか…。
class Hoge implements Cloneable { @Override public Hoge clone() { try { return (Hoge) super.clone(); } catch (CloneNotSupportedException e) { throw new Error(e); } } }
super.clone()では、Cloneableをimplementsしたので例外はスローされないはずですが、例外スローが宣言されているのでcatchするか例外スローの可能性を再宣言する必要がある。だけど出ないハズのものをわざわざ宣言しても無駄なのでcatch。
それでも、もしCloneNotSupportedExceptionがスローされるというならば、JVMがおかしいと思われるので、Errorをスローするのが適切…、といった感じでしょうか。