ฉันใช้ตัวอย่างข้อมูลเหล่านี้เพื่อค้นหาnull
ค่านิยมและสตริงว่าง ๆ
ฉันใช้ "การทดสอบการโต้แย้ง" - เทมเพลตเป็นรหัสแรกในวิธีการของฉันเพื่อตรวจสอบข้อโต้แย้งที่ได้รับ
testNullArgument
if (${varName} == null) {
throw new NullPointerException(
"Illegal argument. The argument cannot be null: ${varName}");
}
คุณอาจต้องการเปลี่ยนข้อความแสดงข้อยกเว้นให้เหมาะสมกับมาตรฐานของ บริษัท หรือโครงการของคุณ อย่างไรก็ตามฉันขอแนะนำให้มีข้อความที่มีชื่อของอาร์กิวเมนต์ที่ละเมิด มิฉะนั้นผู้เรียกวิธีการของคุณจะต้องดูในรหัสเพื่อทำความเข้าใจกับสิ่งที่ผิดพลาด (A ที่NullPointerException
ไม่มีข้อความจะสร้างข้อยกเว้นด้วยข้อความ "Null" ที่ค่อนข้างไร้สาระ)
testNullOrEmptyStringArgument
if (${varName} == null) {
throw new NullPointerException(
"Illegal argument. The argument cannot be null: ${varName}");
}
${varName} = ${varName}.trim();
if (${varName}.isEmpty()) {
throw new IllegalArgumentException(
"Illegal argument. The argument cannot be an empty string: ${varName}");
}
นอกจากนี้คุณยังสามารถใช้เทมเพลตการตรวจสอบว่างจากด้านบนและใช้ตัวอย่างข้อมูลนี้เพื่อตรวจสอบสตริงว่างเท่านั้น จากนั้นคุณจะใช้สองแม่แบบเหล่านี้เพื่อสร้างรหัสข้างต้น
อย่างไรก็ตามเทมเพลตดังกล่าวข้างต้นมีปัญหาว่าหากการโต้แย้งเป็นที่สิ้นสุดคุณจะต้องแก้ไขรหัสที่ผลิตบางส่วน ( ${varName} = ${varName}.trim()
จะจะล้มเหลว)
หากคุณใช้อาร์กิวเมนต์สุดท้ายจำนวนมากและต้องการตรวจสอบสตริงที่ว่างเปล่า แต่ไม่จำเป็นต้องตัดมันเป็นส่วนหนึ่งของรหัสของคุณคุณสามารถใช้สิ่งนี้แทน:
if (${varName} == null) {
throw new NullPointerException(
"Illegal argument. The argument cannot be null: ${varName}");
}
if (${varName}.trim().isEmpty()) {
throw new IllegalArgumentException(
"Illegal argument. The argument cannot be an empty string: ${varName}");
}
testNullFieldState
ฉันยังสร้างตัวอย่างบางส่วนสำหรับการตรวจสอบตัวแปรที่ไม่ได้ส่งเป็นอาร์กิวเมนต์ (ความแตกต่างใหญ่คือประเภทข้อยกเว้นตอนนี้เป็นแบบIllegalStateException
แทน)
if (${varName} == null) {
throw new IllegalStateException(
"Illegal state. The variable or class field cannot be null: ${varName}");
}
testNullOrEmptyStringFieldState
if (${varName} == null) {
throw new IllegalStateException(
"Illegal state. The variable or class field cannot be null: ${varName}");
}
${varName} = ${varName}.trim();
if (${varName}.isEmpty()) {
throw new IllegalStateException(
"Illegal state. The variable or class field " +
"cannot be an empty string: ${varName}");
}
testArgument
นี่คือเทมเพลตทั่วไปสำหรับการทดสอบตัวแปร ฉันใช้เวลาสองสามปีในการเรียนรู้ที่จะชื่นชมสิ่งนี้จริง ๆ ตอนนี้ฉันใช้มันมาก (เมื่อใช้ร่วมกับเทมเพลตข้างต้นแน่นอน!)
if (!(${varName} ${testExpression})) {
throw new IllegalArgumentException(
"Illegal argument. The argument ${varName} (" + ${varName} + ") " +
"did not pass the test: ${varName} ${testExpression}");
}
คุณป้อนชื่อตัวแปรหรือเงื่อนไขที่ส่งคืนค่าตามด้วยตัวถูกดำเนินการ ("==", "<", ">" ฯลฯ ) และค่าหรือตัวแปรอื่นและหากการทดสอบล้มเหลวรหัสผลลัพธ์จะส่ง IllegalArgumentException
เหตุผลสำหรับความซับซ้อนเล็กน้อยหากข้อด้วยการแสดงออกทั้งหมดห่อใน "! ()" คือการทำให้มันเป็นไปได้ที่จะนำมาใช้ใหม่สภาพการทดสอบในข้อความข้อยกเว้น
บางทีมันอาจจะทำให้เพื่อนร่วมงานสับสน แต่ถ้าพวกเขาต้องดูรหัสที่พวกเขาอาจไม่ต้องทำถ้าคุณโยนข้อยกเว้นประเภทนี้ ...
นี่คือตัวอย่างของอาร์เรย์:
public void copy(String[] from, String[] to) {
if (!(from.length == to.length)) {
throw new IllegalArgumentException(
"Illegal argument. The argument from.length (" +
from.length + ") " +
"did not pass the test: from.length == to.length");
}
}
คุณได้รับผลลัพธ์นี้โดยเรียกใช้เทมเพลตโดยพิมพ์ "from.length" [TAB] "== to.length"
ผลลัพธ์นั้นสนุกกว่า "ArrayIndexOutOfBoundsException" หรือคล้ายกันและอาจทำให้ผู้ใช้ของคุณมีโอกาสที่จะเข้าใจปัญหา
สนุก!