جافا معالجة الاستثناء الرصاص
افترض أنك تريد كتابة برنامج جافا الذي يقرأ سطر من النص المدخلة من قبل المستخدم، ويعرض النص في المحطة.
الإجراءات هي كما يلي:
1 استيراد java.io. *؛
2 فئة العمومي EchoInput {
3 ساكنة العام باطلة الرئيسية (وسائط سلسلة ) {
4 System.out.println ( "أدخل النص إلى صدى:")؛
5 InputStreamReader ISR = InputStreamReader الجديد (System.in)؛
6 BufferedReader inputReader = BufferedReader الجديد (ISR)؛
7 سلسلة inputLine = inputReader.readLine ()؛
8 System.out.println ( "اقرأ:" + inputLine)؛
9}
10}
التحليل أعلاه من التعليمات البرمجية في فئة EchoInput، خط 3 يعلن الأسلوب الرئيسي، حارة 4 المطالبات للمستخدم إدخال النص، وتقدم صورة 5،6 خط للاتصال BufferedReader InputStreamReader، ويتم توصيل InputStreamReader بدوره إلى دفق الإدخال القياسي System.in ؛ خط 7 يقرأ سطر واحد من النص؛ 8، خط باستخدام تيار الإخراج القياسي System.out يظهر النص.
على السطح فوق الإجراء لا توجد مشكلة، ولكن في الواقع، والطبقة EchoInput المشاكل المحتملة تماما. لقراءة عند استدعاء الأسلوب ReadLine على خط 7 دخلت بشكل صحيح، يجب أن تكون هذه الأنواع من الافتراضات صحيحا: تحمل لوحة المفاتيح فعالة، ويمكن لوحة المفاتيح التواصل بشكل صحيح مع جهاز الكمبيوتر؛ نفترض أن بيانات لوحة المفاتيح يمكن نقلها من نظام التشغيل لآلة جافا الافتراضية، ومن جاوة ينقل الجهاز الظاهري inputReader.
هذه الافتراضات صحيحة في معظم الحالات، ولكن ليس كل شيء. ولهذه الغاية، يستخدم جافا طريقة غير طبيعية للتعامل مع الأخطاء المحتملة واتخاذ خطوات لتصحيحها. في هذه الحالة، إذا حاولت ترجمة التعليمات البرمجية أعلاه، سوف تظهر الرسالة التالية:
استثناء في موضوع java.lang.Error "الرئيسي": لم تحل مشكلة تجميع:
نوع استثناء غير معالج IOException
في EchoInput.main (EchoInput.java:7)
كما يمكن أن يرى، والدعوة خط 7TH الأسلوب ReadLine التي يمكن ان تتعرض: إذا كان الأمر كذلك، ثم IOException لإنتاج خطأ قياسي. خطأ مترجم أقول لك أن كنت بحاجة إلى تغيير رمز لحل هذه المشكلة المحتملة. في وثائق API جدك، يمكنك أن ترى نفس المعلومات. يمكننا أن نرى الأسلوب ReadLine، كما هو مبين في الشكل.
JDK طريقة الوثائق API ReadLine للFIG 1. الطبقة BufferedReader
كما هو واضح من الشكل 1، قد تحدث الأسلوب ReadLine IOException. كيفية التعامل مع الفشل المحتملة؟ يحتاج المترجم إلى "الاستيلاء" أو "إعلان" IOException.
"القبض على (الصيد)" اعتراض خطأ يشير إلى خطأ عندما الأسلوب ReadLine، وتسجيل ومعالجة المشاكل. "إعلان (تعلن)" يشير إلى خطأ قد يؤدي IOException، وإخطار أية تعليمات برمجية يدعو هذا الأسلوب: قد يكون استثناء.
لاستثناءات الصيد، لديك لإضافة خاص "كتلة التعليمات البرمجية"، لتلقي ومعالجة IOException. ثم يقرأ البرنامج على النحو التالي:
1 استيراد java.io. *؛
2 فئة العمومي EchoInputHandle {
3 ساكنة العام باطلة الرئيسية (وسائط سلسلة ) {
4 System.out.println ( "أدخل النص إلى صدى:")؛
5 InputStreamReader ISR = InputStreamReader الجديد (System.in)؛
6 BufferedReader inputReader = BufferedReader الجديد (ISR)؛
7 المحاولة {
8 سلسلة inputLine = inputReader.readLine ()؛
9 System.out.println ( "اقرأ:" + inputLine)؛
10}
11 الصيد (غير شامل IOException) {
12 System.out.println ( "استثناء اجه:" + غير شامل)؛
13}
14}
15}
كتلة التعليمات البرمجية وأضاف يحتوي على كلمات ومحاولة الصيد (7،10،11،13 خط)، يمثل مساهمة في قراءتها. في حال نجاحها، وتعمل بشكل طبيعي. إذا قراءة خطأ، ثم قبض على المشكلة (التي تمثلها الأجسام IOException)، واتخاذ الإجراءات المناسبة. في تجسيد الحالي، يتم استخدام طريقة المعالجة في الانتاج غير طبيعي.
إذا تحضير للقبض IOException، بيان غير عادي فقط، وسيكون الأسلوب الرئيسي خصيصا قد تكون خاطئة، ولكن قد لديك تعليمات خاصة IOException. ثم يقرأ البرنامج على النحو التالي:
1 استيراد java.io. *؛
2 فئة العمومي EchoInputDeclare {
3 ساكنة العام باطلة الرئيسية (وسائط سلسلة ) يلقي IOException {
4 System.out.println ( "أدخل النص إلى صدى:")؛
5 InputStreamReader ISR = InputStreamReader الجديد (System.in)؛
6 BufferedReader inputReader = BufferedReader الجديد (ISR)؛
7 سلسلة inputLine = inputReader.readLine ()؛
8 System.out.println ( "اقرأ:" + inputLine)؛
9}
10}
من هذا المثال البسيط أعلاه، يمكننا أن نرى أن معالجة الاستثناء لا يمكن تجاهلها في تطوير جافا البرمجية.
استثناء جافا ومعالجة الاستثناء
ويمكن رؤية استثناء جافا كنوع من الرسالة، فإنه ينقل معلومات عن عدد من مشاكل النظام، أخطاء وعدم تنفيذ الإجراء. استثناء يحتوي على معلومات عن إرسال المعلومات من جزء من تطبيق إلى آخر.
لماذا لغات لاستثناءات مقبض جمعتها؟ لماذا لا موقف غير طبيعي على استعداد للتعامل مع خطأ محددة؟ تفويض المهام لأن في بعض الأحيان نحن بحاجة إلى إيصال رسالة خطأ في النظام، من أجل التعامل مع هذه القضية وفقا لطريقة موحدة، وأحيانا لأن هناك العديد من السبل الممكنة للتعامل مع المشكلة، ولكن كنت لا تعرف أي واحد لاستخدامها في هذا الوقت، يمكن معالجة الاستثناءات إلى رمز الذي يستدعي الأسلوب. المتصل عادة ما يكون أفضل فهم من سياق مصدر المشكلة، لتحديد أفضل وضع الاسترداد.
FIG 2 هو عامة العمارة الرسائل الغرض.
2. FIG رسالة عامة مخطط
وكما يتبين من الشكل، يجب أن يكون استثناء لفئة أو الكائن في بعض تطبيقات Java التوالي. عند حدوث فشل "المرسل" سوف يولد كائن استثناء. وقد تمثل تنشأ جافا مشكلة الرمز، قد يكون من الخطأ المناسبة JVM أو الأجهزة أو نظام التشغيل الأخطاء الأساسية.
يمثل رسالة الاستثناء نفسه، يشير المرسل إلى البيانات المرسلة إلى المتلقي "تحميل". أولا، شذوذ لنقل المعلومات مفيدة تقوم على نوع من الطبقة. في كثير من الحالات، كل فئة التي حددتها خطأ وعلى أساس هذا الشذوذ يمكن تصحيح المشكلة. ثانيا، مع احتمال استثناء أيضا بيانات مفيدة (على سبيل المثال، والصفات).
تتم معالجة استثناء، يجب أن يكون رسالة للمتلقي، وإلا فإنه لن تتعامل مع المشكلة الأساسية استثناء.
في المثال، وشذوذ "منتج" للقراءة خطوط BufferedReader. عندما يحدث خطأ، الكائن شيدت طريقة IOException ريدلاين. غير طبيعي "المستقبل" هو رمز نفسه. محاولة اللحاق بنية كتلة التقاط تطبيق EchoInputHandle هو المتلقي غير طبيعي، والنواتج خلل في السلسلة، تسجيل المشكلة.
جافا الدرجة استثناء التسلسل الهرمي
عندما نفهم الشذوذ ككل، يجب أن نعرف كيفية استخدام استثناءات في تطبيقات جافا التي تحتاج إلى فهم التسلسل الهرمي للفئات Java. الرقم 3 هو الهيكل الهرمي للفئات Java.
الشكل 3. جافا الطبقة التسلسل الهرمي
في جاوة، جميع الاستثناءات لها سلف مشترك قابل للظهور (قابل للظهور). قابل للظهور تحديد رمز متوفرة في أي مشاكل المشتركة الشاذة آلية نشر انتقال العدوى عن طريق تطبيقات جافا.
قابل للظهور اثنين من الفئات الفرعية الهامة: استثناء (غير طبيعي) والخطأ (خطأ)، وكلاهما فئة فرعية مهمة معالجة الاستثناء جافا، كل يحتوي على عدد كبير من الفئات الفرعية.
استثناء (غير طبيعي) هو ممكن وقابل للتنبؤ الطلب، المشاكل الذاتية. تشير معظم الاستثناءات عموما مشكلة مع معتدلة إلى خفيفة. عادة يتم إنشاء استثناء في ظل ظروف معينة، وعادة في مدونة محددة وأساليب العمل. في الصف EchoInput، عند محاولة استدعاء الأسلوب ReadLine، قد يحدث IOException.
(خطأ) يشير إلى مشاكل أكثر خطورة تشغيل التطبيق. معظم الأخطاء لا علاقة لها العملية وتنفيذ الكتاب رمز، وأن رمز المشكلة يتم تشغيل JVM (آلة جافا الافتراضية) تظهر. على سبيل المثال، عندما لم يعد مطلوبا من JVM موارد الذاكرة لمواصلة عملياتها، وسوف تظهر OutOfMemoryError.
الطبقة استثناء لديها فرعية هامة من RuntimeException. RuntimeException والفئات الفرعية يشير إلى الخطأ الناجم عن "عمليات مشتركة JVM." على سبيل المثال، عند محاولة استخدام مرجع كائن لاغية، القسمة على صفر أو مجموعة ساق، على التوالي، يتم طرح استثناء (NullPointerException، ArithmeticException) وArrayIndexOutOfBoundException وقت التشغيل.
معالجة الاستثناء جافا
في تطبيقات جافا، للتعامل مع بطريقتين استثناء: استثناء المناولة وبيان غير عادي.
معالجة الاستثناءات: المحاولة، الصيد وأخيرا
للقبض على استثناء، يجب إضافة معالج الاستثناء في كتلة التعليمات البرمجية. قد تحتوي هذه الهياكل جافا ثلاثة أجزاء،
يوجد جافا الكلمة. عن طريق محاولة تجميع مياه الأمطار في النهاية بنية البرمجية التالية المثال.
1 استيراد java.io. *؛
2 فئة العمومي EchoInputTryCatchFinally {
3 ساكنة العام باطلة الرئيسية (وسائط سلسلة ) {
4 System.out.println ( "أدخل النص إلى صدى:")؛
5 InputStreamReader ISR = InputStreamReader الجديد (System.in)؛
6 BufferedReader inputReader = BufferedReader الجديد (ISR)؛
7 المحاولة {
8 سلسلة inputLine = inputReader.readLine ()؛
9 System.out.println ( "اقرأ:" + inputLine)؛
10}
11 الصيد (غير شامل IOException) {
12 System.out.println ( "استثناء اجه:" + غير شامل)؛
13}
14 أخيرا {
15 System.out.println ( "نهاية.")؛
16}
17}
18}
حيث:
- محاولة كتلة: عند واحد أو أكثر من البيانات في المحاولة، فإنه يشير إلى أن هذه التصريحات قد رمي. المترجم يعرف حدوث خلل قد يكون، لذلك يمنع تقييم الهيكل الداخلي الخاص جميع البيانات.
- الصيد كتلة: عند حدوث مشكلة، يتم تعريف خيار واحد في كتلة رمز لمعالجة هذه المشكلة، فإن الغرض من هذا أن يكون في كتلة الصيد. ومن المستفيد من كتلة التقاط كتلة المحاولة غير طبيعية. المبدأ الأساسي هو: مرة واحدة يتم إنشاء الاستثناء من خلال تعليق كتلة المحاولة، ترى JVM على JVM المناسب.
- أخيرا منع: منع أخيرا يمكن تعريف أيضا، بغض النظر عن نتائج رمز لتشغيل كتلة المحاولة، التي منع بعض كود التشغيل. في البيئات المشتركة كل شيء، أخيرا سيتم تشغيل كتلة. بغض النظر عن ما إذا كانت كتلة المحاولة نفدت، أم لا شذوذ، بغض النظر عن ما إذا كانت المعالجة في كتلة الصيد، وسيتم تنفيذ كتلة أخيرا.
محاولة تجميع مياه الأمطار أخيرا القاعدة:
بيان غير عادي
ليعلن استثناء، يجب إضافته إلى نهاية كتلة طريقة التوقيع. هنا مثال على ذلك:
errorProneMethod الفراغ الجمهور (المدخلات كثافة العمليات) رميات java.io.IOException {
// رمز للأسلوب، بما في ذلك واحد أو أكثر طريقة
// المكالمات التي قد تنتج IOException
}
وبالتالي، سيتم تمرير الاستثناء المتصل إعلان الأسلوب، ولكن أيضا لإبلاغ المترجم: أي المتصل من الأسلوب يجب أن تتبع عملية أو مطالبة القواعد. قواعد استثناءات أعلنت هي كما يلي:
- يجب أن تعلن هذه الطريقة يمكن رمي أي غير طبيعي (باستثناء محددة) للكشف.
- غير كشف للشذوذ (استثناء دون رادع) ليست ضرورية، ويمكن المعلنة أو غير معلنة.
- استدعاء الأسلوب يجب أن تتبع أي كشف معالجة الاستثناء والمطالبة القواعد. إذا تجاوز طريقة، لا يمكن أن تعلن استثناء وتغطية طرق مختلفة. يجب أن يعلن أي نوع أو فئة فرعية أن يكون غير طبيعي إعلان الأسلوب متجاوزة.
فئة جافا معالجة الاستثناء
يمكن تقسيمها إلى استثناء جاوة قد كشف شذوذ، والكشف عن شذوذ واستثناء غير الجمركية.
يمكن الكشف عن شذوذ
يمكن الكشف عن شذوذ من قبل التحقق مترجم، ليلقي أي وسيلة بيان استثناء، فإن المترجم فرض قواعد أو عملية الإعلان، على سبيل المثال: استثناء sqlExecption أن الكشف عن الشذوذ. عند الاتصال JDBC، لا قبض عليه، فإن المترجم لن تمر، لا تسمح للمترجم.
غير الكشف عن تشوهات
غير كشف لعملية غير طبيعية أو لا تتبع بيان القواعد. في توليد مثل هذا الاستثناء، ليس لديك لاتخاذ أي العملية المناسبة، والمترجم لا تحقق ما إذا كان قد تم حل هذا الاستثناء. على سبيل المثال: طول المصفوفة هو 3، عند استخدام رمز سفلي 3، فإنه سوف ينتج مجموعة منخفض حدود استثناء. وJVM لا يكشف شذوذ، والاعتماد على مبرمج لقاض. هناك نوعان من فئات رئيسية من تشوهات غير محددة المكتشفة: RuntimeException والخطأ.
فرعية اكتشاف الخطأ هي غير طبيعية لأنهم لا يستطيعون التنبؤ الوقت جيل. إذا كان عدم وجود ذاكرة تطبيق جافا، قد تحدث OutOfMemoryError في أي وقت، عادة لا يسبب تطبيق الاستدعاء خاص، ولكن المشاكل JVM الخاصة. وبالإضافة إلى ذلك، أعرب خطأ عامة لا يمكن أن تحل مشاكل التطبيق خطيرة.
الطبقة RuntimeException أيضا تنتمي إلى الشذوذ غير كشف-كما قد تحدث عملية غير طبيعية في أي وقت من التشغيل العادي تثير JVM، يتم تشغيل هذه الاستثناءات عموما عن طريق عملية محددة. ومع ذلك، تحدث هذه العمليات في كثير من الأحيان في تطبيقات جافا. ولذلك، فإنها لا تقتصر الشيكات مترجم أو بيانات وقواعد المعالجة.
استثناء مخصصة
استثناء مخصصة لإظهار بعض من النوع الخطأ من التطبيق، لتقديم معنى جديدا لواحد أو أكثر من رموز المشكلة التي قد تحدث. أنه قد يتم عرض أوجه التشابه بين رموز الخطأ وافر من المناصب، أو يمكن أيضا التمييز بين عدد وافر من المشاكل المشابهة التي قد تحدث عند رمز خطأ لتشغيل أو تطبيق معين بمعنى إعطاء مجموعة من الخطأ. على سبيل المثال، عند تشغيل قائمة الانتظار، قد يكون هناك حالتين: عند محاولة إزالة قائمة انتظار فارغة العنصر؛ عند محاولة إضافة عنصر إلى قائمة الانتظار ممتلئ. تحتاج إلى تخصيص اثنين استثناءات للتعامل مع كلتا الحالتين.
المبادئ والمحرمات جافا معالجة الاستثناء
جافا مبادئ معالجة الاستثناء
المحرمات جافا معالجة الاستثناء
أمثلة تطبيق جافا معالجة الاستثناء
عند تحديد البنك، يحتاج معالجة الاستثناء الذي يتعين القيام به إذا كان التوازن هو أكبر من عدد من الانسحابات.
تحديد insufficientFundsException استثناء الطبقة. السحب (سحب) قد تكون عملية استثناء، هذا التوازن هو أقل من المبلغ اتخاذها.
معالجة الاستثناءات عند استدعاء انسحاب، وبالتالي فإن طريقة السحب لرمي استثناء، وارتفاع مستوى استدعاءات الأسلوب.
الطبقة استثناء:
الطبقة InsufficientFundsExceptionextends استثناء {
excepbank البنك الخاص؛ // هدف البنك
excepAmount المزدوج الخاص؛ // لأخذ المال
InsufficientFundsException (با البنك، dAmount مزدوجة)
{Excepbank = با.
excepAmount = dAmount.
}
جمهور سلسلة excepMessage () {
سلسلة شارع = "التوازن هو" + excepbank.balance
+ "\ N" + "وكان انسحاب" + excepAmount.
العودة شارع.
}
} // الطبقة استثناء
البنك:
البنك الطبقة {
توازن مزدوج؛ // عدد من الودائع
بنك (توازن مزدوجة) {this.balance = التوازن؛}
الإيداع باطلة العامة (dAmount مزدوجة) {
إذا (dAmount > 0.0) ميزان + = dAmount.
}
سحب باطلة العامة (dAmount مزدوجة)
يلقي InsufficientFundsException {
إذا (التوازن < dAmount) رمي جديدة
InsufficientFundsException (هذا، dAmount)؛
ميزان = ميزان dAmount.
}
showBalance الفراغ الجمهور () {
System.out.println ( "إن التوازن هو" + (كثافة) التوازن)؛
}
}
الواجهة الأمامية للالدعوة:
الطبقة العامة ExceptionDemo {
ساكنة العام باطلة الرئيسية (وسائط سلسلة ) {
محاولة {
با البنك = البنك الجديد (50)؛
ba.withdrawal (100)؛
System.out.println ( "سحب ناجحة!")؛
} صيد (InsufficientFundsException ه) {
System.out.println (e.toString ())؛
System.out.println (e.excepMessage ())؛
}
}
}
ملخص
جافا معالجة الاستثناء مهم جدا لاستخدام اللغة وبرامج تطوير جافا في جانب واحد من تطوير السيناريو الاختبار. واستثناء التعامل التركيز سيكون على تطوير التعليمات البرمجية أكثر قوة، أكثر استقرارا. وتصف هذه الورقة نظام من المبادئ وطرق معالجة الاستثناء جافا. لمساعدة القارئ على فهم أكثر وضوحا جافا آلية معالجة الاستثناء، واستخدام أكثر مرونة عندما تتطور التعليمات البرمجية.