ค่า NULL หรือ NULL ของสตริงถูกตัดสิน
ในระหว่างกระบวนการพัฒนาฉันมักจะพบกับการใช้งานผิดต่อไปนี้:
1. การใช้ข้อผิดพลาด 1:
if (name == "") {// ทำอะไร} 2. การใช้ข้อผิดพลาด 2:
if (name.equals ("")) {// ทำอะไร}
3. การใช้ข้อผิดพลาดสาม:
if (! name.equals ("")) {// ทำอะไร}
มาอธิบายกันเถอะ:
การใช้ข้อผิดพลาดข้างต้น 1 เป็นความผิดพลาดที่น่าจะเป็นไปได้มากที่สุดที่ผู้เริ่มต้นทำและมีโอกาสน้อยที่สุดที่จะค้นพบเพราะไวยากรณ์ของพวกเขาเองก็ใช้ได้และคอมไพเลอร์ Java ไม่ได้รายงานข้อผิดพลาดเมื่อรวบรวม อย่างไรก็ตามเงื่อนไขนี้อาจทำให้เกิดข้อผิดพลาดในโปรแกรมในช่วงเวลารันไทม์และจะไม่เป็นจริง กล่าวอีกนัยหนึ่งข้อความในบล็อก IF จะไม่ถูกดำเนินการ
การใช้งานที่กล่าวถึงข้างต้น 2 และการใช้งาน 3 นั้นถูกเขียนขึ้นรวมถึงข้อผิดพลาดที่สร้างรายละเอียด Java หลายอย่างด้วยเช่นกัน ทำไมมันผิด? บางทีคุณอาจจะงงงวย
ใช่งานเขียนของพวกเขาถูกต้อง แต่ไม่มีเงื่อนไขการตัดสินที่เป็นโมฆะ แค่คิดว่าจะเกิดอะไรขึ้นถ้าชื่อ = null? ผลที่ตามมาคือโปรแกรมของคุณจะทำการยกเว้น nullpointerexception ระบบจะถูกระงับและไม่ให้บริการปกติอีกต่อไป
แน่นอนถ้าคุณได้ตัดสินว่าเป็นโมฆะในชื่อก่อนหน้านี้ข้อยกเว้นคือ
วิธีที่ถูกต้องในการเขียนควรเพิ่มเงื่อนไขของชื่อก่อน! = null เช่น:
if (name! = null &&! name.equals ("")) {// ทำอะไร}หรือ
if (! "". เท่ากับ (ชื่อ)) {// เขียน "" ด้านหน้าของมันดังนั้นไม่ว่าชื่อจะเป็นโมฆะหรือไม่ก็จะไม่มีข้อผิดพลาด // ทำอะไร}
ที่นี่ขอตัวอย่างง่ายๆ:
testnullorempty.java
การทดสอบคลาสสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง args []) {ค่าสตริง = null; TestNullorEmpty (ค่า); ค่า = ""; TestNullorEmpty (ค่า); ค่า = ""; TestNullorEmpty (ค่า); ค่า = "สวัสดีฉัน"; TestNullorEmpty (ค่า); } โมฆะคงที่ testNullorEmpty (ค่าสตริง) {ถ้า (value == null) {system.out.println ("ค่าคือ null"); } อื่นถ้า ("" .Equals (value)) {system.out.println ("ค่าว่างเปล่า แต่ไม่เป็นโมฆะ"); } else {system.out.println ("ค่าคือ /" " + value +" /""); } if (value == "") {// การจัดจำหน่ายของ ng // อย่าใช้การเขียนนี้}}} รวบรวมการดำเนินการ:
c:/> javac testnullorempty.javac:/> java testnullorempty
ค่าคือ null.value ว่างเปล่า แต่ไม่ใช่ null.value คือ "" ค่าคือ "สวัสดีฉัน!"
เปรียบเทียบที่อยู่สตริงเท่ากัน
แพ็คเกจ com; คลาสสาธารณะ A { / ** * @param args * / โมฆะคงที่สาธารณะหลัก (สตริง [] args) {string a = "hello"; สตริง b = "เขา"; สตริง c = a.substring (0, 2); System.out.println (b.equals (c)); // true system.out.println (b == c); // สตริงเท็จ d = สตริงใหม่ ("สวัสดี"); System.out.println (d.equals (a)); // true system.out.println (d == a); // สตริงเท็จ e = new StringBuilder ("hello"). toString (); System.out.println (e.equals (a)); // true system.out.println (e == a); // false system.out.println (e.equals (d)); // true system.out.println (e == d); // สตริงเท็จ f = "hello"; System.out.println (f.equals (a)); // true system.out.println (f == a); // true system.out.println (f == "hello"); // true system.out.println (f == "นรก"+"o"); System.out.println (g == f); // สตริงเท็จ h = "เขา"+"llo"; System.out.println (h == f); // true}}สรุป:
1. สตริงจากใหม่คือการจัดสรรหน่วยความจำอีกครั้งสตริงจะไม่ถูกแชร์และไม่ได้แชร์ใหม่หลายรายการ
2. สตริงและตัวแปรสตริงสแตติกที่มีการเชื่อมต่อหรือสกัดกั้นไม่ได้แชร์ผ่านฟังก์ชั่นสตริง
3. มีสองสถานการณ์สำหรับสตริงที่ได้รับจากสัญญาณบวก
a "เขา"+"llo" เป็นสตริงคงที่ซึ่งแชร์
b สตริง a = "เขา"; A+"LLO" ไม่ใช่สตริงคงที่มันไม่ได้แชร์