سمعت من المعلم أن معظم التشوهات في الدراسات المستقبلية هي استثناءات مؤشر فارغة. لذا خذ بعض الوقت للعب الألعاب للتحقق من استثناء مؤشر فارغ
1: الأسباب الرئيسية لحدوث استثناءات مؤشر فارغة هي كما يلي:
(1) عندما لا يكون كائن ما ، فإنه سيولد استثناء obj.method () // كائن OBJ غير موجود
(2) عند الوصول إلى أو تعديل حقل غير موجود في كائن ، سيتم إنشاء استثناء OBJ.Method () // غير موجود
(3) لا يتم تهيئة متغير السلسلة ؛
(4) لا تتم تهيئة كائنات نوع الواجهة بفئات محددة ، مثل:
قائمة LT ؛ سوف يبلغ عن خطأ
قائمة lt = new ArrayList () ؛ لن يكون هناك خطأ
عندما تكون قيمة الكائن فارغة ، فأنت لا تحكم على أن تكون فارغة. يمكنك محاولة إضافة سطر من التعليمات البرمجية قبل الرمز التالي:
إذا (rb! = null && rb! = "")
التغيير إلى:
if (rb == null) ؛ if (rb! == null && rb! = "") أو if ((""). يساوي (RB))حل للمؤشر الفارغ:
ركز على الخط الذي يحدث فيه الخطأ ، وتشخيص أخطاء محددة من خلال سببين رئيسيين ناتج عن استثناء المؤشر الفارغ. في الوقت نفسه ، من أجل تجنب حدوث مؤشرات فارغة ، من الأفضل وضع "قيم لاغية" أو قيم خالية قبل القيمة المحددة عند إجراء معالجة الحكم.
تحليل موجز لاستثناءات المؤشر الفارغ المشترك:
(1) خطأ مؤشر فارغ java.lang.nullpointerxception
هناك 8 أنواع بيانات أساسية في Java. يمكن أن يكون لقيم المتغيرات قيمها الافتراضية. إذا تمت إضافتها بدون تعيين عادي ، فلا يمكن تجميع الجهاز الظاهري Java بشكل صحيح. لذلك ، لن يؤدي استخدام أنواع بيانات Java الأساسية عمومًا إلى استثناءات مؤشر فارغة. في التطوير الفعلي ، ترتبط معظم استثناءات المؤشر الفارغ بشكل أساسي بعمليات الكائنات.
2. آلية معالجة استثناء جافا
هناك طريقتان للتعامل مع الرمز الذي قد يكون له استثناءات:
أولاً ، استخدم عبارة Try ... catch في طريقة التقاط الاستثناءات والتعامل معها. يمكن أن يكون لبيان ذاكرة التخزين المؤقت العديد من الاستثناءات المتعددة. على سبيل المثال:
public void p (int x) {try {...} catch (استثناء e) {...} أخيرًا {...}} ثانياً ، بالنسبة للاستثناءات التي لا يمكن معالجتها أو تلك التي تحتاج إلى تحويلها ، تمريرها عند إعلان الطريقة.
بيان الرمي يلقي استثناء. على سبيل المثال:
public void test1 () يلقي MyException {... if (....) {رمي myException () ؛}}إذا كانت كل طريقة ببساطة يلقي استثناءً ، في مكالمة متداخلة متعددة الطبقات إلى طريقة استدعاء الطريقة ، يبحث جهاز Java Virtual من كتلة رمز الطريقة حيث يحدث الاستثناء حتى يتم العثور على كتلة الكود التي تتعامل مع الاستثناء. ثم سلم الاستثناء لبيان الصيد المقابل للمعالجة. إذا كانت الجهاز الظاهري Java يعود إلى الطريقة الرئيسية () في أسفل مكدس استدعاء الطريقة ، إذا لم يتم العثور على كتلة الكود التي تتعامل مع الاستثناء ، فسيتم التعامل مع الخطوات التالية:
أولاً ، اتصل بالطريقة printstacktrace () لكائن الاستثناء وطباعة معلومات الاستثناء من مكدس استدعاء الطريقة.
ثانياً ، إذا كان الخيط الذي يحدث استثناء هو الخيط الرئيسي ، فإن تشغيل البرنامج بأكمله ينتهي ؛ إذا لم يكن الخيط الرئيسي ، يتم إنهاء مؤشر الترابط ويستمر المواضيع الأخرى في التشغيل.
من خلال التحليل والتفكير ، يمكننا أن نرى أنه كلما كانت المعالجة غير الطبيعية في وقت مبكر ، كلما كانت الموارد والوقت المستهلكة الأصغر ، كلما كان نطاق التأثير أصغر. لذلك ، لا ترمي استثناءات يمكنك التعامل معها مع المتصل أيضًا.
لا يمكن تجاهل نقطة أخرى: يجب أخيرًا تنفيذ البيانات في أي حال ، والتي يمكن أن تضمن موثوقية بعض التعليمات البرمجية التي يجب تنفيذها في أي حال. على سبيل المثال ، عندما يكون استعلام قاعدة البيانات غير طبيعي ، يجب إصدار اتصال JDBC ، وما إلى ذلك. يتم تنفيذ البيان أخيرًا قبل بيان الإرجاع ، بغض النظر عن طلبه أو موقعه ، أو ما إذا كان هناك استثناء في كتلة المحاولة. الموقف الوحيد الذي لم يتم تنفيذ البيان أخيرًا هو أن الطريقة تنفذ طريقة system.exit (). System.Exit () وظائف لإنهاء الجهاز الظاهري الجافا الذي يعمل حاليًا. لا يمكن تغيير قيمة إرجاع الإرجاع عن طريق تعيين قيمة جديدة للمتغير في كتلة العبارة أخيرًا. يوصى أيضًا بعدم استخدام عبارة الإرجاع في الكتلة الأخيرة. إنه لا معنى له ويمكن أن يؤدي بسهولة إلى أخطاء.
أخيرًا ، يجب عليك أيضًا الانتباه إلى قواعد بناء الجملة لمعالجة الاستثناءات:
أولاً ، لا يمكن أن توجد عبارات محاولة بمفردها ، ولكن يمكن أن تتكون من الصيد وأخيراً
حاول ... التقاط ... أخيرًا ، حاول ... التقاط ، حاول ... أخيرًا ، حاول ... أخيرًا ، يمكن أن تحتوي العبارات على واحدة أو أكثر ، وأخيراً يمكن أن تكون العبارات واحدة على الأكثر. تحاول الكلمات الرئيسية الثلاث ، والقبض عليها ، وأخيراً لا يمكن استخدامها بمفردها.
ثانياً ، يكون نطاق المتغيرات في كتل الكود الثلاثة مستقلة ولا يمكن الوصول إليه من بعضها البعض. إذا كنت ترغب في الوصول إلى جميع الكتل الثلاث ، فأنت بحاجة إلى تحديد المتغير خارج هذه الكتل.
ثالثًا ، عند استخدام كتل الصيد المتعددة ، يطابق جهاز Java Virtual أحد فئة الاستثناء أو فئة الفئة الفرعية ، ويقوم بتنفيذ كتلة الصيد دون تنفيذ كتل الصيد الأخرى.
رابعا ، لا توجد بيانات أخرى تتبع بعد بيان الرمي لأن هذه لا تتاح لها الفرصة لإعدامها.
خامسًا ، إذا استدعى أحد الأسلوب طريقة أخرى تعلن الاستثناء الذي تم إلقاؤه ، فإن هذه الطريقة إما تتعامل مع الاستثناء أو تعلن عن الإلقاء.
2.2difference بين الرمي ورمي الكلمات الرئيسية:
يستخدم رمي لرمي استثناء ، داخل الجسم. تنسيق بناء الجملة هو: رمي كائن استثناء.
يتم استخدام الرميات لإعلان الاستثناء الذي يمكن إلقاؤه بطريقة ما. بعد اسم الطريقة ، تنسيق بناء الجملة هو:
رمي الاستثناء النوع 1 ، استثناء النوع 2 ... نوع الاستثناء n.
ثلاثة: يسرد ما يلي العديد من المواقف والحلول المقابلة حيث قد تحدث استثناءات مؤشر فارغ:
قصاصة الكود 1:
Out.println (request.getParameter ("username")) ؛التحليل: دالة المقطع الرمز 1 بسيط للغاية ، وهو إخراج قيمة إدخال المستخدم "اسم المستخدم".
ملاحظة: يبدو أن العبارة أعلاه لا يمكنها العثور على أي أخطاء في بناء الجملة ، وفي معظم الحالات ، لا توجد مشكلة. ومع ذلك ، إذا لم يوفر المستخدم قيمة حقل النموذج "اسم المستخدم" عند إدخال البيانات ، أو يتخطى النموذج إدخال مباشرة من خلال بطريقة ما ، فإن قيمة هذا الطلب. getParameter ("اسم المستخدم") فارغة (لاحظ أنه لا توجد سلسلة فارغة ، فهي عبارة عن كائن فارغ ، وسيتم عرضه على المقطوع 1 مكون من الكود 1 سوف يتم عرضه على المقطوع 1. "java.lang.nullpointerxception" استثناء. علاوة على ذلك ، حتى لو كان الكائن فارغًا ، فإن بعض طرق java.lang.object أو كائن الكائن نفسه يسمى ، مثل tostring () ، متساوية (كائن OBJ) وغيرها من العمليات.
قصاصة الكود 2:
username string = request.getParameter ("اسم المستخدم") ؛ if (username.equals ("root")) {...}التحليل: تتمثل دالة المقطع 2 في الكود في اكتشاف اسم المستخدم الذي يوفره المستخدم. إذا كان مستخدمًا هو اسم المستخدم "Root" ، فسيتم تنفيذ بعض العمليات الخاصة.
ملاحظة: في قطاع الرمز 2 ، إذا لم يوفر المستخدم قيمة حقل النموذج "اسم المستخدم" ، فإن اسم مستخدم كائن السلسلة هو قيمة خالية ، ولا يمكن مقارنة كائن فارغ مباشرة بكائن آخر. وبالمثل ، فإن صفحة JSP حيث يوجد مقطع الرمز 2 ستلقي خطأ مؤشر فارغ.
خدعة صغيرة: إذا كنت ترغب في مقارنة قيمة إرجاع طريقة معينة مع ثابت ووضع ثابت أمامه ، فيمكنك تجنب استدعاء طريقة متساوية للكائن الفارغ. على سبيل المثال:
إذا ("الجذر" .equals (اسم المستخدم)) {...}حتى إذا قام كائن اسم المستخدم بإرجاع كائن فارغ ، فلن يكون هناك استثناءات مؤشر فارغة هنا ويمكن أن تعمل كالمعتاد.
المقتطف 3:
username username = session.getAttribute ("session.username"). toString () ؛التحليل: تتمثل دالة الشريحة 3 في إخراج قيمة الجلسة. اسم المستخدم في الجلسة وتعيين القيمة إلى اسم مستخدم كائن السلسلة.
ملاحظة: بشكل عام ، إذا كان للمستخدم بالفعل جلسة ، فلن تحدث أي مشكلة ؛ ومع ذلك ، إذا قام خادم التطبيق بإعادة تشغيله في هذا الوقت ولم يقوم المستخدم بتسجيل الدخول مرة أخرى (قد يكون المستخدم أيضًا يغلق المتصفح ولكنه لا يزال يفتح الصفحة الأصلية). التنفيذ المباشر لعملية TOSTRING () على كائن مع خالية سيؤدي إلى إلقاء النظام استثناء مؤشر فارغ.
المقتطف 4:
public static void main (string args []) {person p = null ؛ P.SetName ("Zhang San") ؛ System.out.println (p.getName ()) ؛ }التحليل: أعلن كائن شخص وطباعة اسم الاسم في الكائن.
ملاحظة: في هذا الوقت ، سيكون لدى P الخاص بك استثناء مؤشر فارغ ، لأنك أعلنت للتو أن كائن نوع الشخص هذا لم ينشئ كائنًا ، لذلك لا يوجد مرجع عنوان في كومةه. لا تنشئ بالضرورة كائن عند استخدام الكائن واستخدام الطريقة.
ج: ابدأ في استخدامه مباشرة بغض النظر عما إذا كان الكائن فارغًا أم لا.
(JSP) مقطع الكود 1:
Out.println (request.getParameter ("username")) ؛التحليل: دالة المقطع الرمز 1 بسيط للغاية ، وهو إخراج قيمة إدخال المستخدم "اسم المستخدم".
ملاحظة: يبدو أن العبارة أعلاه لا يمكنها العثور على أي أخطاء في بناء الجملة ، وفي معظم الحالات ، لا توجد مشكلة. ومع ذلك ، إذا لم يوفر المستخدم قيمة حقل النموذج "اسم المستخدم" عند إدخال البيانات ، أو يتخطى النموذج إدخال مباشرة من خلال بطريقة ما ، فإن قيمة هذا الطلب. getParameter ("اسم المستخدم") فارغة (لاحظ أنه لا توجد سلسلة فارغة ، فهي عبارة عن كائن فارغ ، وسيتم عرضه على المقطوع 1 مكون من الكود 1 سوف يتم عرضه على المقطوع 1. "java.lang.nullpointerxception" استثناء. علاوة على ذلك ، حتى لو كان الكائن فارغًا ، فإن بعض طرق java.lang.object أو كائن الكائن نفسه يسمى ، مثل tostring () ، متساوية (كائن OBJ) وغيرها من العمليات.
(JSP) المقتطف 2:
username string = request.getParameter ("اسم المستخدم") ؛ if (username.equals ("root")) {...}التحليل: تتمثل دالة المقطع 2 في الكود في اكتشاف اسم المستخدم الذي يوفره المستخدم. إذا كان مستخدمًا هو اسم المستخدم "Root" ، فسيتم تنفيذ بعض العمليات الخاصة.
ملاحظة: في قطاع الرمز 2 ، إذا لم يوفر المستخدم قيمة حقل النموذج "اسم المستخدم" ، فإن اسم مستخدم كائن السلسلة هو قيمة خالية ، ولا يمكن مقارنة كائن فارغ مباشرة بكائن آخر. وبالمثل ، فإن صفحة JSP حيث يوجد مقطع الرمز 2 ستعمل على رمي (java.lang.nullpointerxception) خطأ مؤشر فارغ.
(JSP) المقتطف 3:
username username = session.getAttribute ("session.username"). toString () ؛التحليل: تتمثل دالة الشريحة 3 في إخراج قيمة الجلسة. اسم المستخدم في الجلسة وتعيين القيمة إلى اسم مستخدم كائن السلسلة.
ملاحظة: بشكل عام ، إذا كان للمستخدم بالفعل جلسة ، فلن تحدث أي مشكلة ؛ ومع ذلك ، إذا قام خادم التطبيق بإعادة تشغيله في هذا الوقت ولم يقوم المستخدم بتسجيل الدخول مرة أخرى (قد يكون المستخدم أيضًا يغلق المتصفح ولكنه لا يزال يفتح الصفحة الأصلية). التنفيذ المباشر لعملية TOSTRING () على كائن خالية سيؤدي إلى إلقاء النظام (java.lang.nullpointerxception) استثناء مؤشر فارغ.
ما سبق هو المحتوى الكامل للمناقشة الموجزة حول معالجة استثناءات Java مع استثناءات المؤشر الفارغ الذي جلبه لك المحرر. آمل أن يدعم الجميع wulin.com أكثر ~