رسالة خطأ فحص فارغة على أنها "خالية" أو "كان فارغًا"

StackOverflow https://stackoverflow.com/questions/3022319

سؤال

عند إجراء عمليات فحص فارغة في رمز Java ، وأنت ترمي غير شرعي للقيم الفارغة ، ما نوع قالب الرسائل الذي تستخدمه؟

نميل إلى استخدام شيء مثل هذا

public User getUser(String username){
   if (username == null){
     throw new IllegalArgumentException("username is null");   
   }
   // ...
}

ما هو أفضل: "هل فارغ" أو "كان فارغا" ، ولماذا؟

بالنسبة لي "هو لاغ" يشعر أكثر طبيعية.

هل كانت مفيدة؟

المحلول

منذ Exception يتم إلقاؤه بسبب فحص شرط مسبق فاشل ، وأعتقد بدلاً من مجرد ذكر حقيقة ، يجب أن تذكر المتطلبات تم انتهاك ذلك.

هذا هو بدلاً من القول "username is null", ، قل "username should not be null".


على استخدام المكتبات لفحوصات الشروط المسبقة

كنصيحة ، يمكنك استخدام إحدى المكتبات العديدة المصممة لتسهيل عمليات الفحص المسبقة. العديد من التعليمات البرمجية في جوافة تستخدم com.google.common.base.Preconditions

الطرق الثابتة البسيطة التي يجب استدعاؤها في بداية أساليبك الخاصة للتحقق من الحجج والحالة الصحيحة. هذا يسمح بإنشاءات مثل

 if (count <= 0) {
   throw new IllegalArgumentException("must be positive: " + count);
 }

ليتم استبدالها بأكثر إحكاما

 checkArgument(count > 0, "must be positive: %s", count);

أكثر صلة مباشرة هنا هو أن لديها checkNotNull, ، مما يسمح لك بالكتابة ببساطة:

  checkNotNull(username, "username should not be null");

لاحظ كيف يقرأ الرمز أعلاه بشكل طبيعي ، مع الرسالة التفصيلية تشير صراحة إلى المتطلبات تم انتهاك ذلك.

بديل ذكر الحقائق أكثر حرجًا:

 // Awkward!
 checkArgument(count > 0, "is negative or zero: %s", count);
 checkNotNull(username, "username is null");

علاوة على ذلك ، من المحتمل أيضًا أن يكون هذا أقل فائدة ، لأن العميل قد يكون على دراية بالحقيقة بالفعل ، والاستثناء لا يساعدهم على معرفة ما هو الفعلي المتطلبات نكون.


على IllegalArgumentException ضد NullPointerException

بينما يرمي الرمز الأصلي الخاص بك IllegalArgumentException على null الحجج ، الجوافة Preconditions.checkNotNull رميات NullPointerException في حين أن.

هذا وفقًا للمبدأ التوجيهي الذي حددته واجهة برمجة التطبيقات:

NullPointerException: يجب أن ترمي الطلبات مثيلات هذه الفئة للإشارة إلى استخدامات غير قانونية أخرى null هدف.

بالإضافة إلى ذلك ، إليك اقتباس من الإصدار 2nd الفعال Java: البند 60: تفضل استخدام الاستثناءات القياسية:

يمكن القول ، أن جميع دعوات الطريقة الخاطئة تتلخص في حجة غير قانونية أو حالة غير قانونية ، ولكن يتم استخدام استثناءات أخرى بشكل قياسي ل أنواع معينة الحجج والدول غير القانونية. إذا مر المتصل null في بعض المعلمات التي تحظر عليها القيم الفارغة ، تملي الاتفاقية ذلك NullPointerException يتم إلقاؤها بدلاً من IllegalArgumentException.

نصائح أخرى

باطل, ، لأن الحجة لا تزال لاغية ..

ومع ذلك ، لماذا لا ترمي ببساطة nullpointerxception بدون رسالة؟

أود أن أقترح قول

  if (userName == null) {
     throw new IllegalArgumentException("username == null");
   }

لأن هذا أمر قاتل لدرجة أن المبرمج يجب أن ينظر إليه على أي حال. الإشارة إلى مقتطف الرمز المخالف في رسالة الاستثناء هو أرقى شيء يمكنني تخيله.

سأميل إلى كتابة هذا:

public User getUser(String username) {
   if (username.length() == 0) {
       throw new IllegalArgumentException("username is empty");   
   }
   // ...
}

هذا يقتل عصفورين بحجر واحد. أولاً ، يكتشف الحالة التي يكون فيها اسم المستخدم عبارة عن سلسلة فارغة ، (من أجل الوسيطة) أفترض أنها خطأ. ثانياً ، إذا كانت المعلمة null محاولة إرسال length ستعطي المكالمة NullPointerException.

للسجل ، مُتوقع استثناء لرميه للاختراق null هو NullPointerException. إذا كان السبب الرئيسي لعدم استخدامه هو أن NPE عادة لا يوجد لديه رسالة ، فسترمز مثل هذا:

public User getUser(String username){
   if (username == null){
       throw new NullPointerException("username is null");   
   }
   if (username.length() == 0) {
       throw new IllegalArgumentException("username is empty");   
   }
   // ...
}

لماذا تستخدم NPE هنا؟ لأن NPE يشير دائمًا إلى ملف نوع مختلف من المشاكل إلى أنواع أخرى من خطأ التحقق من صحة الحجة ؛ على سبيل المثال ، حقل أو خلية صفيف لم يتم تهيئتها أو قيمة "اختيارية" لا يتم التعامل معها بشكل صحيح.

أخيرًا إلى السؤال:

ما هو أفضل: "is null" أو "was null", ، و لماذا؟

هذه مسألة رأي ، لكنني أكتب "is null".

  • لأن الرسالة هي الإبلاغ عن الحالة عندما تم طرح الاستثناء.
  • لأنه من المفيد القيام بذلك بهذه الطريقة.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top