Javaではintをnullにできますか?


155

することができますintことがnull、Javaで?

例えば:

int data = check(Node root);

if ( data == null ) {
 // do something
} else {
 // do something
}

私の目標は、を返す関数を書くことintです。これintはノードの高さに格納され、ノードが存在しない場合はnullになるため、確認する必要があります。

私は宿題のためにこれを行っていますが、この特定の部分は宿題の一部ではなく、自分がしていることをやり遂げるのに役立ちます。

コメントをありがとうございましたが、実際にコードの下にあるものを実際に読んだ人はほとんどいないようです。この目標を他にどのようにして達成できるかを尋ねていました。それが機能しないことを理解するのは簡単でした。


1
コンパイル時エラーです。
MayurB 2013年

回答:


201

int nullにすることはできませんが、Integer できます。null整数のボックス化を解除するときは注意が必要です。これにより、多くの混乱と頭の引っかき傷が発生する可能性があります。

例えばこれ:

int a = object.getA(); // getA returns a null Integer

NullPointerExceptionオブジェクトがnullでないにもかかわらず、を提供します!

質問をフォローアップするために、値がないことを示したい場合は、調査しますjava.util.Optional<Integer>


2
Integerクラスが存在するのには十分な理由があるので、必要性が強い場合に使用してください。
Blessed Geek

6
@ h2g2java:HashMap <Integer、Integer>のようなものでは廃棄物のレベルが大きく、非強制的であるため、デフォルトのコレクションでそれらを使用できることが魅力的だとは思わないでください。これが、プリミティブのみを使用するTroveのTIntIntHashMapが、非強制的なHashMap <Integer、Integer>を一周する理由です。
SyntaxT3rr0r 2010

1
intはnullをチェックできませんが、Integerにキャストすることにより、Javaでintにnullを安全に割り当てることができます。たとえば、check(root)メソッドがnullを返すことができる場合、次のような方法でそれをintに安全にキャストできます。 this: int data = (Integer)check(node);
sactiw

@sactiw-詳しく説明できますか?私はあなたが何を手に入れているのか理解していません
ブライアン・アグニュー14年

7
@BrianAgnewここで私が言ったことを修正させてください、私は明らかに間違っていました、私は基本的にそれが箱を開けてint i = (Integer)null;いる間それが実行時にNPEを投げることに気づいていませんでした。
sactiw 2016年

40

いいえ。nullにできるのはプリミティブではなく、オブジェクト参照だけです。


3
OPがnull値を必要とする場合により適切なIntegerクラスについて言及する価値があります。または、負の値を使用して「見つかりません」を示すこともできます
Glen

31

見つけるための素晴らしい方法:

public static void main(String args[]) {
    int i = null;
}

コンパイルしてみてください。


37
実際に.. OPは、質問の最後のフレーズに従って、自分自身がすでにそれであることに気づきました。それが機能しないことを理解するのは簡単でした。
BalusC 2010

9
ほぼ4年後の子孫のために-そのビットは後で編集されました。
Matt Luongo、

3
しかし、Integer ii = null; int i = ii;コンパイルされますが、実行時にNullPointerExceptionがスローされます
premek.v

13

Javaでは、intはプリミティブ型であり、オブジェクトとは見なされません。null値を持つことができるのはオブジェクトのみです。だからあなたの質問への答えはノーです、それはヌルにすることはできません。しかし、ほとんどのプリミティブ型を表すオブジェクトがあるため、それほど単純ではありません。

クラスIntegerはint値を表しますが、null値を保持できます。checkメソッドによっては、intまたはIntegerを返す場合があります。

この動作は、Rubyなどのより純粋なオブジェクト指向言語とは異なります。Rubyでは、intなどの「プリミティブ」なものでさえオブジェクトと見なされます。


8

上記のすべての回答に加えて、この点も追加したいと思います。

プリミティブ型の場合、メモリサイズは固定されています。つまり、intの場合は4バイト、charの場合は2バイトです。また、メモリサイズが固定されていないため、nullはオブジェクトにのみ使用されます。

デフォルトでは、

   int a=0;

ではなく

   int a=null;

他のプリミティブ型と同じなので、nullはオブジェクトにのみ使用され、プリミティブ型には使用されません。


5

コードもコンパイルされません。のような十分な価値Objectがあることができます。次に、nullをテストできる基本的な例を示します。nullInteger

Integer data = check(Node root);

if ( data == null ) {
 // do something
} else {
 // do something
}

一方、check()ISを返すように宣言しint、それができないことはないnullと全体のif-elseブロックは不必要です。

int data = check(Node root);

// do something

check()がreturnを宣言されている場合、オートボクシングの問題はここでも適用されませんint。返された場合は、ではなくに割り当てるときにIntegerリスクが生じる可能性NullPointerExceptionintありIntegerます。それをとして割り当てIntegerif-elseブロックを使用することは実際に必須でした。

オートボクシングの詳細については、このSunガイドを確認してください


1
残念ながら、 "check"がIntegerではなくintを返す場合、int(nullにはならない)は自動的にIntegerにボックス化されるため、これは役に立ちません。
ポールトンブリン

2
D'oh、これはnullをテストできるときを示す基本的な例にすぎません。一方、checkがreturnを宣言されintている場合、nullになることはなく、ifブロック全体が不要になります。
BalusC 2010

3

私たちができるようにそれをint i宣言するように宣言する代わりにInteger ii=null;

Integer i;
i=null;

2

整数オブジェクトが最適です。プリミティブを使用する必要がある場合は、ユースケースに存在しない値を使用できます。負の高さは人には存在しないので、

public int getHeight(String name){
    if(map.containsKey(name)){
        return map.get(name);
    }else{
        return -1;
    }
}

1

いいえ、ただしint []は可能です。

int[] hayhay = null; //: allowed (int[] is reference type)
int   hayno  = null; //: error   (int   is primitive type)
                     //: Message: incompatible types: 
                     //: <null> cannot be converted to int

0

@Glenがコメントで述べたように、これを回避するには基本的に2つの方法があります。

  • 「範囲外」の値を使用します。たとえば、「データ」が通常の使用で負にならない場合は、無効であることを示す負の値を返します。
  • 整数を使用します。「check」メソッドがIntegerを返すことを確認し、それをintではなくIntegerに割り当てます。「int」が途中で関与する場合、自動ボックス化とボックス化解除が問題を引き起こす可能性があるためです。

0

check()メソッドでnullをチェックし、-1またはnullの場合はゼロなどの無効な値を返します。次に、nullを渡すのではなく、その値をチェックします。これは、昔の「C」では普通のことです。


0

int、boolean、またはfloatなどのプリミティブデータ型は、null(ラテラル)を格納できません。これは、Javaが、intからInteger、booleanからBooleanに同じように格納するためのWrapperクラスを提供しているためです。

例:整数i = null;


0

intはnullではなく、初期化されていない場合は0になることがあります。整数をnullにしたい場合は、intの代わりにIntegerを使用する必要があります。プリミティブにはnull値はありません。intのデフォルトのhaveは0です。

データ型/デフォルト値(フィールド用)

int ------------------ 0

ロング---------------- 0L

浮動小数点数---------------- 0.0f

ダブル------------- 0.0d

char --------------- '\ u0000'

文字列--------------- null

ブール値------------ false


-2

目標を達成する別の方法を求めるので、ラッパークラスを使用することをお勧めします。

new Integer(null);

-17

私は専門家ではありませんがnull、intに相当するものはだと思います0

たとえば、を作成するとint[]、別のスロットに設定しない限り、各スロットには0とは対照的にが含まれnullます。

状況によっては、これが役立つ場合があります。


非常に単純に、0はnullと同じではありません。
Dave Goodchild
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.