سؤال

أنا من .صافي الخلفية و الآن تجريب في جافا.

حاليا أواجه مشاكل كبيرة في تصميم API دفاعيا ضد خاطئة الإدخال.دعونا نقول لدي البرمجية التالية (قريبة بما فيه الكفاية):

public void setTokens(Node node, int newTokens) {
    tokens.put(node, newTokens);
}

بيد أن هذا القانون يمكن أن تفشل لسببين:

  1. المستخدم يمر null عقدة.
  2. يمر المستخدم غير صالح العقدة ، أيواحد ليس الواردة في الرسم البياني.

في .صافي, وأود أن رمي ArgumentNullException (بدلا من NullReferenceException!) أو ArgumentException على التوالي ، ويمر اسم المخالف حجة (node) كما string الحجة.

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

هل هذا أفضل الممارسات ؟ أم أن هناك الأغراض العامة فصول مماثلة ArgumentException في .الشبكة ؟

هل من المنطقي أن تحقق ضد null في هذه الحالة ؟ كود سوف تفشل على كل حال و الاستثناء هو تتبع المكدس سوف تحتوي على فوق استدعاء الأسلوب.فحص ضد null يبدو الزائدة و المفرطة.منح تتبع المكدس سوف يكون قليلا نظافة (منذ هدفه هو الأسلوب أعلاه ، بدلا من الداخلية تحقق في HashMap تنفيذ JRE).ولكن هذا يجب أن يكون مقابل تكلفة إضافية if بيان ذلك أن أبدا تحدث على أي حال – بعد كل شيء ، ويمر null إلى الأسلوب أعلاه ليس من المتوقع الوضع انه غبي بدلا علة.أتوقع هو اكيد بجنون العظمة – وسوف تفشل مع نفس الاستثناء حتى لو لم تحقق ذلك.

[كما ذكر في التعليقات ، HashMap.put في الواقع يسمح null القيم الرئيسية.حتى تحقق ضد null ليس بالضرورة أن تكون زائدة هنا]

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

المحلول

المجموعات المختلفة معايير مختلفة.

أولا أفترض أنك تعرف الفرق بين RuntimeExceptions (لحالها) و العادي Exceptions (فحص), إذا لم يكن ثم انظر هذا السؤال والأجوبة.إذا كنت أكتب الخاصة بك استثناء تستطيع قوة أن تكون اشتعلت في حين كل NullPointerException و IllegalArgumentException هي RuntimeExceptions الذي عبس في بعض الدوائر.

ثانيا: كما كنت مع مجموعات عملت معهم ولكن لا تستخدم بنشاط يؤكد ، ولكن إذا كان الفريق الخاص بك (أو المستهلك من API) قد قررت أنها سوف تستخدم يؤكد تأكيد يبدو على وجه التحديد الآلية الصحيحة.

إذا كنت أنت وأود أن استخدام NullPointerException.والسبب في ذلك هو سابقة.نأخذ مثالا جافا API من الشمس ، على سبيل المثال java.util.TreeSet.هذا يستخدم هـ بالضبط هذا النوع من الوضع ، في حين أنها لا تبدو التعليمة البرمجية الخاصة بك تستخدم فقط null, فمن المناسب تماما.

كما قال آخرون IllegalArgumentException هو الخيار ، ولكن أعتقد NullPointerException هو أكثر التواصلية.

إذا كان هذا API تم تصميمه ليتم استخدامها من قبل شركات خارجية/فرق أود أن العصا مع NullPointerException, ولكن تأكد من أنها أعلنت في جافادوك.إذا كان هذا هو للاستخدام الداخلي ثم قد تقرر أن إضافة الخاصة بك استثناء heirarchy هو جدير بالاهتمام, ولكن شخصيا أجد أن واجهات برمجة التطبيقات التي تضيف ضخمة استثناء heirarchies ، والتي هي فقط ستكون printStackTrace()د أو تسجيل فقط مضيعة للجهد.

في نهاية اليوم الشيء الرئيسي هو أن الكود الخاص بك يتصل بوضوح.المحلية استثناء heirarchy مثل المحلية المصطلحات - يضيف معلومات المطلعين ولكن يمكن أن يربك الغرباء.

وفيما يتعلق فحص ضد null أنا أزعم أنه لا معنى له.أولا, انها تسمح لك لإضافة رسالة حول ما كان باطلا (أي عقدة أو الرموز) عند بناء الاستثناء التي من شأنها أن تكون مفيدة.ثانيا, في المستقبل قد استخدم Map التنفيذ والذي يسمح null, ثم يمكنك أن تفقد خطأ الاختيار.تكلفة هو لا شيء تقريبا إلا إذا التعريف يقول هو داخلي حلقة مشكلة لا تقلق بشأن ذلك.

نصائح أخرى

جافا القياسية استثناء IllegalArgumentException.بعض سوف رمي NullPointerException إذا كانت الحجة هي null, ولكن بالنسبة لي NPE له أن "شخص ثمل" دلالة وأنت لا تريد عملاء API الخاص بك إلى التفكير كنت لا تعرف ما تفعلونه.

على واجهات برمجة التطبيقات العامة ، والتحقق من الحجج و تفشل مبكرا نظيفة.الوقت/التكلفة بالكاد المسائل.

في جافا عادة رمي IllegalArgumentException

إذا كنت تريد دليل حول كيفية كتابة جيدة كود جافا ، يمكنني أن أوصي الكتاب فعالة جافا بقلم جوشوا بلوخ.

يبدو أن هذا قد يكون من المناسب استخدام ل تأكيد:

public void setTokens(Node node, int newTokens) {
    assert node != null;
    tokens.put(node, newTokens);
}

النهج الخاص بك يعتمد كليا على ما عقد وظيفة الخاص بك ويقدم للمتصلين هل هو شرط مسبق أن العقدة ليست فارغة?

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

أعتقد أن الكثير يعتمد على العقد من طريقة و كيفية المتصل هو معروف.

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

ومع ذلك إذا كنت على سبيل المثال ، توفير طرف ثالث المكتبات التي توزع ثم تحتاج إلى التحقق من صحة عقدة بالقيم الخالية, etcs...

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

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

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

وهذا ينبغي أن يكون كافيا لكل هذه القراءة ، ولكن المسكين الذي يحصل على دعم الدعوة في 3 في الصباح.

(و دائما تقدم نص تفسيري على الاستثناءات الخاصة بك ، سوف نقدر لهم بعض يوم حزين)

مثل آخر :java.لانغ.IllegalArgumentException.حول التحقق null عقدة ، ماذا عن فحص سيئة الإدخال في عقدة الخلق ؟

لا يرجى أي شخص, لذا ما أقوم به الآن الكنسي هو رمز

void method(String s) 

if((s != null) && (s instanceof String) && (s.length() > 0x0000))
{

الذي يحصل لي الكثير من النوم.

الآخرين سوف نختلف.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top