Czy można int
być null
w Javie?
Na przykład:
int data = check(Node root);
if ( data == null ) {
// do something
} else {
// do something
}
Moim celem jest napisanie funkcji, która zwraca plik int
. Wspomniane int
jest przechowywane na wysokości węzła, a jeśli węzła nie ma, będzie zerowe i będę musiał to sprawdzić.
Robię to jako zadanie domowe, ale ta konkretna część nie jest częścią pracy domowej, po prostu pomaga mi przejść przez to, co robię.
Dziękuję za komentarze, ale wydaje się, że bardzo niewiele osób faktycznie przeczytało, co jest pod kodem, pytałem, jak inaczej mogę osiągnąć ten cel; łatwo było się domyślić, że to nie działa.
Odpowiedzi:
int
nie może być zerowa, aleInteger
może . Musisz zachować ostrożność podczas rozpakowywania zerowych liczb całkowitych, ponieważ może to spowodować wiele zamieszania i drapania głowy!np. to:
da ci
NullPointerException
, mimo że obiekt nie jest pusty!Aby odpowiedzieć na twoje pytanie, jeśli chcesz wskazać brak wartości, zbadam to
java.util.Optional<Integer>
źródło
int data = (Integer)check(node);
int i = (Integer)null;
wyrzuci NPE w czasie wykonywania podczas rozpakowywania.Nie. Tylko odwołania do obiektów mogą mieć wartość null, a nie prymitywy.
źródło
Świetny sposób, aby się dowiedzieć:
Spróbuj skompilować.
źródło
Integer ii = null; int i = ii;
skompiluje się, ale wyrzuci wyjątek NullPointerException w czasie wykonywaniaW Javie int jest typem prymitywnym i nie jest uważany za obiekt. Tylko obiekty mogą mieć wartość null. Więc odpowiedź na twoje pytanie brzmi: nie, nie może być zerowa. Ale to nie jest takie proste, ponieważ istnieją obiekty, które reprezentują najbardziej prymitywne typy.
Klasa Integer reprezentuje wartość int, ale może zawierać wartość null. W zależności od
check
metody, możesz zwrócić int lub Integer.To zachowanie różni się od niektórych bardziej czysto obiektowych języków, takich jak Ruby, gdzie nawet „prymitywne” rzeczy, takie jak ints, są uważane za obiekty.
źródło
Wraz z powyższą odpowiedzią chciałbym dodać również ten punkt.
Dla typów pierwotnych mamy stałą wielkość pamięci, tj. Dla int mamy 4 bajty, a char mamy 2 bajty. Wartość null jest używana tylko dla obiektów, ponieważ rozmiar pamięci nie jest ustalony.
Więc domyślnie mamy
i nie
To samo dotyczy innych typów pierwotnych, dlatego wartość null jest używana tylko dla obiektów, a nie dla typów pierwotnych.
źródło
Kod nawet się nie skompiluje. Tylko pełnoprawny
Object
może byćnull
, na przykładInteger
. Oto podstawowy przykład pokazujący, kiedy można przetestować wartość null:Z drugiej strony, jeśli
check()
deklaruje się powrótint
, nigdy nie może tak byćnull
i całyif-else
blok jest wtedy zbędny.Problemy z autoboxingiem nie mają tutaj zastosowania również w przypadku
check()
deklaracji powrotuint
. Jeśli wróciłInteger
, możesz zaryzykowaćNullPointerException
przypisując go doint
zamiastInteger
. Przypisanie go jakoInteger
i użycieif-else
bloku byłoby wtedy rzeczywiście obowiązkowe.Aby dowiedzieć się więcej o autoboxing, sprawdź ten poradnik Sun .
źródło
int
, nigdy nie może być zerowa, a całość bloku if jest wtedy zbędna.zamiast deklarować jako
int i
zadeklaruj, jakInteger i
wtedy możemyi=null;
źródło
Najlepszy byłby obiekt całkowity. Jeśli musisz użyć prymitywów, możesz użyć wartości, która nie istnieje w twoim przypadku użycia. Wzrost ujemny nie istnieje dla ludzi, więc
źródło
Nie, ale int [] może być.
źródło
Jak @Glen wspomniał w komentarzu, zasadniczo można to obejść na dwa sposoby:
źródło
Sprawdź, czy w metodzie check () występuje wartość null i zwróć nieprawidłową wartość, taką jak -1 lub zero, jeśli null. Wtedy sprawdzanie dotyczyłoby tej wartości, a nie przekazywania wartości null. To byłoby normalne w dawnych czasach „C”.
źródło
Żaden typ danych Primitive, taki jak int, boolean, float itp., Nie może przechowywać wartości null (lateral), ponieważ java dostarczyła klasę Wrapper do przechowywania tego samego, co int w Integer, boolean na Boolean.
Np .: Integer i = null;
źródło
Int nie jest null, może mieć wartość 0, jeśli nie zostanie zainicjowany. Jeśli chcesz, aby liczba całkowita była null, musisz użyć Integer zamiast int. prymitywy nie mają wartości null. domyślna wartość ma dla int to 0.
Typ danych / Wartość domyślna (dla pól)
int ------------------ 0
długi ---------------- 0L
float ---------------- 0.0f
podwójne ------------- 0,0d
znak --------------- '\ u0000'
Ciąg --------------- null
boolean ------------ false
źródło
Ponieważ prosisz o inny sposób osiągnięcia swojego celu, sugeruję użycie klasy opakowującej:
źródło
Nie jestem ekspertem, ale wierzę, że
null
odpowiednikiem int jest0
.Na przykład, jeśli utworzysz
int[]
, każdy slot zawiera0
w przeciwieństwie donull
, chyba że ustawisz go na coś innego.W niektórych sytuacjach może to być przydatne.
źródło