Java 17 の新しい Nullpointer 例外
出典: Dev.toすべての Java 開発者は、 Java 17 における新しいNullpointer Exception (NPE) の存在について知っておく必要があります。これは、常に防止する必要がある状況の 1 つです。Nullpointer は、小さなバグを見つけるためにコードをデバッグする必要があることを意味する場合があります。 NPE は、コードで null 値を持つオブジェクトまたはオブジェクトへの参照を使用するときに発生する実行時例外です。これは、値が割り当てられていない場合、またはオブジェクトに参照がない場合に発生する可能性があります。OpenJDK の最新バージョン (バージョン 17) より前では、スタック トレース内の通常の Nullpointer 例外は次のようになります。java.lang.NullPointerException: null
もちろん、スタック トレースについて知っておく必要があるのはそれだけではありません。ご覧のとおり、この例外がどこで、またはなぜ発生したかは示されていません。Java 17 がこの問題にどのように対処するかをご覧ください。
Exception in thread "main" java.lang.NullPointerException:
Cannot assign field "i" because "a" is null
at Prog.main(Prog.java:5)
この例では、例外は null オブジェクト参照がどこにあるのか、またどのようなものであるのかを示しています。それはとても簡単です!
Java で <T> は何を意味しますか?
出典: Dev.to <T> は「Type」を表す一般的な文字で、Java の汎用概念を指します。これには別の文字を使用できますが、ご覧のとおり、文字 T の方が望ましいです。ジェネリックとは何ですか?
ジェネリックは、クラス、メソッド、またはインターフェイスをパラメータ化する方法です。ジェネリックの例を見てみましょう。package Generics;
class House<T>{
T doorNumber;
public House(T doorNumber) {
this.doorNumber = doorNumber;
}
public void print(){
System.out.println("Your house number is: " + this.doorNumber);
}
}
- 任意のオブジェクト型を受け入れることができるHouseというクラスがあります。
- 次に、 doorNumberというフィールドがあり、これも任意のタイプのオブジェクトを受け入れることができます。
- 最後に、パラメーター化されたコンストラクターを宣言し、ドアの番号を出力します。
public class GenericsExample {
public static void main(String[] args) {
House<String> mainHouse = new House<>("14a");
mainHouse.print();
}
}
結果は次のようになります。
あなたの番地は: 14a
文字「T」を「String」に置き換えて、コンストラクターに家の番号を入力します。たとえば、複数のオブジェクトを受け入れるクラスが必要な場合は、複数の型を使用できます。別の文字を追加することで、「クラスに別のジェネリックを受け入れてほしい」と言うことができます。
package Generics;
class House<T, V>{
T doorNumber;
V streetName;
public House(T doorNumber, V streetName) {
this.doorNumber = doorNumber;
this.streetName = streetName;
}
public void print(){
System.out.println("You live at: " + this.doorNumber + " " + this.streetName);
}
}
public class GenericsExample {
public static void main(String[] args) {
House<Integer, String> mainHouse = new House<>(14, "Tellson Avenue");
mainHouse.print();
}
}
結果は次のようになります。
あなたのお住まいの住所: 14 Tellson Avenue
これまで、クラス レベルで Generic を使用する例を見てきました。ただし、共通のメソッドやインターフェイスを使用することもできます。
一般的な方法
package Generics;
class House{
public <T> void print(T doorNumber){
System.out.println("You live at house number: " + doorNumber);
}
}
public class GenericsExample {
public static void main(String[] args) {
House mainHouse = new House();
mainHouse.<Integer>print(14);
}
}
このメソッドは任意のタイプのオブジェクトを受け入れ、任意のタイプのObject となるドア番号を出力します。この場合、メソッドが整数を受け入れるようにする必要があります。結果は次のようになります。
あなたは家番号: 14 に住んでいます
汎用インターフェース
まずインターフェースを作成します。package Generics;
interface Property<T>{
void hasBalcony(T balcony);
}
次にインターフェースを実装します。
package Generics;
public class House implements Property<String> {
@Override
public void hasBalcony(String balcony) {
System.out.println("Is there a balcony in the room? " + balcony);
}
public static void main(String[] args) {
House mainHouse = new House();
mainHouse.hasBalcony("YES");
}
}
結果:
部屋にバルコニーはありますか?はい
ジェネリック医薬品を使用するメリットは何ですか?
- コンパイル時のチェックの改善: 指定したオブジェクト型以外のオブジェクト型を使用すると、コンパイラはその旨を通知します。
- 再利用性: 達成しようとしている内容に応じて使用するオブジェクトの種類を決定するため、クラス、メソッド、またはインターフェイスを複数回使用できます。
- データ構造とアルゴリズムに最適です。ArrayListとHashMapは、Generic が使用されるほんの一例にすぎません。
GO TO FULL VERSION