Um int pode ser nulo em Java?

155

Pode intestar nullem Java?

Por exemplo:

int data = check(Node root);

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

Meu objetivo é escrever uma função que retorne um int. Disse inté armazenado na altura de um nó e, se o nó não estiver presente, será nulo, e precisarei verificar isso.

Estou fazendo isso como lição de casa, mas essa parte específica não faz parte da tarefa, apenas me ajuda a superar o que estou fazendo.

Obrigado pelos comentários, mas parece que poucas pessoas realmente leram o que está sob o código. Eu estava perguntando de que outra forma posso atingir esse objetivo. foi fácil descobrir que isso não funciona.

user220755
fonte
1
É erro de tempo de compilação.
MayurB

Respostas:

201

int não pode ser nulo, mas Integer pode . Você precisa ter cuidado ao desmarcar números inteiros nulos, pois isso pode causar muita confusão e arranhões na cabeça!

por exemplo:

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

lhe dará um NullPointerException, apesar do objeto não ser nulo!

Para acompanhar sua pergunta, se você quiser indicar a ausência de um valor, eu investigariajava.util.Optional<Integer>

Brian Agnew
fonte
2
Existem boas razões para a existência da classe Integer, portanto, use-a quando as necessidades forem convincentes.
Blessed Geek
6
@ h2g2java: Espero que você não esteja achando que poder usá-los com a coleção padrão seja atraente, porque para coisas como HashMap <Inteiro, Inteiro> o nível de desperdício é enorme e não é atraente. É por isso que o TIntIntHashMap do Trove, usando apenas primitivas, roda em torno do HashMap não atraente <Inteiro, Inteiro>.
SyntaxT3rr0r 12/02/10
1
int não pode ser verificado como nulo, no entanto, você pode atribuir nulo a int em Java convertendo-o para Inteiro, por exemplo, se o método check (root) puder retornar nulo, será possível convertê-lo com segurança em int, fazendo algo como Isso: int data = (Integer)check(node);
sactiw 11/11/12
@sactiw - Você pode elaborar? Eu não estou certo que eu entendo o que você está querendo chegar
Brian Agnew
7
@BrianAgnew Deixe-me corrigir o que eu disse aqui, eu estava completamente errado, eu basicamente não sabia que int i = (Integer)null;isso jogaria o NPE em tempo de execução enquanto o desempacotava.
sactiw
40

Não. Somente as referências a objetos podem ser nulas, não primitivas.

Ignacio Vazquez-Abrams
fonte
3
Vale mencionar a classe Integer, que seria mais adequada se o OP quisesse um valor nulo. Ou ele poderia usar um valor negativo para indicar "não encontrado"
Glen
31

Uma ótima maneira de descobrir:

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

Tente compilar.

Matt Luongo
fonte
37
Na verdade .. O OP já descobriu isso sozinho, de acordo com a última frase de sua pergunta: era fácil descobrir que não funciona.
BalusC
9
Para a posteridade, quase 4 anos depois - esse trecho estava em uma edição posterior.
precisa
3
mas .. Integer ii = null; int i = ii;irá compilar, mas lançará NullPointerException em tempo de execução
premek.v 25/02/16
13

Em Java, int é um tipo primitivo e não é considerado um objeto. Somente objetos podem ter um valor nulo. Portanto, a resposta para sua pergunta é não, não pode ser nula. Mas não é tão simples, porque existem objetos que representam os tipos mais primitivos.

A classe Inteiro representa um valor int, mas pode conter um valor nulo. Dependendo do seu checkmétodo, você pode retornar um int ou um inteiro.

Esse comportamento é diferente de algumas linguagens mais puramente orientadas a objetos, como Ruby, onde até coisas "primitivas", como ints, são consideradas objetos.

Jonathon Faust
fonte
8

Juntamente com todas as respostas acima, gostaria de acrescentar esse ponto também.

Para tipos primitivos, temos um tamanho fixo de memória, ou seja, para int, temos 4 bytes e char, 2 bytes. E null é usado apenas para objetos porque o tamanho da memória não é fixo.

Então, por padrão, temos,

   int a=0;

e não

   int a=null;

O mesmo com outros tipos primitivos e, portanto, null é usado apenas para objetos e não para tipos primitivos.

Shoaib Chikate
fonte
5

O código nem será compilado. Apenas um fullworthy Objectpode ser null, como Integer. Aqui está um exemplo básico para mostrar quando você pode testar nulos:

Integer data = check(Node root);

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

Por outro lado, se check()for declarado retornar int, nunca poderá ser nulle todo o if-elsebloco será supérfluo.

int data = check(Node root);

// do something

Problemas de autoboxing não se aplicam aqui também quando check()é declarado para retornar int. Se ele retornou Integer, você pode arriscar NullPointerExceptionao atribuí-lo a um em intvez de Integer. Atribuí-lo como um Integere usar o if-elsebloco teria sido realmente obrigatório.

Para saber mais sobre autoboxing, verifique este guia Sun .

BalusC
fonte
1
Infelizmente, se "check" retornar um int em vez de um inteiro, isso não ajudará, porque o int (que não será nulo) será automaticamente encaixotado no inteiro.
Paul Tomblin
2
Ah, isso foi apenas um exemplo básico para mostrar quando você pode testar nulos. Por outro lado, se a verificação for declarada como retornada int, ela nunca poderá ser nula e o conjunto se o bloco for supérfluo.
BalusC
3

em vez de declarar como int ideclará-lo, Integer ientão podemos fazeri=null;

Integer i;
i=null;
Minati
fonte
2

Objeto inteiro seria melhor. Se você precisar usar primitivas, poderá usar um valor que não existe no seu caso de uso. A altura negativa não existe para as pessoas, então

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

Não, mas int [] pode ser.

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
JMI MADISON
fonte
0

Como o @Glen mencionado em um comentário, você basicamente tem duas maneiras de contornar isso:

  • use um valor "fora do limite". Por exemplo, se "dados" nunca puderem ser negativos no uso normal, retorne um valor negativo para indicar que é inválido.
  • Use um número inteiro. Apenas certifique-se de que o método "check" retorne um número inteiro e atribua-o a um número inteiro e não a um int. Porque se um "int" se envolver ao longo do caminho, o boxe e o unboxing automáticos podem causar problemas.
Paul Tomblin
fonte
0

Verifique se há nulo no seu método check () e retorne um valor inválido, como -1 ou zero, se nulo. Em seguida, a verificação seria para esse valor, em vez de repassar o nulo. Isso seria uma coisa normal de se fazer nos velhos tempos 'C'.

user3550884
fonte
0

Qualquer tipo de dados primitivo como int, booleano ou float etc. não pode armazenar o nulo (lateral), pois o java forneceu a classe Wrapper para armazenar o mesmo como int para Integer, booleano para Boolean.

Por exemplo: Inteiro i = nulo;

Sachin Pete
fonte
0

Um int não é nulo, pode ser 0 se não for inicializado. Se você deseja que um número inteiro seja nulo, é necessário usar o número inteiro em vez de int. primitivas não têm valor nulo. o padrão para int é 0.

Tipo de dados / valor padrão (para campos)

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

longo ---------------- 0L

float ---------------- 0.0f

duplo ------------- 0.0d

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

String --------------- null

booleano ------------ false

Mohammad Fathi
fonte
-2

Como você solicita outra maneira de atingir seu objetivo, sugiro que você use uma classe de wrapper:

new Integer(null);
Sandy
fonte
-17

Não sou especialista, mas acredito que o nullequivalente a um int é0 .

Por exemplo, se você criar um int[], cada slot conterá 0, ao contrário denull , a menos que você o configure para outra coisa.

Em algumas situações, isso pode ser útil.

Lahn
fonte
Muito simplesmente, 0 não é o mesmo que nulo.
21819 Dave Goodchild