Sınıf yapıları açısından pek farkı yok gibi. İkisi de throwable sınıfından türeyen sınıflar. Kullanım açısından da pek farkı yok. Biraz daha unchecked exception tipine yakın tasarımı var.
Asıl aradaki fark biraz daha felsefi gibi. Eğer uygulamada bir bilginin olmaması veya yanlış işlemesi durumu bariz bir şekilde belirlenmiş ise (mesela bir dosyanın olmaması o uygulamanın çalışmamasına sebep olacaksa) error da fırlatıp uygulamanın akışını durdurmak da güzel bir yaklaşım. Ama dosyanın olmaması uygulamanın sadece bir fonksiyonalitesini bozuyorsa veya biraz daha keyfi birşey ise exception atılabilir. Genelde uygulama geliştiriler exception kullanıyor. Ama spring gibi open source frameworklere bakarsan kesin gerekli (mandatory) alanların eksik olması durumunda error fırlatıyor.
Tekrar söyleyeyim. Bu işlem için unchecked exception atarsan da programatik olarak bir hata doğmaz. Aynı hatayı exception ya da error ile verebilirsin. Bu biraz daha anlamlandırmayla alakalı bir durum.