Kata pengantar
Dalam proses belajar Java, saya percaya semua orang telah mempelajari bab tentang pengecualian, dan saya tidak akan berbicara tentang karakteristik dasar dan penggunaan pengecualian di sini. Apa itu pengecualian? Saya tidak tahu bagaimana semua orang memahaminya. Pemahaman saya sangat sederhana, yaitu situasi yang tidak normal. Misalnya, saya seorang pria sekarang, tetapi saya memiliki sesuatu yang unik untuk wanita. Menurut pendapat saya, ini jelas merupakan kelainan dan saya tidak tahan. Saya percaya semua orang bisa mengerti dan menggunakannya dengan benar.
Namun, jika pemrosesan dan penggunaan pengecualian dasar optik tidak cukup, tidak menakutkan terjadi dalam pekerjaan. Terkadang perlu menggunakan pengecualian untuk mendorong pemrosesan bisnis. Misalnya: Saat menggunakan database dengan kendala unik, jika data duplikat dimasukkan, itu dapat diproses dengan menangkap duplicateKeyException Exception Exception Exception yang unik. Pada saat ini, keadaan yang sesuai dapat dilemparkan ke lapisan panggilan di lapisan server, dan lapisan atas akan memprosesnya sesuai dengan status yang sesuai. Oleh karena itu, terkadang pengecualian adalah metode mengemudi untuk bisnis.
Beberapa orang akan menghasilkan pengecualian setelah menangkap pengecualian. Saya bertanya -tanya apakah siswa yang berhati -hati memperhatikan sesuatu. Apa pengecualian outputnya?
Berikut adalah pengecualian umum:
java.lang.arithmeticException: / oleh nol di rumah kaca.exceptionTest.testException (Exceptiontest.java:16) di sun.reflect.nativemeThodacacessor.invoke0 (metode asli) di sun.reflect.nativemethodacessorcessorcessorcessor.invoke0 (Metode asli) di sun.reflect.nativemethodaccessorcessorcessor.invoke0 sun.reflect.delegatingmethodaccessorimpl.invoke (delegatingmethodacessorimpl.java:25) di java.lang.reflect.method.invoke (method.java:597) di org.junit.runners.model.frameworkmethod $ 1.runreflectiveCall (frameworkmethod.java:44) di org.junit.internal.runners.model.reflectiveCallable.run (reflectiveCallable.java:15) di org.junit.runners.model.frameworkmethod.invokeexplosivity (frameworkmethod.java:41) di org.junit.internal.runners.statements.invokemethod.evaluate (invokemethod.java:20) di org.junit.runners.blockjunit4classrunner.runchild (blockjunit4classrunner.java:76) di org.junit.runners.blockjunit4classrunner.runchild (blockjunit4classrunner.java:50) di org.junit.runners.parentrunner $ 3.run (parentrunner.java:193) di org.junit.runners.parentrunner $ 1.schedule (parentrunner.java:52) di org.junit.runners.parentrunner.runchilren (ParentRner.1919 org.junit.runners.parentrunner.access $ 000 (parentrunner.java:42) di org.junit.runners.parentrunner $ 2. evalute (parentrunner.java:184 di org.junit.runners.parentrunner.runner.runner org.junit.runner.junitcore.run (junitcore.java:157) di com.intellij.junit4.junit4ideatestrunner.Startrunnerwithargs (junit4ideatestrunner.java:68) di com.intellij.rt.execution.junit.ideatestrunner $ repeater.StartrunnerWithArgs (Ideatestrunner.java:47) di com.intellij.rt.execution.junit.junitstarter.preparestreamsandStart (junitstarter.java:242) com.intellij.rt.execution.junit.junitstarter.main (junitstarter.java:70)
Pengecualian penunjuk nol:
java.lang.nullpointerexception di Greenhouse.exceptionTest.testException (Exceptiontest.java:16) di sun.reflect.nativeMethodaccessorImpl.invoke0 (Metode asli) di Sun.reflect.nativemethodacessorMl. sun.reflect.delegatingmethodaccessorimpl.invoke (delegatingmethodacessorimpl.java:25) di java.lang.reflect.method.invoke (method.java:597) di org.junit.runners.model.frameworkmethod $ 1.runreflectiveCall (frameworkmethod.java:44) di org.junit.internal.runners.model.reflectiveCallable.run (reflectiveCallable.java:15) di org.junit.runners.model.frameworkmethod.invokeexplosivity (frameworkmethod.java:41) di org.junit.internal.runners.statements.invokemethod.evaluate (invokemethod.java:20) di org.junit.runners.blockjunit4classrunner.runchild (blockjunit4classrunner.java:76) di org.junit.runners.blockjunit4classrunner.runchild (blockjunit4classrunner.java:50) di org.junit.runners.parentrunner $ 3.run (parentrunner.java:193) di org.junit.runners.parentrunner $ 1.schedule (parentrunner.java:52) di org.junit.runners.parentrunner.runchilren (ParentRner.1919 org.junit.runners.parentrunner.access $ 000 (parentrunner.java:42) di org.junit.runners.parentrunner $ 2. evalute (parentrunner.java:184 di org.junit.runners.parentrunner.runner.runner org.junit.runner.junitcore.run (junitcore.java:157) di com.intellij.junit4.junit4ideatestrunner.Startrunnerwithargs (junit4ideatestrunner.java:68) di com.intellij.rt.execution.junit.ideatestrunner $ repeater.StartrunnerWithArgs (Ideatestrunner.java:47) di com.intellij.rt.execution.junit.junitstarter.preparestreamsandStart (junitstarter.java:242) com.intellij.rt.execution.junit.junitstarter.main (junitstarter.java:70)
Pernahkah Anda menemukan fitur bahwa output dari pengecualian adalah lokasi di mana pengecualian terjadi secara akurat, dan banyak panggilan proses eksekusi dicetak nanti. Dari mana informasi ini berasal? Informasi ini diperoleh dari tumpukan. Saat mencetak log pengecualian, informasi panggilan ini akan diperoleh dari tumpukan. Tentu saja baik untuk dapat secara akurat menemukan pengecualian, tetapi kadang -kadang ketika kami mempertimbangkan kinerja program dan beberapa persyaratan, kami kadang -kadang tidak perlu mencetak informasi ini sepenuhnya, dan mendapatkan informasi yang sesuai dari metode Call Stack, yang merupakan konsumsi kinerja. Untuk beberapa program dengan persyaratan kinerja tinggi, kami dapat sepenuhnya meningkatkan kinerja program dalam aspek ini.
Jadi bagaimana cara menghindari mengeluarkan informasi tumpukan ini? Maka pengecualian khusus dapat menyelesaikan masalah ini:
Pertama, pengecualian otomatis perlu mewarisi runtimeException, dan kemudian menulis ulang metode fillinstacktrace dan tostring. Misalnya, saya mendefinisikan pengecualian appexception di bawah ini:
Paket com.green.monitor.common.exception; import java.text.messageFormat;/*** kelas pengecualian khusus*/kelas publik appexception memperluas runtimeException {private boolean issuccess = false; kunci string pribadi; info string pribadi; public appException (tombol string) {super (key); this.key = key; this.info = key; } public appException (tombol string, pesan string) {super (messageFormat.Format ("{0} [{1}]", key, pesan)); this.key = key; this.info = pesan; } public appException (string pesan, tombol string, info string) {super (pesan); this.key = key; this.info = info; } public boolean issuccess () {return issuccess; } public String getKey () {return key; } public void setKey (tombol string) {this.key = key; } public string getInfo () {return info; } public void setInfo (info string) {this.info = info; } @Override public lempar fillinstacktrace () {return ini; } @Override public string toString () {return messageFormat.Format ("{0} [{1}]", this.key, this.info); }}Jadi mengapa menulis ulang fillinstacktrace, dan metode tostring? Pertama -tama mari kita lihat apa kode sumbernya.
kelas publik runtimeException memperluas Exception {static final long serialversionuid = -7034897190745766939l; /** Membangun pengecualian runtime baru dengan <code> null </code> sebagai* pesan detailnya. Penyebabnya tidak diinisialisasi, dan selanjutnya dapat * diinisialisasi dengan panggilan ke {@link #initcause}. */ public runimeException () {super (); } /** Membangun pengecualian runtime baru dengan pesan detail yang ditentukan. * Penyebabnya tidak diinisialisasi, dan dapat diinisialisasi dengan panggilan * ke {@link #initcause}. * * @param pesan pesan detail. Pesan detail disimpan untuk * pengambilan nanti dengan metode {@link #getMessage ()}. */ public runimeException (string message) {super (pesan); } /** * Membangun pengecualian runtime baru dengan pesan detail yang ditentukan dan * penyebab. <p> Perhatikan bahwa pesan terperinci yang terkait dengan * <code> penyebab </code> adalah <i> bukan </i> secara otomatis dimasukkan ke dalam * pesan detail pengecualian runtime ini. * * @param pesan Pesan detail (yang disimpan untuk pengambilan nanti * oleh {@link #getMessage ()} metode). * @param Penyebab (yang disimpan untuk pengambilan nanti dengan metode * {@link #getCause ()}). (A <tt> null </tt> nilai * diizinkan, dan menunjukkan bahwa penyebabnya tidak ada atau * tidak diketahui.) * @Since 1.4 */ runimeException publik (pesan string, penyebab yang dapat dilempar) {super (pesan, penyebab); }/** Konstruksi Pengecualian runtime baru dengan penyebab yang ditentukan dan pesan detail <tt> (penyebab == null? Null: cause.toString ()) </tt> * (yang biasanya berisi kelas dan pesan detail * <tt> penyebab </tt>). Konstruktor ini berguna untuk pengecualian runtime * yang sedikit lebih dari pembungkus untuk lemparan lainnya. * * @param Penyebab (yang disimpan untuk pengambilan nanti dengan metode * {@link #getCause ()}). (A <tt> null </tt> nilai * diizinkan, dan menunjukkan bahwa penyebabnya tidak ada atau * tidak diketahui.) * @Since 1.4 */ runimeException publik (penyebab yang dapat dilempar) {super (penyebab); }}RuntimeeException mewarisi pengecualian, tetapi hanya memanggil metode kelas induk, dan tidak melakukan operasi lain. Jadi, mari kita terus melihat apa yang terjadi dengan pengecualian?
pengecualian kelas publik memperluas lemparan {static final long serialversionuid = -3387516993124229948l; /*** Membangun pengecualian baru dengan <code> null </code> sebagai pesan detailnya. * Penyebabnya tidak diinisialisasi, dan selanjutnya dapat diinisialisasi dengan panggilan * ke {@link #initcause}. */ Public Exception () {super (); } /*** Membangun pengecualian baru dengan pesan detail yang ditentukan. Penyebab * tidak diinisialisasi, dan selanjutnya dapat diinisialisasi dengan * panggilan ke {@link #initcause}. * * @param pesan pesan detail. Pesan detail disimpan untuk * pengambilan nanti dengan metode {@link #getMessage ()}. */ pengecualian publik (pesan string) {super (pesan); } /** * Membangun pengecualian baru dengan pesan detail yang ditentukan dan * penyebab. <p> Perhatikan bahwa pesan terperinci yang terkait dengan * <code> penyebab </code> adalah <i> bukan </i> secara otomatis dimasukkan ke dalam * pesan detail pengecualian ini. * * @param pesan Pesan detail (yang disimpan untuk pengambilan nanti * oleh {@link #getMessage ()} metode). * @param Penyebab (yang disimpan untuk pengambilan nanti dengan metode * {@link #getCause ()}). (A <tt> null </tt> nilai adalah * diizinkan, dan menunjukkan bahwa penyebabnya tidak ada atau * tidak diketahui.) * @Since 1.4 */ pengecualian publik (pesan string, penyebab yang dapat dilempar) {super (pesan, penyebab); }/** * Membangun pengecualian baru dengan penyebab yang ditentukan dan detail * pesan <tt> (penyebab == null? Null: cause.toString ()) </tt> (yang * biasanya berisi kelas dan pesan detail <tt> penyebab </t>). * Konstruktor ini berguna untuk pengecualian yang sedikit lebih dari * pembungkus untuk lemparan lainnya (misalnya, {@link * java.security.priviledgedActionException}). * * @param Penyebab (yang disimpan untuk pengambilan nanti dengan metode * {@link #getCause ()}). (A <tt> null </tt> nilai adalah * diizinkan, dan menunjukkan bahwa penyebabnya tidak ada atau * tidak diketahui.) * @Since 1.4 */ pengecualian publik (penyebab yang dapat dilempar) {super (penyebab); }}Seperti yang dapat dilihat dari kode sumber, metode kelas induk juga disebut secara langsung dalam pengecualian. Seperti RuntimeException, saya benar -benar tidak melakukan apa -apa. Jadi mari kita lihat apa yang terjadi di Throwable:
Public Class Throwable mengimplementasikan serializable {public lempar (pesan string) {FillInstackTrace (); DetailMessage = pesan; } /*** Mengisi jejak stack eksekusi. Metode ini mencatat di dalam ini * <code> Throwable </code> Informasi objek tentang keadaan saat ini * bingkai tumpukan untuk utas saat ini. * * @Return referensi ke contoh <code> Throwable </code> ini. * @see java.lang.Trowable#printStackTrace () */ Public Synchronized Native Throwable FillinStackTrace (); /** * Menyediakan akses pemrograman ke informasi jejak stack yang dicetak oleh * {@link #printstacktrace ()}. Mengembalikan serangkaian elemen jejak tumpukan, * masing -masing mewakili satu bingkai tumpukan. Elemen zeroth dari array * (dengan asumsi panjang array tidak nol) mewakili bagian atas tumpukan *, yang merupakan doa metode terakhir dalam urutan. Biasanya, * ini adalah titik di mana yang dapat dilemparkan ini dibuat dan dilemparkan. * Elemen terakhir dari array (dengan asumsi panjang array adalah non-nol) * mewakili bagian bawah tumpukan, yang merupakan pemanggilan metode pertama * dalam urutan. * * <p> Beberapa mesin virtual dapat, dalam beberapa keadaan, menghilangkan satu * atau lebih bingkai tumpukan dari jejak tumpukan. Dalam kasus ekstrem, * mesin virtual yang tidak memiliki informasi jejak tumpukan tentang * This Thisble diizinkan untuk mengembalikan array panjang nol dari metode * ini. Secara umum, array yang dikembalikan dengan metode ini akan * berisi satu elemen untuk setiap bingkai yang akan dicetak oleh * <tt> printStackTrace </tt>. * * @Return Sebuah array elemen jejak stack yang mewakili jejak tumpukan * berkaitan dengan ini yang dapat dilemparkan. * @Since 1.4 */ StackTraceElement publik [] getStackTrace () {return (stacktraceElement []) getourstacktrace (). clone (); } private Synchronized StackTraceElement [] getourstackTrace () {// menginisialisasi jejak stack jika ini adalah panggilan pertama ke metode ini jika (stacktrace == null) {int depth = getStackTredEpth (); stacktrace = stacktraceElement baru [kedalaman]; untuk (int i = 0; i <kedalaman; i ++) stacktrace [i] = getStackTraceElement (i); } return stacktrace; } /** * Mengembalikan jumlah elemen dalam jejak stack (atau 0 jika stack * jejak tidak tersedia). * * Paket-perlindungan untuk digunakan oleh SharedSecrets. */ native int getStackTredEpth (); /*** Mengembalikan elemen yang ditentukan dari jejak tumpukan. * * Paket-perlindungan untuk digunakan oleh SharedSecrets. * * Indeks indeks @param dari elemen yang akan dikembalikan. * @Throws IndexOutOfBoundsException Jika <TT> index <0 || * index> = getStackTredEpth () </tt> */ StackTraceElement Native GetStackTraceElement (int index); /*** Mengembalikan deskripsi singkat dari ini yang dapat dilemparkan. * Hasilnya adalah gabungan: * <ul> * <li> {@linkplain class #getName () nama} dari kelas objek ini * <li> ":" (GetLocalizedMessage} </uFLOCSAGETSAGETICETICETICETICE} </ul> {@lind #getlocalized <tt> null </tt>, lalu hanya * Nama kelas dikembalikan. * * @return representasi string dari yang dapat dilempar ini. */ public string toString () {string s = getClass (). getName (); String message = getLocalizedMessage (); return (pesan! = null)? (s + ":" + pesan): s; }Dari kode sumber, hampir di ujung yang bisa dilemparkan. Metode FillInstackTrace () adalah metode asli. Metode ini akan memanggil bahasa C yang mendasarinya, mengembalikan objek yang dapat dilempar, metode tostring, dan mengembalikan deskripsi singkat dari yang dapat dilempar. Dalam metode GetStackTrace dan GetourStackTrace, metode asli GetStackTraceElement dipanggil. Metode ini mengembalikan informasi elemen tumpukan yang ditentukan, sehingga proses ini harus mengkonsumsi kinerja. Kemudian kita dapat menulis ulang metode ToString dan Metode FillinStackTrace dalam pengecualian khusus dan mengeluarkannya secara langsung tanpa mendapatkan informasi pengecualian dari tumpukan. Ini relatif tidak "berat" untuk sistem dan program, dan merupakan cara yang sangat baik untuk mengoptimalkan kinerja. Jadi seperti apa rasanya jika pengecualian khusus terjadi? Silakan lihat di bawah:
@Test public void testException () {coba {string str = null; System.out.println (str.charat (0)); } catch (Exception e) {lempar AppException baru ("000001", "Null Pointer Exception"); }}Kemudian ketika pengecualian abnormal, sistem akan mencetak informasi pengecualian khusus kami:
Proses 000001 [NULL POINTER ECPECTION] selesai dengan kode keluar -1
Oleh karena itu, ini sangat ringkas dan mengoptimalkan kinerja program sistem, membuat program ini kurang "berat", sehingga sistem dengan persyaratan kinerja khusus diperlukan. Cepat dan sesuaikan pengecualian Anda sendiri!
Meringkaskan
Di atas adalah seluruh konten artikel ini. Saya berharap konten artikel ini memiliki nilai referensi tertentu untuk studi atau pekerjaan semua orang. Jika Anda memiliki pertanyaan, Anda dapat meninggalkan pesan untuk berkomunikasi. Terima kasih atas dukungan Anda ke wulin.com.