Sudahkah Anda memperhatikan java.lang.NullPointerException (NPE)? 8 Praktik Terbaik untuk Menghindari NPE runtime di Java
Diterbitkan: 2020-10-07
Hindari Null Pointer Exception di Java dan Java Tips dan Praktik terbaik untuk menghindari NullPointerException di Java.
Sebagai Java Developer, saya yakin Anda pasti pernah menghadapi Null Pointer Exception (NPE) mulai hari pertama. Dalam sebagian besar kasus, pengecualian NPE menunjukkan jejak tumpukan yang jelas yang menunjukkan pin akar penyebab yang sama tetapi dalam kasus Aplikasi tingkat Perusahaan besar di mana Anda memiliki ratusan kelas, menjadi mimpi buruk untuk mengetahui akar penyebab sebenarnya.
Apa itu Pengecualian Null Pointer (NPE)?
NullPointerException (NPE)
adalah pengecualian yang terjadi saat Anda mencoba menggunakan referensi yang menunjuk ke tidak ada lokasi di memori (null) seolah-olah referensi objek.
Memanggil metode pada referensi null
atau mencoba mengakses bidang referensi nol akan memicu NPE. Ini adalah penyebab paling umum.
Sesuai JavaDoc, di bawah ini adalah penyebab utama NPE:
- Melempar
null
seolah-olah itu adalah nilaiThrowable
. - Memanggil metode instance dari objek
null
. - Mengakses atau memodifikasi bidang objek
null
. - Mengambil panjang
null
seolah-olah itu adalah array. - Mengakses atau memodifikasi slot
null
seolah-olah itu adalah array.
Sekarang pertanyaan sebenarnya adalah Bagaimana Menghindari java.lang.NullPointerException saat Runtime? Dalam tutorial ini kita akan melihat beberapa contoh yang membuat NPE saat runtime dan langkah-langkah yang perlu kita lakukan untuk menyelesaikannya.
Mari kita buat NPE saat runtime 1. Lihatlah contoh di bawah CrunchifyNullPointerExceptionTips.java
Kami akan membuat NPE 3 cara berbeda
- NPE akan dilempar jika Anda mencoba mengakses Objek null
- NPE akan dilempar jika Anda mencoba mengonversi String nol
- NPE akan dilempar jika Anda mencoba mengakses Objek nol selama inisialisasi kelas
Buat kelas CrunchifyNullPointerExceptionTips.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
package crunchify . com . tutorial ; /** * @author Crunchify.com * Have you Noticed java.lang.NullPointerException (NPE)? 8 Best practices to avoid runtime NPE in Java */ public class CrunchifyNullPointerExceptionTips { public static void main ( String [ ] args ) { try { // Example 1: NPE will be thrown if you are trying to access null Object CrunchifyNPE1 ( ) ; } catch ( NullPointerException crunchifyNPE1 ) { System . out . println ( "Exception in CrunchifyNPE1()" ) ; crunchifyNPE1 . printStackTrace ( ) ; } try { // Example 2: NPE will be thrown if you are trying to convert null String CrunchifyNPE2 ( ) ; } catch ( NullPointerException crunchifyNPE2 ) { System . out . println ( "\nException in CrunchifyNPE2()" ) ; // printStackTrace(): Prints this throwable and its backtrace to the standard error stream. // This method prints a stack trace for this Throwable object on the error output stream that is the value of the field System.err. // The first line of output contains the result of the toString() method for this object. // Remaining lines represent data previously recorded by the method fillInStackTrace(). crunchifyNPE2 . printStackTrace ( ) ; } try { // Example 3: NPE will be thrown if you are trying to access null Object during Class Initialization CrunchifyNPETest npe = new CrunchifyNPETest ( ) ; npe . getName ( ) ; // NullPointerException: Thrown when an application attempts to use null in a case where an object is required. These include: // - Calling the instance method of a null object. // - Accessing or modifying the field of a null object. // - Taking the length of null as if it were an array. // - Accessing or modifying the slots of null as if it were an array. // - Throwing null as if it were a Throwable value. } catch ( NullPointerException crunchifyNPE3 ) { System . out . println ( "\n Exception in CrunchifyNPETest()" ) ; crunchifyNPE3 . printStackTrace ( ) ; } } private static void CrunchifyNPE1 ( ) { Object crunchifyObj = null ; // hasCode(): Returns a hash code value for the object. // This method is supported for the benefit of hash tables such as those provided by java.util.HashMap. crunchifyObj . hashCode ( ) ; } private static void CrunchifyNPE2 ( ) { String crunchifyString ; crunchifyString = "https://crunchify.com" ; // The line 40 declares a variable named "crunchifyString", but, it does not contain a primitive value. Instead it contains a pointer (because the type is String // which is a reference type). Since you did not say as yet what to point to Java sets it to null, meaning "I am pointing at nothing". // In line 41, the new keyword is used to instantiate (or create) an object of type String and the pointer variable "crunchifyString" is assigned this // object. You can now reference the object using the dereferencing operator . (a dot). System . out . println ( "\nvalue: " + crunchifyString . toString ( ) + ", length: " + crunchifyString . length ( ) ) ; System . out . println ( "No NPE exception on line 51" ) ; // Now Let's create NPE String crunchifyString2 = null ; System . out . println ( crunchifyString2 . toString ( ) ) ; } } class CrunchifyNPETest { private String crunchifyName ; public void setName ( String name ) { this . crunchifyName = name ; } public void getName ( ) { printName ( crunchifyName ) ; } private void printName ( String s ) { System . out . println ( s + " (" + s . length ( ) + ")" ) ; } } |
Hasil:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Exception in CrunchifyNPE1 ( ) java . lang . NullPointerException : Cannot invoke "Object.hashCode()" because "crunchifyObj" is null at crunchify . com . tutorial . CrunchifyNullPointerExceptionTips . CrunchifyNPE1 ( CrunchifyNullPointerExceptionTips . java : 59 ) at crunchify . com . tutorial . CrunchifyNullPointerExceptionTips . main ( CrunchifyNullPointerExceptionTips . java : 14 ) value : https : //crunchify.com, length: 21 No NPE exception on line 51 Exception in CrunchifyNPE2 ( ) Exception in CrunchifyNPETest ( ) java . lang . NullPointerException : Cannot invoke "String.toString()" because "crunchifyString2" is null at crunchify . com . tutorial . CrunchifyNullPointerExceptionTips . CrunchifyNPE2 ( CrunchifyNullPointerExceptionTips . java : 75 ) at crunchify . com . tutorial . CrunchifyNullPointerExceptionTips . main ( CrunchifyNullPointerExceptionTips . java : 23 ) java . lang . NullPointerException : Cannot invoke "String.length()" because "s" is null at crunchify . com . tutorial . CrunchifyNPETest . printName ( CrunchifyNullPointerExceptionTips . java : 92 ) at crunchify . com . tutorial . CrunchifyNPETest . getName ( CrunchifyNullPointerExceptionTips . java : 88 ) at crunchify . com . tutorial . CrunchifyNullPointerExceptionTips . main ( CrunchifyNullPointerExceptionTips . java : 38 ) Process finished with exit code 0 |
Nah, ada beberapa tips dan trik yang bisa kita gunakan untuk menghindari NullPointerException saat runtime. Mari lihat.

Petunjuk 1:
Eclipse / IntelliJ IDE akan mencoba menampilkan NPE di ruang kerja. Perbaiki kode Anda selama pengembangan saja.

Petunjuk 2:
Tambahkan crunchifyI
sNullorEmpty
()
sebelum operasi pada objek. Tambahkan ini ke CrunchifyNullPointerExceptionTips.java
1 2 3 4 5 6 7 8 |
public static boolean crunchifyIsNullOrEmpty ( String crunchifyStr ) { if ( crunchifyStr == null ) return true ; else if ( crunchifyStr . trim ( ) . equals ( "" ) ) return true ; else return false ; } |
Pada program java di atas baris 55 dan 56 akan diganti dengan ini.
1 2 3 4 5 6 |
String crunchifyString2 = null ; if ( ! crunchifyIsNullOrEmpty ( crunchifyString2 ) ) { System . out . println ( crunchifyString2 . toString ( ) ) ; } else { System . out . println ( "crunchifyString2 is null" ) ; } |
Petunjuk 3:
Periksa apakah String null
setelah operasi trim().
1 2 3 |
public static boolean isNullOrEmptyAfterTrim ( String crunchifyStr ) { return ( crunchifyStr == null | | crunchifyStr . trim ( ) . length ( ) == 0 ) ; } |
Petunjuk 4:
Selalu gunakan Try Catch block
untuk mencegah Proses Runtime tidak terputus.
1 2 3 4 5 |
try { CrunchifyNPE1 ( ) ; } catch ( NullPointerException npe ) { System . out . println ( "Exception in CrunchifyNPE1()" + npe ) ; } |
Petunjuk 5:
Collections.emptyList()
lebih disukai karena penanganan obat generik yang lebih baik.
Petunjuk 6:
Gunakan Java Assertions
Pernyataan adalah pernyataan yang memungkinkan Anda menguji asumsi Anda tentang kode Anda. Misalnya, jika Anda menulis metode yang mengembalikan nama di sistem, Anda dapat menyatakan bahwa mengembalikan otherName jika String adalah null.
Penggunaan dasar dari asersi adalah:
1 2 3 4 5 6 7 8 |
assert < Expression > ; // or another usage is assert < Expression1 > : < Expression2 > ; // in our program add line below. private void printName ( String s ) { assert ( s ! = null ) : "Name must be not null" ; System . out . println ( s + " (" + s . length ( ) + ")" ) ; } |
Tapi ada masalah: Pernyataan tidak tersedia di lingkungan produksi dan kita tidak boleh menggunakan Pernyataan dengan logika bisnis apa pun.
Petunjuk 7:
Cobalah untuk menggunakan cek containsKey()
, containsValue()
, contains()
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
package com . crunchify . tutorial ; import java . util . * ; /** * @author Crunchify.com * */ public class CrunchifyContainsKeyExample { public static void main ( String args [ ] ) { HashMap < Integer , String > crunchifyMap = new HashMap < Integer , String > ( ) ; // populate hash map crunchifyMap . put ( 1 , "Crunchify" ) ; crunchifyMap . put ( 2 , "wordpress" ) ; crunchifyMap . put ( 3 , "java tutorials" ) ; // check existence of key 4 if ( crunchifyMap . containsKey ( 4 ) ) { System . out . println ( "Check if key 2 exists: " + crunchifyMap . get ( 4 ) ) ; } else { System . out . println ( "NPE for value 4 avoided" ) ; } } } |
Petunjuk 8:
Sebagai kesimpulan, selalu praktik yang baik untuk menjaga NPE selama pengembangan daripada men-debug dalam produksi saat runtime. Ada beberapa tips dan trik lain yang tersedia menggunakan Spring Framework Annotation, Factory Pattern
, Null Object Pattern, dll. Tapi saya akan mempersingkatnya sekarang.
Akan menerbitkan tutorial baru mungkin dalam seminggu yang satu ini. Pantau terus.
Apakah Anda ingin menambahkan sesuatu ke tutorial ini ATAU menemukan masalah, silakan bergabung dan berikan komentar Anda.