Java에서 null에 대해 배워야 하는 이유는 무엇입니까?
null에 주의를 기울이지 않으면 Java가 당신을 끔찍하게 고통스럽게 만들고java.lang.NullPointerException
교훈을 얻게 될 것이라고 확신할 수 있지만 더 어려운 길을 택하게 될 것입니다. 충돌 방지 코드를 작성하는 것은 예술이며 팀, 고객 및 사용자가 이를 높이 평가할 것입니다. 내 경험에 따르면, 주된 이유 중 하나는 NullPointerException
Java의 null에 대한 지식이 부족하기 때문입니다. 많은 분들이 이미 null에 대해 잘 알고 계시며, 나머지 분들도 null 키워드에 대해 오래되고 새로운 내용을 배우실 수 있을 것입니다. Java의 null에 대한 몇 가지 중요한 사항을 검토하거나 배워 보겠습니다.
Java에서 null이란 무엇입니까?
앞서 말했듯이 null은 Java에서 매우 중요한 개념입니다. 원래는 사용자, 리소스 등의 부재와 같은 무언가의 부재를 나타내기 위해 발명되었지만 많은null pointer exception
. 이 튜토리얼에서는 Java의 null 키워드에 대한 기본 사실을 배우고 null pointer exceptions
null 검사 문제를 피하고 최소화하는 몇 가지 요령을 배웁니다.
-
먼저 null은 , 또는 와 같은 Java의
public
키워드static
입니다final
. 대소문자가 구분됩니다. Null 또는 NULL로 null을 쓸 수 없으며 컴파일러는 이를 인식하지 못하고 오류가 발생합니다.Object obj = NULL; // Not Ok Object obj1 = null //Ok
종종 다른 프로그래밍 언어에서 전환한 프로그래머가 이 문제에 직면하지만 최신 IDE를 사용하면 문제가 미미해집니다. 요즘에는 Eclipse나 NetBeans 같은 IDE를 사용하면 입력하는 동안 이 오류를 해결할 수 있지만 Notepad, Vim, Emacs 시대에는 귀중한 시간을 많이 잡아먹을 수 있는 일반적인 문제였습니다.
-
Так же, How каждый примитив имеет meaning по умолчанию, например, у
int
это 0, у boolean это false, null это meaning по умолчанию любых ссылочных типов, проще говоря, для всех an objectов. Так же, How при создании логической переменной ее meaning по умолчанию равно false, так и любые ссылочные переменные в Java по умолчанию будут равны null. Это истинно для всех типов переменных: переменной-члена or локальной переменной, переменной экземпляра or статической переменной, кроме того, компилятор будет ругаться, если Вы используете локальную переменную не проинициализировав ее.private static Object myObj; public static void main(String args[]){ System.out.println("What is value of myObjc : " + myObj); } What is value of myObjc : null
Это истинно How для статических, так и для не статических an objectов, How Вы можете видеть здесь, я сделал
myObj
статической ссылкой, так что я могу использовать ее непосредственно в методеmain
, который является статическим методом и не позволяет обращаться к не статическим переменным изнутри. -
Несмотря на распространенное заблуждение, null это не an object (
Object
) и ни тип. Это просто специальное meaning, которое может быть назначено любому ссылочному типу, и Вы можете привести null к любому типу, How показано ниже:String str = null; // null can be assigned to String Integer itr = null; // you can assign null to Integer also Double dbl = null; // null can also be assigned to Double String myStr = (String) null; // null can be type cast to String Integer myItr = (Integer) null; // it can also be type casted to Integer Double myDbl = (Double) null; // yes it's possible, no error
Как Вы можете видеть, приведение null к любому ссылочному типу пройдет успешно How во время компиляции, так и во время выполнения программы. В отличии от того, что многие из Вас возможно подумали, это не приведет к выбрасыванию
NullPointerException
. -
null может быть назначен только ссылочному типу, Вы не можете назначить null примитивной переменной вроде
int
,double
,float
orboolean
. Компилятор выразит Вам свое недовольство если Вы сделаете How показано ниже:int i = null; // type mismatch : cannot convert from null to int short s = null; // type mismatch : cannot convert from null to short byte b = null: // type mismatch : cannot convert from null to byte double d = null; //type mismatch : cannot convert from null to double Integer itr = null; // this is ok int j = itr; // this is also ok, but NullPointerException at runtime
Как Вы можете видеть, когда мы непосредственно присваиваем null примитиву, то получаем ошибку процесса компиляции, но, если присвоить null an objectу класса-обертки, а затем присвоить этот an object соответствующему примитивному типу, компилятор не отреагирует, но мы будем вознаграждены
null pointer exception
во время выполнения. Это происходит из-за авто упаковки (autoboxing
) в Java, и мы еще встретимся с ним в следующем пункте. -
Любой класс-обертка со meaningм null будет выбрасывать
java.lang.NullPointerException
когда Java распакует(unbox
) его в примитивную переменную. Некоторые программисты делают ошибку допуская, что авто упаковка(autoboxing
) позаботится о конвертации null в meaning по умолчанию для соответствующего примитивного типа, например, 0 дляint
, false дляboolean
и т.д., но это не верно, в чем можно убедиться ниже:Integer iAmNull = null; int i = iAmNull; // Remember - No Compilation Error
Но, когда Вы запустите данный фрагмент codeа, в консоли Вы увидите
Exception in thread "main" java.lang.NullPointerException
Это часто происходит при работе с
HashMap
иInteger key
. Выполнение codeа, показанного ниже прервется, How только Вы его запустите.import java.util.HashMap; import java.util.Map; /** * An example of Autoboxing and NullPointerExcpetion * * @author WINDOWS 8 */ public class Test { public static void main(String args[]) throws InterruptedException { Map numberAndCount = new HashMap<>(); int[] numbers = {3, 5, 7,9, 11, 13, 17, 19, 2, 3, 5, 33, 12, 5}; for(int i : numbers){ int count = numberAndCount.get(i); numberAndCount.put(i, count++); // NullPointerException here } } }
Output: Exception in thread "main" java.lang.NullPointerException at Test.main(Test.java:25)
이 코드는 매우 단순하고 무해해 보입니다. 중복 항목을 찾는 고전적인 기술인 배열에 숫자가 몇 번 나타나는지 간단히 계산하면 됩니다. 개발자는 이전에 계산된 수량을 가져와서 1만큼 늘린 다음 다시 에 삽입합니다
Map
. 그는 메소드가 호출될 때와 마찬가지로 자동 박싱이Integer
로의 변환을 처리할 것이라고 생각할 수도 있지만 숫자가 아직 계산되지 않은 경우 메소드는 기본값이 0이 아닌 null을 반환한다는 사실을 잊어버렸습니다. is Integer 이것은 0이 아닌 null이며 Integer를 변수로 변환하려고 하면 자동 박싱이 발생합니다 .int
put()
get()
HashMap
null pointer exception
int
-
instanceof
값이 null이거나 null 자체인 참조 변수가 매개 변수로 지정된 경우 연산자는 false를 반환합니다. 예:Integer iAmNull = null; if(iAmNull instanceof Integer){ System.out.println("iAmNull is instance of Integer"); }else{ System.out.println("iAmNull is NOT an instance of Integer"); }
Output : iAmNull is NOT an instance of Integer
instanceof
이는 유형 캐스트를 테스트하는 데 유용하게 만드는 연산자의 중요한 속성입니다 . -
null 참조 변수에 대해 비정적 메서드를 호출할 수 없다는 것은 알고 있지만 을 호출
NullPointerException
하지만 null 참조 변수에 대해 정적 메서드를 호출할 수 있다는 사실은 모를 수도 있습니다. 왜냐하면 정적 메소드는 정적 바인딩을 사용하므로 버리지 않습니다NullPointerException
. 예는 다음과 같습니다.public class Testing { public static void main(String args[]){ Testing myObject = null; myObject.iAmStaticMethod(); myObject.iAmNonStaticMethod(); } private static void iAmStaticMethod(){ System.out.println("I am static method, can be called by null reference"); } private void iAmNonStaticMethod(){ System.out.println("I am NON static method, don't date to call me by null"); } }
Output: I am static method, can be called by null reference Exception in thread "main" java.lang.NullPointerException at Testing.main(Testing.java:11)
-
모든 참조 유형을 허용하는 메소드에 매개변수로 null을 전달할 수 있습니다. 예를 들면 다음과 같습니다.
public void print(Object obj)
다음과 같이 호출할 수 있습니다.
print(null)
이는 컴파일러의 관점에서는 정상이지만 후속 동작은 전적으로 메서드에 따라 달라집니다. null 안전 메서드는 을 throw하지 않고
NullPointerException
단순히 정상적으로 종료됩니다. 비즈니스 논리가 허용하는 경우 null 안전 메서드를 작성하는 것이 좋습니다. -
==
(같음) 및 (같지 않음) 연산자를 사용하여 null을 비교할 수!=
있지만<
(보다 작음) 또는>
(보다 큼)과 같은 다른 산술 또는 논리 연산자와 함께 사용할 수는 없습니다. SQL과 달리 Java는null == null
아래와 같이 true를 반환합니다.public class Test { public static void main(String args[]) throws InterruptedException { String abc = null; String cde = null; if(abc == cde){ System.out.println("null == null is true in Java"); } if(null != null){ System.out.println("null != null is false in Java"); } // classical null check if(abc == null){ // do something } // not ok, compile time error if(abc > null){ } } }
Output: null == null is true in Java
NullPointerException
코드를 안전하게 만들 수 있습니다. 왜냐하면 null은 비어 있거나 초기화되지 않은 값으로 처리될 수 있습니다. 이는 종종 혼란의 원인이 되므로 null 값이 입력될 때 메서드의 동작을 문서화하는 것이 중요합니다. null은 참조 변수의 기본값이며 Java에서 null 참조를 사용하여 인스턴스 메서드를 호출하거나 인스턴스 변수에 액세스할 수 없다는 점을 항상 기억하세요.
GO TO FULL VERSION