Java에서 Null에 대한 9가지 설명(Java Null 상세)

8646 단어 JavaNull
자바 프로그래머에게 null은 골치 아픈 것이다.빈 지침 이상(NPE)으로 인해 자주 소란을 피웁니다.자바의 발명자조차도 이것이 그의 거대한 실수라고 인정했다.자바는 왜 null을 유지합니까?null이 등장한 지 한참이 되었고 저는 Java 발명자가 null이 해결한 문제에 비해 더 많은 번거로움을 가져왔다는 것을 알고 있지만 null은 여전히 Java와 동행하고 있다고 생각합니다.
나는 더욱 놀랐다. 왜냐하면 자바의 디자인 원리는 일을 간소화하기 위해서이다. 그것이 바로 왜 바늘, 조작부호 재부팅, 다계승 실현에 시간을 낭비하지 않았기 때문이다.null은 이와 정반대이다.그래, 나는 정말 이 문제의 답을 모른다. 내가 아는 것은null이 자바 개발자와 개원 커뮤니티에 어떻게 비판받든지 간에 우리는null과 함께 존재해야 한다는 것이다.null의 존재를 후회하기보다는 null을 정확하게 사용할 수 있도록 더 잘 배워야 합니다.
왜 자바에서null을 배워야 합니까?만약null에 주의하지 않는다면, 자바는 빈 바늘로 인해 이상한 고통을 받게 되고, 또한 침통한 교훈을 얻게 될 것이다.정력이 넘치는 프로그래밍은 예술입니다. 당신의 팀, 고객과 사용자는 당신을 더욱 좋아할 것입니다.제 경험으로 볼 때 빈 바늘이 이상한 가장 주요한 원인은 자바에 있는null에 대한 지식이 부족하기 때문입니다.너희들 중 많은 것들은 이미 null에 대해 익숙해졌지만, 그다지 익숙하지 않은 것들에 대해서는 null의 낡은 것과 새로운 지식을 배울 수 있다.우리 함께 자바에서 null의 중요한 지식을 다시 공부합시다.
Java의 Null은 무엇입니까?
내가 말한 바와 같이null은 자바에서 매우 중요한 개념이다.null 디자인의 취지는 일부 부족한 것, 예를 들어 부족한 사용자, 자원 또는 다른 것을 표시하기 위한 것이다.그러나 1년 뒤 골치 아픈 빈 바늘이 이상하게 자바 프로그래머들에게 적지 않은 소란을 피웠다.이 자료에서 우리는 자바에서 null 키워드의 기본적인 세부 사항을 배우고, 가능한 한 null의 검사를 줄이고 메스꺼운 빈 바늘 이상을 피하는 기술을 탐색할 것이다.
1) 우선,null은 자바의 키워드입니다. 예를 들어public,static,final입니다.대소문자가 민감해서null이나 NULL로 쓸 수 없습니다. 컴파일러는 그것들을 식별하지 못하고 오류를 보고할 수 없습니다.

Object obj = NULL; // Not Ok
Object obj1 = null  //Ok
다른 언어를 사용하는 프로그래머에게 이 문제가 있을 수 있지만, 현재 IDE의 사용은 이 문제를 보잘것없게 만들었다.이제 코드를 두드릴 때 IDE, 예를 들어 Eclipse, Netbeans가 이 오류를 수정할 수 있습니다.그러나 노트패드, Vim, Emacs 같은 다른 도구를 사용하면 귀중한 시간을 낭비할 수 있습니다.
2) 모든 원시 형식에 기본값이 있는 것처럼, int 기본값이 0이고, boolean의 기본값은false이며, null은 모든 인용 형식의 기본값이며, 엄격하지 않은 것은 모든object 형식의 기본값입니다.부울 형식의 변수를 만들었듯이false를 기본값으로 하고 자바의 모든 인용 변수는null을 기본값으로 합니다.구성원 변수, 국부 변수, 실례 변수, 정적 변수 등 모든 변수에 적용됩니다. 초기화되지 않은 국부 변수를 사용하면 컴파일러가 경고합니다.이 사실을 증명하기 위해서, 다음 코드와 같이 변수를 만들고 그 값을 인쇄해서 이 인용 변수를 관찰할 수 있습니다.

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
이것은 정적과 비정적object에 있어서 모두 정확하다.여기서 보듯이 저는 myObj를 정적 인용으로 정의하기 때문에 주 방법에서 직접 사용할 수 있습니다.주 방법은 정적 방법이므로 비정적 변수를 사용할 수 없습니다.
3) 우리는 몇 가지 오해를 분명히 해야 한다. null은 대상도 유형도 아니다. 이것은 단지 특수한 값일 뿐이다. 너는 그것을 어떤 인용 유형에 부여할 수도 있고, 너도null을 어떤 유형으로 전환할 수도 있다. 아래의 코드를 보자.

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을 어떤 인용 형식으로 강제로 바꾸는 것은 가능하며, 실행 시기에는 빈 바늘 이상을 던지지 않습니다.
4)null은 인용 변수에 값을 부여할 수 있습니다. int,double,float,boolean 같은 기본 형식 변수에 null을 부여할 수 없습니다.만약 네가 그렇게 한다면, 컴파일러는 다음과 같이 오류를 보고할 것이다.

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을 패키지 클래스object에 부여하고object를 각각의 기본 형식에 부여하면 컴파일러는 보고하지 않지만, 실행 중 빈 바늘 이상을 만날 수 있습니다.이것은 자바의 자동 해체로 인해 발생한 것입니다. 우리는 다음 요점에서 그것을 볼 것입니다.
5) null 값을 포함하는 모든 패키지 클래스는 자바 상자를 뜯어서 기본 데이터 형식을 만들 때 빈 바늘 이상을 던집니다.일부 프로그래머들은 이러한 오류를 범한다. 그들은 자동 포장이 null을 각자의 기본 형식의 기본값으로 변환할 것이라고 생각한다. 예를 들어 int를 0, 볼 형식을false로 변환할 것이다. 그러나 그것은 정확하지 않다. 아래와 같다.

Integer iAmNull = null;
int i = iAmNull; // Remember - No Compilation Error
그러나 위의 코드 세션을 실행할 때, 컨트롤러에서 메인 라인이 빈 바늘을 던지는 것을 볼 수 있습니다.HashMap과 Integer 키 값을 사용할 때 이런 오류가 많이 발생합니다.다음 코드를 실행할 때 오류가 발생합니다.

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
      }      
    }
}

출력:

Exception in thread "main" java.lang.NullPointerException
 at Test.main(Test.java:25)
이 코드는 보기에 매우 간단하고 오류가 없다.네가 하는 모든 것은 한 숫자가 수조에 몇 번이나 나타났는지 찾는 것이다. 이것은 자바 수조의 전형적인 중복 찾기 기술이다.개발자는 먼저 이전의 수치를 얻은 다음에 하나를 더하고 마지막에 값을 맵에 다시 넣는다.프로그래머는put 방법을 호출할 때, 자동 포장은 int를 인터거로 포장하는 것을 스스로 처리한다고 생각할 수도 있지만, 숫자가 계수값이 없을 때,HashMap의 get () 방법은 0이 아니라null로 되돌아오는 것을 잊어버렸다. 왜냐하면 Integer의 기본값은 0이 아니라null이기 때문이다.null 값을 int형 변수에 전달할 때 자동 포장은 빈 바늘 이상으로 되돌아옵니다.만약에 이 코드가 if 플러그인에 있고 QA 환경에서 실행되지 않는다면 생산 환경에 놓으면 BOOM:-)
6)null 값이 있는 인용 형식 변수를 사용하면 instanceof 작업은 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");
}

출력:

i
AmNull is NOT an instance of Integer
이것은 instanceof 조작의 매우 중요한 특성으로 유형 강제 변환 검사에 유용하다
7) 값이 null인 인용 형식 변수를 사용할 수 없는 비정상적인 방법을 사용할 수 없다는 것을 알 수 있습니다.빈 바늘 이상을 내보낼 수 있지만, 정적 방법을 사용하여null의 인용 형식 변수를 사용할 수 있습니다.정적 방법은 정적 귀속을 사용하기 때문에 빈 바늘 이상을 던지지 않습니다.다음은 예입니다.

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");
   }

출력:

I am static method, can be called by null reference
Exception in thread "main" java.lang.NullPointerException
               at Testing.main(Testing.java:11)
8)null을 방법에 전달할 수 있습니다. 이 방법은 모든 인용 형식을 받아들일 수 있습니다. 예를 들어publicvoidprint(Object obj)는print(null)를 호출할 수 있습니다.번역의 측면에서 볼 때 이것은 가능하지만, 결과는 완전히 방법에 달려 있다.Null 안전한 방법, 예를 들어 이 예에서print 방법은 빈 바늘 이상을 던지지 않고 우아하게 종료합니다.업무 논리가 허락된다면,null 안전한 방법을 추천합니다.
9)==또는!=조작은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){

       }
    }
}

출력:

null == null is true in Java
이것은 Java의 null에 대한 전부입니다.자바 프로그래밍의 경험과 간단한 기교를 통해 빈 바늘의 이상을 피하면 코드를 null로 안전하게 만들 수 있습니다.null은 항상 비어 있거나 초기화되지 않은 값이기 때문에, 곤혹스러운 원천이다.방법에 대해 말하자면, null을 매개 변수로 기록할 때 방법이 어떤 행동을 하는지도 매우 중요하다.요컨대, null은 모든 인용 형식 변수의 기본값입니다. 자바에서 null 인용을 사용해서 모든 instance 방법이나 instance 변수를 호출할 수 없습니다.

좋은 웹페이지 즐겨찾기