JavaRush /Java Blog /Random-JA /Java の NULL に関する 9 つのこと
Sdu
レベル 17

Java の NULL に関する 9 つのこと

Random-JA グループに公開済み
Javanull は密接に関連しています。「 null ポインタ例外」に遭遇したことのない Java プログラマはほとんどいないでしょうが、これは悲しい事実です。「null」概念の発明者ですら、それを十億ドル規模の間違いだと呼んでいるのに、なぜ Java はそれをサポートしているのでしょうか? null は長い間存在しており、Java の作成者は、null が解決するよりも多くの問題を引き起こすことを知っていると思います。それなのに、なぜまだ我慢しているのでしょうか。そして、これにはさらに驚きました。なぜなら、Java の哲学は物事を単純化することであり、それが Java がポインタ、演算子のオーバーロード、および多重継承をいじらない理由です。しかし、なぜ null なのでしょうか? Java の NULL に関する 9 つのこと - 1そうですね、その質問に対する答えはよくわかりませんが、わかっていることは、null が Java プログラマやオープンソース コミュニティからどれほど批判されても、私たちはそれを受け入れなければならないということです。後悔するよりも、もっと学んで、null を正しく使用できるようにする方が良いでしょう。

Java で null について学ぶ必要があるのはなぜですか?

なぜなら、null に注意を払わないと、Java があなたをひどい目に遭わせ、教訓を学ぶことになるでしょうがjava.lang.NullPointerException、大変な道を歩むことになるからです。クラッシュ耐性のあるコードを書くことは芸術であり、チーム、顧客、ユーザーはそれを高く評価するでしょう。私の経験では、主な理由の 1 つはNullPointerExceptionJava の null に関する知識が不足していることです。皆さんの多くは、null についてすでによく知っていますが、残りの皆さんも、null キーワードについて古くて新しいことをいくつか学ぶことができるでしょう。Java の null に関する重要なことをいくつか確認または学習しましょう。

Javaのnullとは何ですか

先ほども述べたように、null は Java において非常に重要な概念です。これは元々、ユーザーやリソースなどが存在しないことなど、何かが存在しないことを示すために発明されましたが、多くのnull pointer exception. このチュートリアルでは、Java の null キーワードに関する基本的な事実を学び、null pointer exceptionsnull チェックに関する問題を回避し、最小限に抑えるためのいくつかのトリックを学びます。
  1. まず最初に、null は Java のキーワードであり、publicstaticと同じですfinal。大文字と小文字は区別され、null を Null または NULL として記述することはできません。コンパイラはそれを認識せず、エラーがスローされます。

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

    この問題は、他のプログラミング言語から切り替えたプログラマーがよく遭遇しますが、最新の IDE を使用すると、この問題は重要ではなくなります。最近では、Eclipse や NetBeans などの IDE で入力中にこのエラーを修正できますが、メモ帳、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への変換を処理すると考えているかもしれませんが、数値がまだカウントされていない場合、メソッドはデフォルト値がゼロではなく nullを返すことを忘れています。 is Integer これは 0 ではなく null であり、 Integer を variable に変換しようとするとオートボクシングがスローされます。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 セーフ メソッドは をスローせず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