مشخصات مقاله
-
1504
-
0.0
-
8071
-
0
-
0
آموزش Java – دستور throws در Java
آموزش Java – دستور throws در Java
کلیدواژه ی throws برای اعلان خطا بکار می رود. این دستور به برنامه نویس اعلان می کند که ممکن است خطایی رخ دهد به همین دلیل بهتر است کد مدیریت خطا را داخل برنامه جاسازی کند تا روند اجرای برنامه دچار اخلال نشود. به عبارت دیگر زمانی که در یک متد خطا رخ می دهد و توسعه دهنده از throws استفاده می کند، بدین معنی است که مدیریت exception به فراخواننده ی متد واگذار می شود. در واقع زمانی که در بدنه ی یک تابع کدی قرار می گیرد که امکان دارد سبب رخداد خطای زمان کامپایل شود و آن را داخل قطعه کدهای try/catch جهت مدیریت قرار ندهید، بایستی از throws استفاده نمایید. با استفاده از throws می توان نوشتن ساختارهای دستوری try و catch را به تعویق انداخت.
Exception handling عمدتا برای مدیریت خطاهای checked و زمان کامپایل مورد استفاده قرار می گیرد. چنانچه خطای unchecked نظیر NullPointerException در زمان اجرای برنامه رخ دهد، این تقصیر برنامه نویس است که کد خود را قبل از استفاده ی نهایی و اجرا بررسی یا اشکال زدایی نکرده است.
دستور استفاده از کلیدواژه ی throws به شرح زیر می باشد:
return_type method_name() throws exception_class_name{
//method code
}
لازم به ذکر است که تنها خطاهای زمان کامپایل می بایست با throws اعلان شوند چرا که خطاهای unchecked مربوط به زمان اجرا بوده، مدیریت آن ها باید توسط برنامه نویس صورت گیرد و error نیز از کنترل توسعه دهنده خارج می باشد (برای مثال اگر VirtualMachineError یا StackOverflowError رخ دهد، برنامه نویس قادر به اداره ی آن نخواهد بود).
استفاده از دستور throws مزایای زیر را به دنبال دارد:
- 1. با throws می توان خطاهای checked و زمان کامپایل را در call stack و زنجیره ی فراخوانی قرار داد.
- 2. این دستور اطلاعاتی در خصوص خطای رخ داده به فراخواننده تابع ارسال می کند.
مثال کاربردی از دستور throws
در زیر مثالی را مشاهده می کنید که در آن کد برنامه به واسطه ی دستور throws خطای زمان کامپایل (checked) را در call stack قرار داده و آن exception را از متد بالای پشته (stack) به متد پایین پشته جهت مدیریت پاس می دهد.
import java.io.IOException;
class Testthrows1{
void m()throws IOException{
throw new IOException("device error");//checked exception
}
void n()throws IOException{
m();
}
void p(){
try{
n();
}catch(Exception e){System.out.println("exception handled");}
}
public static void main(String args[]){
Testthrows1 obj=new Testthrows1();
obj.p();
System.out.println("normal flow...");
}
}
خروجی:
exception handled normal flow...
در مدیریت خطا دو حالت بیشتر وجود ندارد:
- حالت اول: شما خطا را مدیریت می کنید، به عبارت دیگر exception را با استفاده از دستورات try/catch گرفته و اداره می کنید.
- حالت دوم: خطا را اعلان می کنید یا به عبارت دیگر از کلیدواژه ی throws استفاده می نمایید.
حالت اول: مدیریت خطا
زمانی که شما خطا را مدیریت می کنید، کد به درستی اجرا می شود، خواه خطا رخ دهد و خواه هیچ خطایی رخ ندهد.
import java.io.*;
class M{
void method()throws IOException{
throw new IOException("device error");
}
}
public class Testthrows2{
public static void main(String args[]){
try{
M m=new M();
m.method();
}catch(Exception e){System.out.println("exception handled");}
System.out.println("normal flow...");
}
}
خروجی:
exception handled normal flow...
حالت دوم: اعلان خطا با throws
- • چنانچه خطا را اعلان نمایید و هیچ خطایی رخ ندهد، طبق انتظار برنامه بدون خطا اجرا می شود.
- • چنانچه پس از اعلان خطا با throws، حقیقتا خطایی رخ دهد، آنگاه در زمان اجرای برنامه یک exception صادر می شده و روند اجرا را مختل می نماید. چرا که دستور throws صرفا خطا را اعلان کرده و آن را مدیریت نمی کند.
در زیر مثالی را مشاهده می کنید که در آن خطا رخ نمی دهد:
import java.io.*;
class M{
void method()throws IOException{
System.out.println("device operation performed");
}
}
class Testthrows3{
public static void main(String args[])throws IOException{//declare exception
M m=new M();
m.method();
System.out.println("normal flow...");
}
}
خروجی:
device operation performed normal flow...
مثال زیر نمونه ای را نشان می دهد که در آن خطا رخ داده و مدیریت نمی شود:
import java.io.*;
class M{
void method()throws IOException{
throw new IOException("device error");
}
}
class Testthrows4{
public static void main(String args[])throws IOException{//declare exception
M m=new M();
m.method();
System.out.println("normal flow...");
}
}
خروجی:
Runtime Exception
آیا می توان یک خطا را مجددا throw کرد؟
در پاسخ باید گفت بلی. برای این منظور همان خطا را در بدنه ی catch صادر (throw) می کنیم.