int สามารถเป็นโมฆะใน Java?


155

สามารถintอยู่nullใน Java หรือไม่?

ตัวอย่างเช่น:

int data = check(Node root);

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

intเป้าหมายของฉันคือการเขียนฟังก์ชั่นซึ่งจะส่งกลับอีกด้วย กล่าวว่าintถูกเก็บไว้ในระดับความสูงของโหนดและหากโหนดไม่ปรากฏจะเป็นโมฆะและฉันจะต้องตรวจสอบว่า

ฉันกำลังทำสิ่งนี้เพื่อการบ้าน แต่ส่วนเฉพาะนี้ไม่ได้เป็นส่วนหนึ่งของการบ้านมันช่วยให้ฉันผ่านสิ่งที่ฉันกำลังทำอยู่

ขอบคุณสำหรับความคิดเห็น แต่ดูเหมือนว่ามีคนเพียงไม่กี่คนที่อ่านสิ่งที่อยู่ใต้รหัสฉันถามว่าฉันจะบรรลุเป้าหมายนี้ได้อย่างไร มันง่ายที่จะเข้าใจว่ามันไม่ทำงาน


1
มันเป็นข้อผิดพลาดในการรวบรวมเวลา
MayurB

คำตอบ:


201

int ไม่สามารถเป็นโมฆะ แต่สามารถInteger คุณต้องระวังเมื่อทำการ unboxing null Integers เนื่องจากอาจทำให้เกิดความสับสนและการเกาได้!

เช่นนี้

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

จะให้คุณNullPointerExceptionแม้วัตถุจะไม่ว่าง!

หากต้องการติดตามคำถามของคุณหากคุณต้องการระบุว่าไม่มีค่าฉันจะตรวจสอบjava.util.Optional<Integer>


2
มีเหตุผลที่ดีสำหรับการมีอยู่ของคลาส Integer ดังนั้นใช้เมื่อจำเป็นต้องมีการบังคับ
พร Geek

6
@ h2g2java: ฉันหวังว่าคุณจะไม่คิดว่าการใช้พวกมันกับคอลเลกชั่นเริ่มต้นนั้นน่าสนใจเพราะสำหรับสิ่งต่างๆเช่น HashMap <Integer, Integer> ระดับของเสียมีขนาดใหญ่และไม่น่าดึงดูด นี่คือเหตุผลที่ TIntIntHashMap ของ Trove ใช้เฉพาะข้อมูลพื้นฐานวิ่งรอบ HashMap <Integer, Integer> ที่ไม่น่าดึงดูด
SyntaxT3rr0r

1
int ไม่สามารถตรวจสอบค่า null ได้ แต่คุณสามารถกำหนดค่า null ให้เป็น int ใน Java ได้โดยการส่งไปยัง Integer ตัวอย่างเช่นถ้าวิธีการตรวจสอบ (root) สามารถส่งคืนค่า null ได้คุณสามารถส่งค่าเป็น int ได้อย่างปลอดภัย สิ่งนี้: int data = (Integer)check(node);
sactiw

@sactiw - คุณสามารถทำอย่างละเอียด? ฉันไม่แน่ใจว่าฉันเข้าใจสิ่งที่คุณได้รับ
Brian Agnew

7
@BrianAgnew ให้ฉันแก้ไขสิ่งที่ฉันพูดที่นี่ฉันผิดธรรมดาโดยทั่วไปฉันไม่ได้ตระหนักว่าint i = (Integer)null;จะโยน NPE ในเวลาทำงานขณะที่แกะกล่อง
sactiw

40

ไม่เฉพาะการอ้างอิงวัตถุเท่านั้นที่สามารถเป็นค่าว่างได้ไม่ใช่แบบดั้งเดิม


3
มันคุ้มค่าที่จะกล่าวถึงคลาส Integer ซึ่งจะเหมาะกว่าหาก OP ต้องการค่า Null หรือเขาสามารถใช้ค่าลบเพื่อระบุ "ไม่พบ"
เกลน

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 ดังนั้นคำตอบสำหรับคำถามของคุณคือไม่มันไม่ควรว่างเปล่า แต่มันไม่ง่ายอย่างนั้นเพราะมีวัตถุที่เป็นตัวแทนประเภทดั้งเดิมที่สุด

class Integer แสดงถึงค่า int แต่มันสามารถเก็บค่า null ขึ้นอยู่กับคุณcheckวิธีการคุณคุณอาจคืนค่า int หรือจำนวนเต็ม

พฤติกรรมนี้แตกต่างจากภาษาเชิงวัตถุอื่น ๆ เช่น Ruby ซึ่งแม้แต่สิ่ง "ดั้งเดิม" อย่าง ints ก็ถือเป็นวัตถุ


8

พร้อมด้วยคำตอบทั้งหมดข้างต้นฉันต้องการเพิ่มจุดนี้ด้วย

สำหรับประเภทพื้นฐานเรามีขนาดหน่วยความจำคงที่เช่นสำหรับ int เรามี 4 ไบต์และถ่านเรามี 2 ไบต์ และ null ใช้สำหรับวัตถุเท่านั้นเนื่องจากขนาดหน่วยความจำไม่คงที่

ดังนั้นโดยปกติแล้วเรามี

   int a=0;

และไม่

   int a=null;

เช่นเดียวกับประเภทดั้งเดิมอื่น ๆ และด้วยเหตุนี้ null จะใช้เฉพาะกับวัตถุและไม่ได้สำหรับประเภทดั้งเดิม


5

รหัสจะไม่ได้รวบรวม มีเพียงคนที่สมควรObjectได้รับnullเช่นIntegerกัน นี่เป็นตัวอย่างพื้นฐานที่จะแสดงเมื่อคุณสามารถทดสอบว่างได้

Integer data = check(Node root);

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

ในทางกลับกันหากcheck()มีการประกาศว่าจะส่งคืนintจะไม่มีทางเป็นไปได้nullและif-elseบล็อกทั้งหมดนั้นไม่จำเป็น

int data = check(Node root);

// do something

Autoboxing ปัญหาใช้ไม่ได้ที่นี่เช่นกันเมื่อมีการประกาศการกลับมาcheck() intถ้ามันกลับมาIntegerแล้วคุณอาจมีความเสี่ยงNullPointerExceptionเมื่อกำหนดไปยังแทนint Integerกำหนดให้เป็นIntegerและใช้if-elseบล็อกจะเป็นสิ่งที่จำเป็นจริงๆ

ต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ autoboxing ตรวจสอบคู่มืออาทิตย์


1
น่าเสียดายถ้า "ตรวจสอบ" คืนค่า int แทนที่จะเป็นจำนวนเต็มสิ่งนี้จะไม่ช่วยได้เนื่องจาก int (ซึ่งจะไม่เป็นโมฆะ) จะถูกบรรจุลงใน Integer โดยอัตโนมัติ
Paul Tomblin

2
D'oh นั่นเป็นเพียงตัวอย่างพื้นฐานที่จะแสดงเมื่อคุณสามารถทดสอบว่างได้ ในทางกลับกันถ้าการตรวจสอบถูกประกาศให้ส่งคืนintมันจะไม่มีวันเป็นโมฆะและการบล็อกทั้งหมดนั้นเกินความจำเป็น
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 พูดถึงในความคิดเห็นคุณมีสองวิธีในการแก้ไข:

  • ใช้ค่า "นอกขอบเขต" ตัวอย่างเช่นหาก "data" ไม่สามารถลบได้ในการใช้งานปกติให้คืนค่าลบเพื่อระบุว่าไม่ถูกต้อง
  • ใช้จำนวนเต็ม เพียงตรวจสอบให้แน่ใจว่าเมธอด "check" ส่งคืน Integer และคุณกำหนดให้ Integer ไม่ใช่ int เพราะหากผู้เล่น "int" เข้ามาเกี่ยวข้องการชกมวยอัตโนมัติและการ unbox อาจทำให้เกิดปัญหาได้

0

ตรวจสอบโมฆะในวิธีการตรวจสอบ () ของคุณและส่งคืนค่าที่ไม่ถูกต้องเช่น -1 หรือศูนย์หากเป็นโมฆะ จากนั้นเช็คจะเป็นค่านั้นแทนที่จะส่งค่าว่าง นี่เป็นสิ่งปกติที่ต้องทำในสมัยก่อน 'C'


0

ชนิดข้อมูลดั้งเดิมใด ๆ เช่น int, บูลีนหรือลอย ฯลฯ ไม่สามารถเก็บโมฆะ (ด้านข้าง) เนื่องจาก java ได้จัดให้มีคลาส Wrapper สำหรับการจัดเก็บเหมือน int เพื่อ Integer บูลีนบูลีน

เช่น: Integer i = null;


0

int ไม่เป็นโมฆะมันอาจเป็น 0 หากไม่ได้เริ่มต้น ถ้าคุณต้องการให้จำนวนเต็มเป็นโมฆะคุณต้องใช้จำนวนเต็มแทนที่จะเป็น int primitives ไม่มีค่า null default มีสำหรับ int คือ 0

ชนิดข้อมูล / ค่าเริ่มต้น (สำหรับเขตข้อมูล)

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

ยาว ---------------- 0L

ลอย ---------------- 0.0f

------------- 0.0d

ถ่าน --------------- '\ u0000'

สตริง --------------- null

บูลีน ------------ false


-2

เมื่อคุณขอวิธีอื่นเพื่อให้บรรลุเป้าหมายของคุณฉันขอแนะนำให้คุณใช้คลาส wrapper:

new Integer(null);

-17

ฉันไม่มีความเชี่ยวชาญ แต่ฉันไม่เชื่อว่าnullเทียบเท่าสำหรับ int 0คือ

ตัวอย่างเช่นถ้าคุณทำint[]แต่ละช่องมี0เมื่อเทียบกับnullเว้นแต่คุณจะตั้งค่าให้เป็นอย่างอื่น

ในบางสถานการณ์อาจมีการใช้งาน


ง่ายมาก 0 ไม่เหมือนกับ null
Dave Goodchild
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.