JavaRush /Java Blog /Random-KO /자바의 NULL에 관한 9가지
Sdu
레벨 17

자바의 NULL에 관한 9가지

Random-KO 그룹에 게시되었습니다
Javanull은 함께 사용됩니다. " 널 포인터 예외 " 를 경험하지 않은 Java 프로그래머는 거의 없으며 이는 슬픈 사실입니다. "null" 개념을 창안한 사람도 이를 자신의 수십억 달러 실수라고 불렀는데, Java가 이를 지원하는 이유는 무엇일까요? null은 오랫동안 여기에 있었으며 Java 제작자는 이것이 해결하는 것보다 더 많은 문제를 야기한다는 것을 알고 있는데 왜 여전히 이를 참아내고 있는 것 같습니다. Java의 철학은 모든 것을 단순화하는 것이었기 때문에 이것이 나를 더욱 놀라게 했습니다. 이것이 Java가 더 이상 포인터, 연산자 오버로딩 및 다중 상속을 다루지 않는 이유입니다. 그런데 왜 null일까요? 자바의 NULL에 관한 9가지 - 1글쎄요, 저는 그 질문에 대한 답을 잘 모르지만, 제가 아는 것은 Java 프로그래머와 오픈 소스 커뮤니티가 null을 아무리 비판하더라도 우리는 이를 감수해야 한다는 것입니다. 후회하는 것보다 더 자세히 알아보고 null을 올바르게 사용하는지 확인하는 것이 좋습니다.

Java에서 null에 대해 배워야 하는 이유는 무엇입니까?

null에 주의를 기울이지 않으면 Java가 당신을 끔찍하게 고통스럽게 만들고 java.lang.NullPointerException교훈을 얻게 될 것이라고 확신할 수 있지만 더 어려운 길을 택하게 될 것입니다. 충돌 방지 코드를 작성하는 것은 예술이며 팀, 고객 및 사용자가 이를 높이 평가할 것입니다. 내 경험에 따르면, 주된 이유 중 하나는 NullPointerExceptionJava의 null에 대한 지식이 부족하기 때문입니다. 많은 분들이 이미 null에 대해 잘 알고 계시며, 나머지 분들도 null 키워드에 대해 오래되고 새로운 내용을 배우실 수 있을 것입니다. Java의 null에 대한 몇 가지 중요한 사항을 검토하거나 배워 보겠습니다.

Java에서 null이란 무엇입니까?

앞서 말했듯이 null은 Java에서 매우 중요한 개념입니다. 원래는 사용자, 리소스 등의 부재와 같은 무언가의 부재를 나타내기 위해 발명되었지만 많은 null pointer exception. 이 튜토리얼에서는 Java의 null 키워드에 대한 기본 사실을 배우고 null pointer exceptionsnull 검사 문제를 피하고 최소화하는 몇 가지 요령을 배웁니다.
  1. 먼저 null은 , 또는 와 같은 Java의 public키워드 static입니다 final. 대소문자가 구분됩니다. Null 또는 NULL로 null을 쓸 수 없으며 컴파일러는 이를 인식하지 못하고 오류가 발생합니다.

    Object obj = NULL; // Not Ok
    Object obj1 = null //Ok

    종종 다른 프로그래밍 언어에서 전환한 프로그래머가 이 문제에 직면하지만 최신 IDE를 사용하면 문제가 미미해집니다. 요즘에는 Eclipse나 NetBeans 같은 IDE를 사용하면 입력하는 동안 이 오류를 해결할 수 있지만 Notepad, Vim, Emacs 시대에는 귀중한 시간을 많이 잡아먹을 수 있는 일반적인 문제였습니다.

  2. Так же, 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, который является статическим методом и не позволяет обращаться к не статическим переменным изнутри.

  3. Несмотря на распространенное заблуждение, 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.

  4. null может быть назначен только ссылочному типу, Вы не можете назначить null примитивной переменной вроде int, double, float or boolean. Компилятор выразит Вам свое недовольство если Вы сделаете 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, и мы еще встретимся с ним в следующем пункте.

  5. Любой класс-обертка со 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를 변수로 변환하려고 하면 자동 박싱이 발생합니다 .intput()get()HashMapnull pointer exceptionint

  6. 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이는 유형 캐스트를 테스트하는 데 유용하게 만드는 연산자의 중요한 속성입니다 .

  7. 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)
  8. 모든 참조 유형을 허용하는 메소드에 매개변수로 null을 전달할 수 있습니다. 예를 들면 다음과 같습니다.

    public void print(Object obj)

    다음과 같이 호출할 수 있습니다.

    print(null)

    이는 컴파일러의 관점에서는 정상이지만 후속 동작은 전적으로 메서드에 따라 달라집니다. null 안전 메서드는 을 throw하지 않고 NullPointerException단순히 정상적으로 종료됩니다. 비즈니스 논리가 허용하는 경우 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){
    
    		}
    	}
    }

    Output:
    null == null is true in Java
이것은 Java의 null에 관한 것입니다. Java 프로그래밍에 대한 경험을 쌓고 간단한 트릭을 사용하여 를 방지하면 NullPointerException코드를 안전하게 만들 수 있습니다. 왜냐하면 null은 비어 있거나 초기화되지 않은 값으로 처리될 수 있습니다. 이는 종종 혼란의 원인이 되므로 null 값이 입력될 때 메서드의 동작을 문서화하는 것이 중요합니다. null은 참조 변수의 기본값이며 Java에서 null 참조를 사용하여 인스턴스 메서드를 호출하거나 인스턴스 변수에 액세스할 수 없다는 점을 항상 기억하세요.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION