findViewById() อาจสร้าง NullPointerException

ฉันมีสายเหล่านี้หลายสาย:

(ListView) getView().findViewById(R.id.main_list_view);
(TextView) getView().findViewById(R.id.items_no);
....

และ AndroidStudio บอกฉันว่าพวกเขาอาจมี NullPointerException:

การเรียกใช้เมธอด getView().findViewById(R.id.main_list_view) อาจทำให้ java.lang.NullPointerException น้อยลง... (Ctrl+F1)

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

ตัวแปร พารามิเตอร์วิธีการ และค่าที่ส่งคืนที่ทำเครื่องหมายเป็น @Nullable หรือ @NotNull จะถือเป็นโมฆะ (หรือไม่เป็นโมฆะ ตามลำดับ) และใช้ในระหว่างการวิเคราะห์เพื่อตรวจสอบสัญญาที่เป็นโมฆะ เช่น รายงานข้อผิดพลาดที่เป็นไปได้ NullPointerException

สัญญาที่ซับซ้อนมากขึ้นสามารถกำหนดได้โดยใช้คำอธิบายประกอบ @Contract ตัวอย่างเช่น:

@Contract("_, null -> null") — วิธีการคืนค่า null หากอาร์กิวเมนต์ที่สองเป็น null @Contract("_, null -> null; _, !null -> !null") — วิธีการส่งคืน null หากอาร์กิวเมนต์ที่สองเป็น null และไม่เป็น null มิฉะนั้น

@Contract("true -> fail") — วิธีการ assertFalse ทั่วไปซึ่งจะส่งข้อยกเว้นหากส่งผ่านเป็น true

การตรวจสอบสามารถกำหนดค่าให้ใช้คำอธิบายประกอบ @Nullable @NotNull ที่กำหนดเองได้ (โดยค่าเริ่มต้นจะใช้คำอธิบายประกอบจาก annotations.jar)

โชคดีที่ทุกอย่างใช้งานได้ แต่มีการปรับปรุงโค้ดนี้ที่ฉันสามารถทำได้หรือไม่


person Phate01    schedule 12.11.2015    source แหล่งที่มา
comment
คุณต้องการเขียนโค้ดที่ไม่สามารถผ่าน NPE ได้หรือไม่?   -  person takendarkk    schedule 12.11.2015
comment
คุณใช้รูปแบบ ViewHolder หรือไม่?   -  person SKT    schedule 12.11.2015
comment
@takendarkk ไม่ แต่ฉันต้องการที่จะเข้าใจว่าทำไมฉันถึงบอกฉันว่ามันสามารถเกิดขึ้นได้   -  person Phate01    schedule 12.11.2015
comment
เพราะจะเกิดอะไรขึ้นถ้าคุณให้ ID วิธีการที่ไม่มีอยู่? มันคืนค่าเป็นโมฆะ ไม่มีอะไรผิดปกติเลย   -  person takendarkk    schedule 12.11.2015
comment
ฉันเข้าใจแล้ว แต่โค้ดนี้ที่ฉันสามารถทำได้มีการปรับปรุงหรือไม่   -  person Phate01    schedule 12.11.2015
comment
ไม่อยู่ที่นี่. เป็น. ไม่มีอะไร. ผิด.   -  person takendarkk    schedule 12.11.2015


คำตอบ (3)


นี่เป็นปัญหาที่ทราบแล้วใน android.support.v7.app.AppCompatActivity และได้รับการแก้ไขแล้วในเวอร์ชัน 24

https://code.google.com/p/android/issues/detail?id=203345

คุณจะไม่มีปัญหาใด ๆ กับ android.support.v4.app.FragmentActivity หรือ android.app.Activity

person Gayan Weerakutti    schedule 07.09.2016

คุณควรเพิกเฉยปัญหา

ตามที่ @ DanDar3 เขียน -> getView() สามารถคืนค่า null และ AndroidStudio ไฮไลท์นั้นได้

แต่ถ้าคุณต้องการทำให้ AndroidStudio มีความสุขจริงๆ - แน่นอนว่าคุณสามารถ...:
เพียงยืนยันว่ามุมมองไม่เป็นโมฆะ:

View view = getView();
assert view != null;
(ListView) view.findViewById(R.id.main_list_view);
(TextView) view.findViewById(R.id.items_no);
person Witold Kaczurba    schedule 23.09.2017

นั่นเป็นสาเหตุที่ getView() อาจส่งคืนค่าว่างและมีคำอธิบายประกอบเป็น @Nullable ตรวจสอบแหล่งที่มาและการเรียก JavaDoc - CTRL+คลิกที่ getView() ในโค้ดของคุณ

/**
 * Get the root view for the fragment's layout (the one returned by {@link #onCreateView}),
 * if provided.
 * 
 * @return The fragment's root view, or null if it has no layout.
 */
@Nullable
public View getView() {
    return mView;
}

คุณสามารถรวมโค้ดของคุณเองและตรวจสอบค่าว่างเพื่อให้คำเตือนหายไป หรือวางเคอร์เซอร์ไว้ที่ใดก็ได้ภายในการโทร findViewById() รอสองสามวินาทีเพื่อให้หลอดไฟปรากฏขึ้น (หรือกด Alt+Enter) จากนั้นเลือกหนึ่งรายการ ของแนวทางแก้ไขที่แนะนำ

person Dan Dar3    schedule 03.02.2016