Perbedaan antara java.lang.RuntimeException dan java.lang.Exception

210

Seseorang tolong jelaskan perbedaan antara java.lang.RuntimeExceptiondan java.lang.Exception? Bagaimana cara memutuskan mana yang akan diperpanjang jika saya membuat pengecualian sendiri?

cchampion
sumber

Jawaban:

181

Umumnya RuntimeExceptions adalah pengecualian yang dapat dicegah secara program. Misalnya NullPointerException, ArrayIndexOutOfBoundException. Jika Anda memeriksa nullsebelum memanggil metode apa pun, NullPointerExceptiontidak akan pernah terjadi. Demikian pula ArrayIndexOutOfBoundExceptiontidak akan pernah terjadi jika Anda memeriksa indeks terlebih dahulu.RuntimeExceptiontidak diperiksa oleh kompiler, jadi itu adalah kode bersih.

EDIT : Hari-hari ini orang menyukai RuntimeExceptionkarena kode bersih yang dihasilkannya. Ini benar-benar pilihan pribadi.

fastcodejava
sumber
10
Saya suka sudut "pengecualian runtime ini bisa dihindari oleh pemanggil". Itu berarti Anda (sebagai penelepon suatu metode) seharusnya memastikan bahwa itu tidak terjadi. Sedangkan pengecualian yang diperiksa adalah sesuatu yang tidak dapat Anda hindari dan sebaliknya diminta untuk menanganinya setelah fakta. (Dan ya, karena tidak semua orang setuju dengan konsep pengecualian yang diperiksa dan banyak orang menggunakan RuntimeException untuk semuanya, perbedaan ini menjadi sedikit kacau).
Thilo
4
Saat ini orang-orang mendukung RuntimeException yang tidak dicentang juga, karena ini kompatibel dengan pemrosesan Java 8 Lambda, sedangkan pengecualian yang diperiksa dari tipe Exception tidak.
Hartmut P.
2
Saya menduga alasan sebenarnya yang ditangkap orang RuntimeExceptionadalah karena itu sederhana, dan menyingkirkan kebutuhan untuk memikirkan perbedaan antara pengecualian yang diperiksa dan yang tidak dicentang. Saya pikir menangkap pengecualian runtime adalah ide yang buruk karena Anda akan menangkap pengecualian yang tidak dapat dipulihkan seperti NullPointerException.
Dónal
186

Di Jawa, ada dua jenis pengecualian: pengecualian diperiksa dan pengecualian tidak diperiksa. Pengecualian yang diperiksa harus ditangani secara eksplisit oleh kode, sedangkan pengecualian yang tidak dicentang tidak perlu ditangani secara eksplisit.

Untuk pengecualian yang dicentang, Anda harus meletakkan blok coba / tangkap di sekitar kode yang berpotensi melempar pengecualian, atau menambahkan klausa "melempar" ke metode, untuk menunjukkan bahwa metode tersebut mungkin membuang jenis pengecualian ini (yang harus ditangani di kelas panggilan atau di atas).

Setiap pengecualian yang berasal dari "Pengecualian" adalah pengecualian yang diperiksa, sedangkan kelas yang berasal dari RuntimeException tidak dicentang. RuntimeExceptions tidak perlu ditangani secara eksplisit oleh kode panggilan.

Andy White
sumber
3
Praktis memang benar bahwa "ada dua jenis pengecualian", tetapi mengapa dokumentasi Oracle mengatakan ada tiga jenis. Itu menganggap Kesalahan sebagai tipe ke-3. Saya pikir, Kesalahan bukanlah Pengecualian sama sekali, itu hanya Throwable (objek), ya, itu meniru perilaku pengecualian runtime. Apa yang akan Anda katakan tentang itu? Oracle doc. ref. docs.oracle.com/javase/tutorial/essential/exceptions/…
Asif Shahzad
3
Kesalahan tidak dimaksudkan untuk ditangkap (meskipun bisa jadi) umumnya Anda menggunakan kesalahan untuk menangkap kesalahan Anda sendiri saat Anda sedang mengerjakan kode baru. Sebagai contoh jika Anda memiliki pohon jika jika / elseif pernyataan, final lain mungkin saja melakukan kesalahan ("tidak mengharapkan kondisi ini terjadi") ;. Secara umum, pengecualian memiliki kasus penggunaan di mana mereka SEHARUSNYA terjadi, sedangkan kesalahan tidak memiliki kasus penggunaan dan mereka adalah bug.
Danny
5
Tapi leluconnya adalah RunTimeException sendiri memperluas Pengecualian: D (Saya tahu ini tidak membuat masalah dan JVM menangani seluruh konteks)
Alireza Mohamadi
94

Sebelum melihat perbedaan antara java.lang.RuntimeExceptiondan java.lang.Exceptionkelas, Anda harus mengetahui Exceptionhierarki. Keduanya Exceptiondan Errorkelas berasal dari kelas Throwable(yang berasal dari kelas Object). Dan kelas RuntimeExceptiontersebut berasal dari kelasException .

Semua pengecualian berasal dari ExceptionatauRuntimeException .

Semua pengecualian yang berasal dari RuntimeExceptiondisebut sebagai pengecualian yang tidak dicentang . Dan semua pengecualian lainnya diperiksa . Pengecualian diperiksa harus ditangkap di suatu tempat dalam kode Anda, jika tidak, itu tidak akan dikompilasi. Itu sebabnya mereka disebut pengecualian diperiksa. Di sisi lain, dengan pengecualian yang tidak dicentang, metode panggilan tidak berkewajiban untuk menangani atau menyatakannya.

Oleh karena itu, semua pengecualian yang memaksa kompiler untuk Anda tangani berasal langsung java.lang.Exceptiondan semua kompilator lain yang tidak memaksa Anda untuk menangani berasal darijava.lang.RuntimeException .

Berikut adalah beberapa subclass langsung yang dikenal dari RuntimeException .

AnnotationTypeMismatchException,
ArithmeticException,
ArrayStoreException,
BufferOverflowException,
BufferUnderflowException,
CannotRedoException,
CannotUndoException,
ClassCastException,
CMMException,
ConcurrentModificationException,
DataBindingException,
DOMException,
EmptyStackException,
EnumConstantNotPresentException,
EventException,
IllegalArgumentException,
IllegalMonitorStateException,
IllegalPathStateException,
IllegalStateException,
ImagingOpException,
IncompleteAnnotationException,
IndexOutOfBoundsException,
JMRuntimeException,
LSException,
MalformedParameterizedTypeException,
MirroredTypeException,
MirroredTypesException,
MissingResourceException,
NegativeArraySizeException,
NoSuchElementException,
NoSuchMechanismException,
NullPointerException,
ProfileDataException,
ProviderException,
RasterFormatException,
RejectedExecutionException,
SecurityException,
SystemException,
TypeConstraintException,
TypeNotPresentException,
UndeclaredThrowableException,
UnknownAnnotationValueException,
UnknownElementException,
UnknownTypeException,
UnmodifiableSetException,
UnsupportedOperationException,
WebServiceException 
GAJJE82
sumber
47

Pengecualian dicentang, dan RuntimeException tidak dicentang.

Dicentang berarti bahwa kompiler mengharuskan Anda menangani pengecualian dalam tangkapan, atau menyatakan metode Anda sebagai melemparkannya (atau salah satu dari kacamata supernya).

Secara umum, lemparkan pengecualian yang diperiksa jika pemanggil API diharapkan untuk menangani pengecualian, dan pengecualian yang tidak dicentang jika itu adalah sesuatu yang biasanya tidak bisa ditangani oleh pemanggil, seperti kesalahan dengan salah satu parameter, yaitu pemrograman kesalahan.

Lawrence Dol
sumber
15

Kelas pengecualian runtime (RuntimeException dan subkelasnya) dikecualikan dari pengecekan waktu kompilasi, karena kompiler tidak dapat menetapkan bahwa pengecualian run-time tidak dapat terjadi. (dari JLS).

Di kelas yang Anda desain Anda harus subkelas Pengecualian dan memberikan contoh untuk menandai setiap skenario luar biasa. Dengan melakukan itu, Anda akan secara eksplisit memberi sinyal kepada klien kelas Anda bahwa penggunaan kelas Anda dapat menimbulkan pengecualian dan mereka harus mengambil langkah-langkah untuk menangani skenario luar biasa itu.

Cuplikan kode di bawah ini menjelaskan hal ini:

//Create your own exception class subclassing from Exception
class MyException extends Exception {
    public MyException(final String message) {
        super(message);
    }
}

public class Process {
    public void execute() {
        throw new RuntimeException("Runtime");
    }  
    public void process() throws MyException {
        throw new MyException("Checked");
    }
}

Dalam definisi kelas atas Proses kelas , metode ini executedapat melempar RuntimeException tetapi deklarasi metode tidak perlu menentukan bahwa ia melempar RuntimeException .

Metode processmelempar pengecualian yang diperiksa dan harus menyatakan bahwa ia akan membuang pengecualian yang diperiksa dari jenis MyException dan tidak melakukannya akan menjadi kesalahan kompilasi.

Definisi kelas di atas akan mempengaruhi kode yang menggunakan kelas Proses juga.

Panggilan new Process().execute()adalah doa yang valid di mana sebagai panggilan formulir new Process().process()memberikan kesalahan kompilasi. Ini karena kode klien harus mengambil langkah-langkah untuk menangani MyException(katakan ajakan untuk memproses () dapat dilampirkan dalam blok coba / tangkap).

sateesh
sumber
13

Penggunaan RuntimeException dengan benar?

Dari Pengecualian Tidak Dicentang - Kontroversi :

Jika klien secara wajar diharapkan pulih dari pengecualian, jadikan itu pengecualian terkecuali. Jika klien tidak dapat melakukan apa pun untuk memulihkan dari pengecualian, jadikan itu pengecualian yang tidak dicentang.

Perhatikan bahwa pengecualian yang tidak dicentang adalah yang berasal dari RuntimeExceptiondan pengecualian yang diperiksa adalah yang berasal dari Exception.

Mengapa melempar RuntimeExceptionjika klien tidak dapat melakukan apa pun untuk memulihkan dari pengecualian? Artikel tersebut menjelaskan:

Pengecualian runtime mewakili masalah yang merupakan hasil dari masalah pemrograman, dan karena itu, kode klien API tidak dapat diharapkan untuk pulih dari mereka atau untuk menanganinya dengan cara apa pun. Masalah tersebut termasuk pengecualian aritmatika, seperti membaginya dengan nol; pengecualian pointer, seperti mencoba mengakses objek melalui referensi nol; dan pengecualian pengindeksan, seperti mencoba mengakses elemen array melalui indeks yang terlalu besar atau terlalu kecil.

Mahdi Esmaeili
sumber
5

Dari dokumentasi oracle:

Inilah pedoman garis bawah: Jika klien secara wajar diharapkan pulih dari pengecualian, jadikan itu pengecualian yang dicentang. Jika klien tidak dapat melakukan apa pun untuk memulihkan dari pengecualian, jadikan itu pengecualian yang tidak dicentang.

Pengecualian runtime mewakili masalah yang merupakan hasil dari masalah pemrograman dan karena itu, kode klien API tidak dapat diharapkan untuk pulih dari mereka atau untuk menanganinya dengan cara apa pun.

Contoh RuntimeExceptions seperti "pengecualian oleh penggunaan api yang tidak valid" contoh runtimeexeption: IllegalStateException, NegativeArraySizeException, NullpointerException

Dengan Pengecualian Anda harus menangkapnya secara eksplisit karena Anda masih dapat melakukan sesuatu untuk pulih. Contoh Pengecualian adalah: IOException, TimeoutException, PrintException ...

iberck
sumber
4

Dengan kata sederhana, jika klien / pengguna Anda dapat memulihkan dari Pengecualian maka jadikan itu Pengecualian Tercatat , jika klien Anda tidak dapat melakukan apa pun untuk memulihkan dari Pengecualian, maka buatlah itu Tidak Dicentang RuntimeException . Misalnya, RuntimeException akan menjadi kesalahan terprogram, seperti pembagian dengan nol, tidak ada pengguna yang dapat melakukan apa pun kecuali programmer itu sendiri, maka itu adalah RuntimeException .

Joe Almore
sumber
3

RuntimeException adalah kelas anak dari kelas Exception

Ini adalah salah satu dari banyak kelas anak dari kelas Pengecualian. RuntimeException adalah superclass dari pengecualian yang dapat dilempar selama operasi normal Java Virtual Machine. Metode tidak diharuskan untuk mendeklarasikan dalam klausa throwsnya subclass apa pun dari RuntimeException yang mungkin dilemparkan selama eksekusi metode tetapi tidak tertangkap.

Hirarki itu

java.lang.Object

--- java.lang.Terima kasih

------- java.lang.Exception

------------- java.lang.RuntimeException

jayrhd
sumber
0

Pengecualian adalah cara yang baik untuk menangani peristiwa tak terduga dalam aliran aplikasi Anda. RuntimeException tidak dicentang oleh Compiler tetapi Anda dapat memilih untuk menggunakan Pengecualian yang memperluas Kelas Pengecualian untuk mengontrol perilaku klien api Anda karena mereka diharuskan untuk menangkap kesalahan yang harus dikompilasi oleh mereka. Juga membentuk dokumentasi yang bagus.

Jika ingin mencapai antarmuka yang bersih, gunakan pewarisan untuk mensubklasifikasikan berbagai jenis pengecualian yang dimiliki aplikasi Anda dan kemudian paparkan pengecualian induk.

FOO
sumber
0

Ada dua jenis pengecualian, Anda dapat memulihkan dari pengecualian yang diperiksa jika Anda mendapatkan pengecualian semacam itu. Pengecualian runtime tidak dapat dipulihkan, pengecualian runtime adalah kesalahan pemrograman, dan programmer harus menanganinya saat menulis kode, dan melanjutkan eksekusi ini mungkin memberi Anda hasil yang salah. Pengecualian runtime adalah tentang melanggar prasyarat ex. Anda memiliki array ukuran 10, dan Anda mencoba mengakses elemen ke-11, ia akan membuang ArrayIndexOutOfBoundException

Bhagwati Malav
sumber
0
  1. Pengecualian yang Ditentukan Pengguna dapat Diperiksa Pengecualian atau Pengecualian tidak dicentang, Itu tergantung pada kelas yang diperluas.

  2. Pengecualian yang Ditentukan Pengguna dapat Pengecualian Khusus, jika diperluas ke kelas Pengecualian

  3. Pengecualian yang Ditentukan Pengguna dapat Pengecualian Tidak Dicustom, jika diperluas ke kelas Run time Exception.

  4. Tentukan kelas dan buat anak itu menjadi Pengecualian atau Berlari waktu

Aditya
sumber