Java.lang.NullPointerException'ı (NPE) fark ettiniz mi? Java'da çalışma zamanı NPE'sinden Kaçınmak için 8 En İyi Uygulama
Yayınlanan: 2020-10-07
Java'da Null Pointer İstisnasından kaçının ve Java İpuçları ve Java'da NullPointerException'ı önlemek için en iyi uygulamalar.
Bir Java Geliştiricisi olarak, 1. günden itibaren Null Pointer Exception (NPE) ile karşılaşmış olmanız gerektiğine eminim. Çoğu durumda NPE istisnası, pinin aynı sorunun temel nedenini işaret eden net yığın izini gösterir, ancak yüzlerce sınıfınız olan büyük Kurumsal düzeyde Uygulama olması durumunda, gerçek kök nedenini bulmak kabus olur.
Boş İşaretçi İstisnası (NPE) nedir?
NullPointerException (NPE)
, bir nesneye başvuruyormuş gibi bellekte hiçbir konuma işaret etmeyen (boş) bir başvuru kullanmaya çalıştığınızda ortaya çıkan bir istisnadır.
Boş bir başvuruda bir yöntemi çağırmak veya null
bir başvuru alanına erişmeye çalışmak bir NPE'yi tetikleyecektir. Bu en yaygın nedendir.
JavaDoc'a göre, NPE'nin başlıca nedenleri aşağıdadır:
- Atılabilir bir
Throwable
gibinull
atmak. -
null
bir nesnenin örnek yöntemini çağırma. -
null
bir nesnenin alanına erişme veya alanı değiştirme. - Sanki bir diziymiş gibi
null
uzunluğunu almak. - Sanki bir diziymiş gibi
null
yuvalarına erişme veya bunları değiştirme.
Şimdi asıl soru, Çalışma Zamanında Java.lang.NullPointerException'dan Nasıl Kaçınılır? Bu eğitimde, çalışma zamanında NPE oluşturan birkaç örneğe ve bunu çözmek için gerçekleştirmemiz gereken adımlara bakacağız.
1. çalışma zamanında NPE oluşturalım. Aşağıdaki örneğe bir göz atın CrunchifyNullPointerExceptionTips.java
NPE 3 farklı şekilde oluşturacağız
- Boş Nesneye erişmeye çalışıyorsanız NPE atılacak
- Boş Dizeyi dönüştürmeye çalışıyorsanız NPE atılacak
- Sınıf başlatma sırasında boş Nesneye erişmeye çalışıyorsanız NPE atılacak
CrunchifyNullPointerExceptionTips.java sınıfını oluşturun
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 ( ) + ")" ) ; } } |
Sonuç:
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 |
Çalışma zamanında NullPointerException'ı önlemek için kullanabileceğimiz birkaç ipucu ve püf noktası var. Hadi bir bakalım.

İpucu 1:
Eclipse / IntelliJ IDE, çalışma alanında NPE'yi göstermeye çalışacaktır. Kodunuzu yalnızca geliştirme sırasında düzeltin.

İpucu 2:
Nesne üzerinde bir işlemden önce crunchifyI
sNullorEmpty
()
kontrolünü ekleyin. Bunu 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 ; } |
Yukarıdaki Java program satırı 55 ve 56 bununla değiştirilecektir.
1 2 3 4 5 6 |
String crunchifyString2 = null ; if ( ! crunchifyIsNullOrEmpty ( crunchifyString2 ) ) { System . out . println ( crunchifyString2 . toString ( ) ) ; } else { System . out . println ( "crunchifyString2 is null" ) ; } |
İpucu 3:
trim() işleminden sonra String'in null
olup olmadığını kontrol edin.
1 2 3 |
public static boolean isNullOrEmptyAfterTrim ( String crunchifyStr ) { return ( crunchifyStr == null | | crunchifyStr . trim ( ) . length ( ) == 0 ) ; } |
İpucu 4:
Kesintisiz Runtime Process'i önlemek için her zaman Try Catch block
kullanın.
1 2 3 4 5 |
try { CrunchifyNPE1 ( ) ; } catch ( NullPointerException npe ) { System . out . println ( "Exception in CrunchifyNPE1()" + npe ) ; } |
İpucu 5:
Jeneriklerin daha iyi işlenmesi nedeniyle Collections.emptyList()
tercih edilir.
İpucu 6:
Java Assertions
Kullan
Bir iddia, kodunuzla ilgili varsayımlarınızı test etmenizi sağlayan bir ifadedir. Örneğin, sistemde adı döndüren bir yöntem yazarsanız, String null ise, dönen otherName öğesinin olduğunu iddia edebilirsiniz.
İddiaların temel kullanımı şöyle olacaktır:
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 ( ) + ")" ) ; } |
Ancak bir sorun var: Assertion üretim ortamında mevcut değil ve Assertion'ı herhangi bir iş mantığıyla kullanmamalıyız.
İpucu 7:
includeKey containsKey()
, containsValue()
, contains()
kontrollerini kullanmayı deneyin.
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" ) ; } } } |
İpucu 8:
Sonuç olarak, çalışma zamanında üretimde hata ayıklamak yerine geliştirme sırasında NPE ile ilgilenmek her zaman iyi bir uygulamadır. Spring Framework Annotation, Factory Pattern
, Null Object Pattern vb. kullanarak kullanılabilecek başka ipuçları ve püf noktaları var. Ama şimdi kısa keseceğim.
Muhtemelen bu konuda bir hafta içinde yeni öğretici yayınlayacak. Bizi izlemeye devam edin.
Bu eğiticiye eklemek istediğiniz VEYA bir sorun buldunuz mu, lütfen araya girin ve yorumlarınızı bildirin.