Java에서 int가 null 일 수 있습니까?


155

Java에 int있을 수 있습니까 null?

예를 들면 다음과 같습니다.

int data = check(Node root);

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

내 목표는을 반환하는 함수를 작성하는 것입니다 int. 이 int노드는 노드의 높이에 저장되며 노드가 없으면 null이되므로 확인해야합니다.

나는 숙제를 위해 이것을하고 있지만이 특정 부분은 숙제의 일부가 아니며, 내가하고있는 일을 통과하는 데 도움이됩니다.

의견에 감사드립니다. 그러나 실제로 코드의 내용을 읽은 사람은 거의없는 것 같습니다. 작동하지 않는 것을 쉽게 알 수있었습니다.


1
컴파일 시간 오류입니다.
MayurB

답변:


201

int null이 있지만 반드시 Integer 깡통을 . null 정수를 개봉 할 때주의를 기울여야합니다. 많은 혼란과 헤드 스크래치가 발생할 수 있습니다!

예를 들면 다음과 같습니다.

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

당신에게 줄 것이다 NullPointerException오브젝트가 null없는에도 불구하고!

귀하의 질문에 후속 조치를 취하기 위해 값 이 없음 을 나타내 려면 조사하겠습니다.java.util.Optional<Integer>


2
Integer 클래스가 존재하는 데는 충분한 이유가 있으므로 필요가있을 때 사용하십시오.
축복받은

6
@ h2g2java : HashMap <Integer, Integer>와 같은 것들에 대해서는 폐기물 수준이 거대하고 비 압축이기 때문에 기본 컬렉션으로 사용할 수 있다는 것이 매력적이라고 ​​생각하지 않기를 바랍니다. 그래서 프리미티브 만 사용하는 Trove의 TIntIntHashMap은 비 압축 HashMap <Integer, Integer> 주위를 돌고 있습니다.
SyntaxT3rr0r

1
int는 null을 확인할 수 없지만 Java에서 null을 integer로 캐스팅하여 null을 안전하게 int에 할당 할 수 있습니다. 예를 들어 check (root) 메소드가 null을 반환 할 수 있으면 다음과 같은 방법으로 int에 안전하게 캐스팅 할 수 있습니다 이것 : int data = (Integer)check(node);
sactiw

@sactiw-정교하게 할 수 있습니까? 당신이 무엇을 받고 있는지 잘 모르겠습니다.
Brian Agnew

7
@BrianAgnew 내가 여기서 말한 것을 바로 잡아 보자, 나는 틀렸다. 기본적으로 int i = (Integer)null;NPE를 언 박싱 할 때 런타임에 NPE를 던질 것이라는 것을 알지 못했다 .
sactiw

40

아니요. 기본 요소가 아닌 객체 참조 만 null 일 수 있습니다.


3
OP가 null 값을 원할 경우 더 적합한 Integer 클래스를 언급 할 가치가 있습니다. 또는 음수 값을 사용하여 "찾을 수 없음"을 표시 할 수 있습니다.
Glen

31

알아내는 좋은 방법 :

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

컴파일을 시도하십시오.


37
실제로 .. OP는 이미 그의 질문에서 마지막 문구에 따라 자신 을 알아 냈습니다.
BalusC

9
거의 4 년 후에 후손들을 위해, 그 비트는 나중에 편집되었습니다.
Matt Luongo

3
그러나 .. Integer ii = null; int i = ii;런타임에 컴파일하지만 NullPointerException을 던질 것입니다
premek.v

13

Java에서 int는 기본 유형이며 객체로 간주되지 않습니다. 객체 만 null 값을 가질 수 있습니다. 따라서 귀하의 질문에 대한 대답은 아니오입니다. 그것은 null 일 수 없습니다. 그러나 가장 원시적 인 유형을 나타내는 객체가 있기 때문에 그렇게 간단하지 않습니다.

Integer 클래스는 int 값을 나타내지 만 널값을 보유 할 수 있습니다. check방법 에 따라 정수 또는 정수를 반환 할 수 있습니다.

이 동작은 루비와 같은 좀 더 순수한 객체 지향 언어와는 다릅니다. 여기서 int와 같은 "기본적인 것"도 객체로 간주됩니다.


8

위의 모든 대답과 함께이 점도 추가하고 싶습니다.

기본 유형의 경우 고정 메모리 크기가 있습니다. 즉 int의 경우 4 바이트가 있고 char의 경우 2 바이트가 있습니다. 메모리 크기가 고정되어 있지 않기 때문에 null은 객체에만 사용됩니다.

기본적으로 우리는

   int a=0;

그리고 아닙니다

   int a=null;

다른 기본 유형과 동일하므로 null은 기본 유형이 아닌 객체에만 사용됩니다.


5

코드는 컴파일되지 않습니다. Object다음 null과 같이 완전한 사람 만있을 수 있습니다 Integer. 다음은 null을 테스트 할 수있는 경우를 보여주는 기본 예입니다.

Integer data = check(Node root);

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

반면 check()에 return으로 선언 되면 결코int없으며null 전체 if-else블록이 불필요합니다.

int data = check(Node root);

// do something

autoboxing 문제는 check()return으로 선언 된 경우에도 적용되지 않습니다 int. 반환 된 경우 대신에 할당 할 때 Integer위험 NullPointerException할 수 있습니다 . 그것을 블록 으로 할당 하고 블록을 사용하는 것은 실제로 필수적이었습니다.intIntegerIntegerif-else

오토 박싱에 대한 자세한 내용은 이 Sun 안내서를 확인하십시오 .


1
불행히도 "check"가 Integer가 아닌 int를 반환하면 int (null이 아님)가 Integer에 자동으로 입력되므로 도움이되지 않습니다.
Paul Tomblin

2
D' oh, 이것은 null을 테스트 할 수있는 경우 를 보여주는 기본 예제 일뿐 입니다. 반면에 check가 return으로 선언 int되면 null이 될 수 없으며 if 블록이 불필요한 경우 전체가 될 수 없습니다.
BalusC

3

우리가 할 수있는 것처럼 int i선언하는 대신 선언 Integer i할 수 있습니다.i=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이 주석에서 언급했듯이 기본적 으로이 주위에 두 가지 방법이 있습니다.

  • "범위를 벗어난"값을 사용하십시오. 예를 들어, 정상적인 사용에서 "데이터"가 음수 일 수 없으면 음수 값을 반환하여 유효하지 않음을 나타냅니다.
  • 정수를 사용하십시오. "check"메소드가 정수를 리턴하는지 확인하고 int가 아닌 정수에 지정하십시오. "int"가 진행되면 자동 권투 및 언 박싱에 문제가 발생할 수 있습니다.

0

check () 메소드에서 널을 점검하고 -1과 같은 유효하지 않은 값을 리턴하거나 널인 경우 0을 리턴하십시오. 그런 다음 null을 전달하지 않고 해당 값을 확인합니다. 이것은 옛날 'C'에서하는 정상적인 일입니다.


0

Java가 int와 같은 정수를 저장하기위한 래퍼 클래스를 제공하기 때문에 int, boolean 또는 float 등과 같은 기본 데이터 유형은 null (측면)을 저장할 수 없습니다.

예 : 정수 i = null;


0

int가 null이 아닌 경우 초기화되지 않은 경우 0 일 수 있습니다. 정수를 null로 만들려면 int 대신 Integer를 사용해야합니다. 프리미티브에는 null 값이 없습니다. int의 기본값은 0입니다.

데이터 유형 / 기본값 (필드 용)

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

긴 ---------------- 0L

플로트 ---------------- 0.0f

이중 ------------- 0.0d

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

문자열 --------------- null

부울 ------------ 거짓


-2

목표를 달성하는 다른 방법을 요청하므로 래퍼 클래스를 사용하는 것이 좋습니다.

new Integer(null);

-17

나는 전문가는 아니지만 nullint에 해당 하는 것은이라고 생각합니다 0.

예를 들어,를 만들면 int[]다른 슬롯 0으로 null설정하지 않는 한 각 슬롯에 반대로 포함 됩니다 .

상황에 따라이 기능이 사용될 수 있습니다.


간단히 말해서 0은 null과 다릅니다.
Dave Goodchild
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.