Pode int
estar null
em 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.
Respostas:
int
não pode ser nulo, masInteger
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:
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 investigaria
java.util.Optional<Integer>
fonte
int data = (Integer)check(node);
int i = (Integer)null;
isso jogaria o NPE em tempo de execução enquanto o desempacotava.Não. Somente as referências a objetos podem ser nulas, não primitivas.
fonte
Uma ótima maneira de descobrir:
Tente compilar.
fonte
Integer ii = null; int i = ii;
irá compilar, mas lançará NullPointerException em tempo de execuçãoEm 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
check
mé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.
fonte
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,
e não
O mesmo com outros tipos primitivos e, portanto, null é usado apenas para objetos e não para tipos primitivos.
fonte
O código nem será compilado. Apenas um fullworthy
Object
pode sernull
, comoInteger
. Aqui está um exemplo básico para mostrar quando você pode testar nulos:Por outro lado, se
check()
for declarado retornarint
, nunca poderá sernull
e todo oif-else
bloco será supérfluo.Problemas de autoboxing não se aplicam aqui também quando
check()
é declarado para retornarint
. Se ele retornouInteger
, você pode arriscarNullPointerException
ao atribuí-lo a um emint
vez deInteger
. Atribuí-lo como umInteger
e usar oif-else
bloco teria sido realmente obrigatório.Para saber mais sobre autoboxing, verifique este guia Sun .
fonte
int
, ela nunca poderá ser nula e o conjunto se o bloco for supérfluo.em vez de declarar como
int i
declará-lo,Integer i
então podemos fazeri=null;
fonte
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
fonte
Não, mas int [] pode ser.
fonte
Como o @Glen mencionado em um comentário, você basicamente tem duas maneiras de contornar isso:
fonte
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'.
fonte
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;
fonte
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
fonte
Como você solicita outra maneira de atingir seu objetivo, sugiro que você use uma classe de wrapper:
fonte
Não sou especialista, mas acredito que o
null
equivalente 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.
fonte