Saya mendengar dari guru bahwa sebagian besar kelainan dalam studi masa depan adalah pengecualian penunjuk nol. Jadi luangkan waktu untuk bermain game untuk memeriksa apa itu pengecualian pointer nol
1: Alasan utama terjadinya pengecualian penunjuk nol adalah sebagai berikut:
(1) Ketika suatu objek tidak ada, itu akan menghasilkan pengecualian obj.method () // objek obj tidak ada
(2) Saat mengakses atau memodifikasi bidang yang tidak ada dalam suatu objek, pengecualian akan dihasilkan obj.method () // metode ini tidak ada
(3) variabel string tidak diinisialisasi;
(4) Objek tipe antarmuka tidak diinisialisasi dengan kelas tertentu, seperti:
Daftar LT; akan melaporkan kesalahan
Daftar LT = ArrayList baru (); tidak akan ada kesalahan
Ketika nilai suatu objek kosong, Anda tidak menilai untuk kosong. Anda dapat mencoba menambahkan baris kode sebelum kode berikut:
if (rb! = null && rb! = "")
Ubah ke:
if (rb == null); if (rb! == null && rb! = "") atau if ((""). Equals (rb))Solusi untuk penunjuk nol:
Fokus pada garis di mana kesalahan terjadi, dan mendiagnosis kesalahan spesifik melalui dua alasan utama yang disebabkan oleh pengecualian pointer nol. Pada saat yang sama, untuk menghindari terjadinya pointer nol, yang terbaik adalah menempatkan "null" atau nilai nol sebelum nilai yang ditetapkan saat melakukan pemrosesan penilaian.
Analisis singkat pengecualian penunjuk nol umum:
(1) Kesalahan Pointer Null Java.lang.NullpointerException
Ada 8 tipe data dasar di Java. Nilai variabel dapat memiliki nilai default. Jika ditambahkan tanpa penugasan normal, mesin virtual Java tidak dapat dikompilasi dengan benar. Oleh karena itu, menggunakan tipe data Java dasar umumnya tidak akan menyebabkan pengecualian pointer nol. Dalam pengembangan aktual, sebagian besar pengecualian penunjuk nol terutama terkait dengan operasi objek.
2. Mekanisme Penanganan Pengecualian Java
Ada dua cara untuk menangani kode yang mungkin memiliki pengecualian:
Pertama, gunakan pernyataan coba ... tangkap dalam metode untuk menangkap dan menangani pengecualian. Pernyataan cache dapat memiliki banyak yang cocok dengan beberapa pengecualian. Misalnya:
public void p (int x) {coba {...} catch (Exception e) {...} akhirnya {...}} Kedua, untuk pengecualian yang tidak dapat diproses atau mereka yang perlu diubah, lulus pada deklarasi metode.
Pernyataan lemparan melempar pengecualian. Misalnya:
public void test1 () melempar myException {... if (....) {lempar myException baru ();}}Jika setiap metode hanya melempar pengecualian, dalam panggilan bersarang multi-lapisan ke metode panggilan metode, mesin virtual Java mencari kembali dari blok kode metode di mana pengecualian terjadi sampai blok kode yang menangani pengecualian ditemukan. Kemudian berikan pengecualian ke pernyataan tangkapan yang sesuai untuk diproses. Jika mesin virtual Java melacak kembali ke metode utama () di bagian bawah tumpukan panggilan metode, jika blok kode yang menangani pengecualian masih belum ditemukan, langkah -langkah berikut akan ditangani:
Pertama, hubungi metode printStackTrace () dari objek pengecualian dan cetak informasi pengecualian dari stack panggilan metode.
Kedua, jika utas yang terjadi pengecualian adalah utas utama, seluruh program berjalan berakhir; Jika bukan utas utama, utas diakhiri dan utas lainnya terus berjalan.
Melalui analisis dan pemikiran, kita dapat melihat bahwa semakin awal pemrosesan abnormal, semakin kecil sumber daya dan waktu yang dikonsumsi, semakin kecil ruang lingkup dampak. Karena itu, jangan melempar pengecualian yang bisa Anda tangani ke penelepon juga.
Poin lain tidak dapat diabaikan: Akhirnya pernyataan harus menjalankan kode dalam kasus apa pun, yang dapat memastikan keandalan beberapa kode yang harus dieksekusi dalam kasus apa pun. Misalnya, ketika kueri database abnormal, koneksi JDBC harus dirilis, dll. Pernyataan akhirnya dieksekusi sebelum pernyataan pengembalian, terlepas dari perintah atau lokasinya, atau apakah ada pengecualian di blok coba. Satu -satunya situasi di mana pernyataan akhirnya tidak dieksekusi adalah bahwa metode tersebut mengeksekusi metode System.exit (). System.exit () berfungsi untuk mengakhiri mesin virtual Java yang sedang berjalan. Nilai pengembalian pengembalian tidak dapat diubah dengan menetapkan nilai baru ke variabel di blok pernyataan akhirnya. Juga disarankan untuk tidak menggunakan pernyataan pengembalian di blok akhirnya. Ini tidak ada artinya dan dapat dengan mudah menyebabkan kesalahan.
Akhirnya, Anda juga harus memperhatikan aturan sintaks untuk penanganan pengecualian:
Pertama, coba pernyataan tidak bisa ada sendirian, tetapi dapat terdiri dari tangkapan dan akhirnya
Coba ... Tangkap ... akhirnya, coba ... Tangkap, coba ... akhirnya, coba ... akhirnya, pernyataan tangkap dapat memiliki satu atau lebih, dan akhirnya pernyataan bisa paling banyak. Tiga kata kunci mencoba, menangkap, dan akhirnya tidak dapat digunakan sendiri.
Kedua, ruang lingkup variabel dalam tiga blok kode independen dan tidak dapat diakses satu sama lain. Jika Anda ingin dapat diakses di ketiga blok, Anda perlu menentukan variabel di luar blok ini.
Ketiga, ketika beberapa blok tangkapan digunakan, mesin virtual Java cocok dengan salah satu kelas pengecualian atau subkelasnya, dan mengeksekusi blok tangkapan tanpa menjalankan blok tangkapan lainnya.
Keempat, tidak ada pernyataan lain yang mengikuti setelah pernyataan lemparan karena ini tidak memiliki kesempatan untuk dieksekusi.
Kelima, jika satu metode memanggil metode lain yang menyatakan pengecualian dilemparkan, maka metode ini menangani pengecualian atau menyatakan dilemparkan.
2.2Difference antara melempar dan melempar kata kunci:
Throw digunakan untuk melempar pengecualian, di dalam badan metode. Format sintaks adalah: Lempar objek pengecualian.
Lemparan digunakan untuk menyatakan pengecualian apa yang dapat dilemparkan dengan suatu metode. Setelah nama metode, format sintaks adalah:
Lempar Pengecualian Tipe 1, Tipe Pengecualian 2 ... Tipe Pengecualian n.
Tiga: Berikut ini mencantumkan beberapa situasi dan solusi yang sesuai di mana pengecualian penunjuk nol dapat terjadi:
Cuplikan Kode 1:
out.println (request.getParameter ("nama pengguna"));Analisis: Fungsi Segmen Kode 1 sangat sederhana, yaitu untuk menghasilkan nilai input pengguna "nama pengguna".
Catatan: Tampaknya pernyataan di atas tidak dapat menemukan kesalahan sintaks, dan dalam kebanyakan kasus, tidak ada masalah. Namun, jika pengguna tidak memberikan nilai bidang formulir "nama pengguna" saat memasukkan data, atau mem -bypass formulir secara langsung dimasukkan melalui beberapa cara, nilai permintaan ini. GetParameter ("Nama pengguna") kosong (perhatikan bahwa itu bukan string kosong, itu adalah objek kosong nol. "Java.lang.nullpointerException" Pengecualian. Selain itu, bahkan jika objek mungkin kosong, beberapa metode java.lang.Object atau objek itu sendiri dipanggil, seperti tostring (), sama (objek OBJ) dan operasi lainnya.
Cuplikan Kode 2:
String username = request.getParameter ("nama pengguna"); If (username.equals ("root")) {...}Analisis: Fungsi Segmen Kode 2 adalah untuk mendeteksi nama pengguna yang disediakan oleh pengguna. Jika itu adalah pengguna yang nama penggunanya "root", beberapa operasi khusus akan dilakukan.
Catatan: Dalam Segmen Kode 2, jika pengguna tidak memberikan nilai bidang formulir "nama pengguna", nama pengguna objek string adalah nilai nol, dan satu objek nol tidak dapat secara langsung dibandingkan dengan objek lain. Demikian pula, halaman JSP di mana Segmen Kode 2 berada akan melempar kesalahan pointer kosong.
Trik kecil: Jika Anda ingin membandingkan nilai pengembalian metode tertentu dengan konstanta dan meletakkan konstan di depannya, Anda dapat menghindari memanggil metode yang sama dari objek nol. Misalnya:
If ("root" .Equals (username)) {...}Bahkan jika objek nama pengguna mengembalikan objek nol, tidak akan ada pengecualian pointer nol di sini dan dapat berjalan seperti biasa.
Cuplikan 3:
String username = session.getAttribute ("session.userName"). ToString ();Analisis: Fungsi Segmen Kode 3 adalah untuk mengambil nilai sesi.
Catatan: Secara umum, jika pengguna sudah memiliki sesi, tidak ada masalah akan terjadi; Namun, jika server aplikasi memulai kembali saat ini dan pengguna belum masuk lagi (mungkin juga pengguna menutup browser tetapi masih membuka halaman asli.) Kemudian, nilai sesi akan tidak valid pada saat ini, menyebabkan nilai sesi. Eksekusi langsung operasi tostring () pada objek dengan nol akan menyebabkan sistem melempar pengecualian pointer nol.
Cuplikan 4:
public static void main (string args []) {person p = null; p.setname ("Zhang San"); System.out.println (p.getName ()); }Analisis: Deklarasikan objek seseorang dan cetak nama nama di objek.
Catatan: Pada saat ini, P Anda akan memiliki pengecualian pointer nol, karena Anda baru saja menyatakan bahwa objek tipe orang ini tidak membuat objek, jadi tidak ada referensi alamat dalam tumpukannya. Tidak perlu membuat objek saat menggunakan objek dan menggunakan metode ini.
A: Mulailah menggunakannya secara langsung terlepas dari apakah objek itu kosong atau tidak.
(JSP) Segmen Kode 1:
out.println (request.getParameter ("nama pengguna"));Analisis: Fungsi Segmen Kode 1 sangat sederhana, yaitu untuk menghasilkan nilai input pengguna "nama pengguna".
Catatan: Tampaknya pernyataan di atas tidak dapat menemukan kesalahan sintaks, dan dalam kebanyakan kasus, tidak ada masalah. Namun, jika pengguna tidak memberikan nilai bidang formulir "nama pengguna" saat memasukkan data, atau mem -bypass formulir secara langsung dimasukkan melalui beberapa cara, nilai permintaan ini. GetParameter ("Nama pengguna") kosong (perhatikan bahwa itu bukan string kosong, itu adalah objek kosong nol. "Java.lang.nullpointerException" Pengecualian. Selain itu, bahkan jika objek mungkin kosong, beberapa metode java.lang.Object atau objek itu sendiri dipanggil, seperti tostring (), sama (objek OBJ) dan operasi lainnya.
(JSP) Cuplikan 2:
String username = request.getParameter ("nama pengguna"); If (username.equals ("root")) {...}Analisis: Fungsi Segmen Kode 2 adalah untuk mendeteksi nama pengguna yang disediakan oleh pengguna. Jika itu adalah pengguna yang nama penggunanya "root", beberapa operasi khusus akan dilakukan.
Catatan: Dalam Segmen Kode 2, jika pengguna tidak memberikan nilai bidang formulir "nama pengguna", nama pengguna objek string adalah nilai nol, dan satu objek nol tidak dapat secara langsung dibandingkan dengan objek lain. Demikian pula, halaman JSP di mana Segmen Kode 2 berada akan melempar (java.lang.nullpointerException) Null Pointer Kesalahan.
(JSP) Cuplikan 3:
String username = session.getAttribute ("session.userName"). ToString ();Analisis: Fungsi Segmen Kode 3 adalah untuk mengambil nilai sesi.
Catatan: Secara umum, jika pengguna sudah memiliki sesi, tidak ada masalah akan terjadi; Namun, jika server aplikasi memulai kembali saat ini dan pengguna belum masuk lagi (mungkin juga pengguna menutup browser tetapi masih membuka halaman asli.) Kemudian, nilai sesi akan tidak valid pada saat ini, menyebabkan nilai sesi. Eksekusi langsung operasi tostring () pada objek yang nol akan menyebabkan sistem melempar (java.lang.nullpointerException) pengecualian penunjuk nol.
Di atas adalah konten lengkap dari diskusi singkat tentang penanganan pengecualian Java dari pengecualian pointer nol yang dibawa kepada Anda oleh editor. Saya harap semua orang akan mendukung wulin.com lebih banyak ~