تقول السلسلة أنها ليست فارغة ولكن بعد ذلك تقوم برمي NullPointerException

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

سؤال

يا إلهي.لدي مشروع صغير لأقوم به والأوتار تقتلني!

الآن، لدي سلسلة وهي null (يتم أخذ القيمة من الاستدعاء getParameter() من servlet).

المشكلة هي أنني أحاول معرفة ما إذا كانت فارغة، وحتى لو كانت فارغة، فإن البرنامج يخبرني أنها ليست كذلك null, ، ولكن لاحقًا في البرنامج، عندما أستخدم المتغير، أتلقى استثناءً يقول أن المتغير هو null.

    System.out.println("In  " + ID); // in console: In null
    if ((ID == null) || (ID == "null") || ID.equals(null) || **ID.equals("null")**)
    {

       // after I put the 4th condition, the if is working right (WHAT IS THE PROBLEM?)            
        System.out.println("==null");
        this.ID = "";
    }
    else
    {
        System.out.println("!=null");
        this.ID = ID;
    }
    System.out.println("After " + ID);

ما الذي أفعله خطأ؟

فقط الشرط الرابع يعمل!ماذا عن الباقي (باستثناء الشرط الثاني، لأن هذا الشرط وضعته لأنني كنت يائسًا)

أنا علمت ID == null أو ID.equals(null) سيكون على ما يرام، ولكن لا.

يحرر:المشكلة هي أنني أحصل على قيمة المعرف من نموذج (لنفترض النموذج 1 - عادةً).لكن في هذه الحالة، أستخدم النموذج 2 الذي لا يحتوي على أي مدخلات معرف، لذلك يجب أن يكون المعرف كذلك null و لا "null"

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

المحلول

منذ أن حصلت على السلسلة من servlet أستطيع أن أقول أن هذا أمر طبيعي.

تقوم Java بتحويل سلسلة فارغة إلى سلسلة "فارغة" في بعض الشروط.

من الواضح أن السلسلة التي تستردها ليست قيمة فارغة، ولكنها عبارة عن سلسلة مكونة من 4 أحرف "خالية"

لماذا لا تحاول تصحيح الأخطاء؟أو انظر فقط ماذا يعود هذا:

System.out.println("Length of ID:  " + ID.Length);

يحرر:إذا لم تحصل على استثناء هنا، فهذا يعني أن السلسلة ليست فارغة وستُخرج أيضًا "طول المعرف:4" سيعني أن السلسلة هي بالفعل ID = "null"

تحرير 2:حسنًا، يبدو أن بعض الأشخاص لا يفهمون ما يحدث هنا ويقولون كيف يمكن أن تكون السلسلة الفارغة "فارغة" في بعض الظروف في Java؟يجدون ذلك سخيفًا.أفضلهم أن يجربوا ذلك على جافا:

String abc = null;
String xyz = "hello"; 
System.out.println(xyz + abc); 

سيكون الإخراج "hellonull" لا شيء آخر ...

هنا أيضًا لدينا servlet.هناك بيانات فارغة.يرسل Servlet البيانات الفارغة على أنها "خالية" فماذا يجب أن يفعل؟سلسلة فارغة؟تعال!!!"

نصائح أخرى

ID.equals("null")

بوضوح، ID يحتوي على سلسلة من أربعة أحرف "null".لذا فهو ليس كذلك null (قيمة "لا شيء").

انظر معجم جافا للمزيد على null ثابت.في الأساس المتغير له القيمة null إذا لم يشير إلى أي كائن.السلسلة "null" يكون كائن ولكن، وهي مثيل للفئة خيط, ، وفي هذه الحالة المتغير ID يشير إلى هذا الكائن.

(لاحظ أنه وفقًا للاتفاقية، تبدأ متغيرات Java بأحرف صغيرة، ويتم كتابة الاختصارات مثل ID بأحرف صغيرة تمامًا، لذا اكتب id بدلاً من ID.)

فيما يلي الاختبارات الأربعة التي قمت بتجربتها.الأول والرابع هما الوحيدان اللذان يجب أن تحتاجهما.

  • ID == null :هل الحقل "المعرف" فارغ؟
  • ID == "null":هو المرجع الخاص بالحقل "ID" وهو نفس المرجع المخصص حديثًا String "باطل"؟يجب أن يعود هذا بشكل عام كاذبًا.
  • ID.equals(null):يجب أن يعود هذا دائمًا خطأً - من الناحية النظرية، إذا كان هذا صحيحًا على الإطلاق، فيجب عليك رمي NullPointerException.
  • ID.equals("null"):هي قيمة String "المعرف" هو نفس قيمة String "باطل"؟

يبدو أنها تُرجع السلسلة "فارغة" وليست كائنًا فارغًا.

إذا كانت النتيجة في الواقع فارغة ثم

ID == null

سيكون كافيًا، ولكن كما هو مذكور، من الواضح أن قيمة سلسلة المعرف "فارغة" وليست كائنًا خاليًا.

يجب أن تستخدم .requals عند مقارنة السلاسل بدلاً من استخدام == تشرح هذه المدونة المزيد حول:http://blog.enrii.com/2006/03/15/java-string-equality-common-mistake/

لذلك، "خالية" لا تساوي فارغة، في جافا.

إذا كانت القيمة تأتي من Servlet، فمن المرجح أن تقوم الحاوية بتحويل حقل نموذج فارغ إلى سلسلة فارغة.يجب عليك التحقق من القيمة الفارغة والفارغة ("").

if (value==null || value.equals(""))

وبدلاً من ذلك يمكنك استخدام String's isEmpty() طريقة:

if (value==null || value.isEmpty())

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

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