هر دو کلاس java.lang.Error و java.lang.Exception فرزند کلاس java.lang.Throwable هستند، اما تفاوت های قابل توجهی دارند.
java.lang.Error خطایی رو نشون میده که دلیلش برمیگرده به محیطی که برنامه داره توش اجرا میشه مثل OutOfMemoryError که وقتی رخ میده که JVM دیگه حافظه نداشته باشه، یا StackOverflowError زمانی که حافظه پشته پر بشه رخ میده.
در حالی که java.lang.Exception، زمانی رخ میده که خود برنامه جاوا دچار Exception شده باشه (علت خود برنامه است نه محیطی که برنامه داره توش اجرا میشه)! مثله NullPointerException که زمانی رخ میده که برنامه داره تلاش میکنه که به یک شی null دسترسی داشته باشه، یا ClassCastException وقتی رخ میده که برنامه داره تلاش میکنه دوتا کلاس غیر قابل تبدیل به هم رو به هم تبدیل کنه.
تفاوت ها:
1. error ها رو نمیشه ریکاور کرد و فقط باید اجرای برنامه رو متوقف کرد، اما exception هارو میتونیم پرتاب کنیم به صدا کننده (throw back to caller) یا اونارو زمانی که رخ میدن هَندل کنیم.
2. Exception ها در جاوا به دو دسته checked (در زمان کامپایل چک میشن) و unchecked (در زمان اجرا رخ میدن) تقسیم میشن اما Error ها همشون توی دسته unchecked قرار میگیرن (زمان اجرا رخ میدن).