به نام خدای مهربانی ها
سخن مدرس:
با عرض سلام و ادب خدمت مخاطبان ارزشمند سایت آموزشی جاوا پرو،بنده رحمان زارعی هستم ،قصد داریم در این مقاله آموزشی رایگان جاوا به خطاها و اشتباهات متداولی که هر برنامه نویس جاوا هنگام کد زدن و برنامه نویسی براش پیش میاد را بررسی کنیم.
دوست عزیز! توجه داشته باش که اشتباه کردن اینطور که میگن هم اصلا بد نیست! خطاکردن برای هر فردی که میخواد روز به روز بهتر بشه و تجربه اش بیشتر و بیشتر بشه خیلی خووووبه! چرا؟ چون درک شما رو نسبت به مشکلات و چالش های برنامه نویسی بالا میبرد و همچنین در بهبود مهارت های برنامه نویسی شما را بهتر و بهترتر میکند!
از اشتباه کردن نترسید حالا در هر زمینه ای از زندگی که میخواد باشه و مهم اینه که شما از اشتباهات خود درس بگیرید و رفیق اینو از من داشته باش! که هر چقدر اشتباهات بیشتری انجام بدی ،درس های بیشتری نسبت به اونایی که اشتباه نمیکنند یاد میگیری و در نهایت به یک فرد باتجربه و باخردتر در حوزه کار تخصصی خود خواهی شد.
صرف نظر از این که چقدر در زمینه جاوا حرفه ای هستی محال است که یکی از اشتباهاتی که جلوتر به آنها خواهیم پرداخت رو در هنگام یادگیری جاوا انجام نداده باشی :-)
اشتباه اول:
1.Accessing non-static members from static methods (mostly from the main method)
• صدا زدن یک عضو غیراستاتیک در یک متد استاتیک که متداول ترین ان صدا زدن متغیر نمونه غیر استاتیک یا یک متد غیراستایک کلاس در متد استاتیک main است:
مثال: به قطعه کد زیر توجه کنید:
package www.javapro.ir; public class Test1 { public int number; // instance variable public static void main(String[] args) { System.out.println(number); // compile error }
|
خروجی: خطای کامپایل داده میشود.
توضیحات:
number = 10; // compile error System.out.println(number); // compile error |
• دلیل خطای کامپایل این است که متغیر number یک متغیر نمونه کلاس غیر استاتیک است و در متد استاتیک main صدا زده شده است و ما نمیتوانیم یک متغیر یا متد غیر استاتیک را در یک متد استاتیک صدا بزنیم.
• برای صدا زدن عضو غیر استاتیک number در متد استاتیک main باید از کلاسمون شی ایجاد کنیم و با شی ایجاد شده متغیر number که غیر استاتیک است را صدا بزنیم:
package www.javapro.ir; public class Test1 { public int number; // instance variable public static void main(String[] args) { } |
خروجی: برنامه صحیح و بدون خطای کامپایل است.
10 |
• راه حل دیگر این است که متغیر یا متد کلاسمون را از نوع استاتیک تعریف کنیم و از آن در متدهای استاتیک خود نظیر متد main استفاده کنیم،البته همه این دو روش بستگی به هدف شما در ساخت برنامه مورد نظرتون دارد:
package www.javapro.ir; public class Test1 { public static int number; // static variable public static void main(String[] args) { } |
خروجی: برنامه صحیح و بدون خطای کامپایل است.
package www.javapro.ir; public class Test1 { // instance method: public static void main(String[] args) { int a = 399; int c = sum(a, b); // compile error System.out.println(c); } |
• در این قطعه کد بالا یک متغیر استاتیک با نام number در بدنه کلاس تعریف کرده و ان را در بدنه متد استاتیک main صدا زده ایم.
خب تا اینجا برای صدا زدن متغیر نمونه غیر استاتیک یک کلاس در یک متد استاتیک و خطای کامپایل پیش آمده و رفع خطای آن بایکدیگر گفتگو کردیم.حالا قصد داریم این مسئله رو برای استفاده از متدهای غیراستاتیک در متدهای استاتیک یک کلاس بررسی کنیم:
مثال: به قطعه کد زیر توجه کنید:
package www.javapro.ir; public class Test1 { // instance method: public static void main(String[] args) { int a = 399; int c = sum(a, b); // compile error System.out.println(c); } |
خروجی: خطای کامپایل میدهید و اگر برنامه را run کنیم با خطای زیر روبرو میشویم:
Exception in thread "main" java.lang.Error: Unresolved compilation problem: at www.javapro.ir.Test1.main(Test1.java:16) |
توضیحات:
• در کد بالا متد sum در بدنه کلاس Test1 غیراستاتیک تعریف شده است و آن را در بدنه متد استاتیک main صدا زده ایم،همان طور که گفتیم یک عضو غیر استاتیک کلاس را نمیتوانیم در یک متد استاتیک صدا بزنیم و از آن استفاده کنیم،به همین علت برنامه خطای کامپایل داده است.
• برای رفع خطای کامپایل رخ داده در برنامه بالا به صورت زیر عمل میکنیم:
package www.javapro.ir; public class Test1 { // instance method: public static void main(String[] args) { int a = 399; System.out.println(c); } |
خروجی:
655 |
توضیحات:
• به دلیل این که متد sum غیر استایک است برای صدا زدن آن در متد استاتیک main ابتدا از کلاس Test1 شی ساخته و از طریق شی ایجاد شده متد sum را صدا زده ایم.
• شیوه دیگر استفاده متد sum در متد استاتیک main این است که متد sum را از نوع استاتیک تعریف کنیم:
package www.javapro.ir; public class Test1 { // static method: public static void main(String[] args) { int a = 399; int c = sum(a, b); System.out.println(c); } |
خروجی:
655 |
توضیحات:
• به دلیل این که متد sum استاتیک است میتوانیم بدون شی ساختن از کلاس Test1 آن را در متد استاتیک main صدا بزنیم.
خب ما اینجا تمامی مثال هامون پیرامون متد استاتیک main کلاسمون بود در حالی که صدا زدن عضو غیر استاتیک در هر متد استاتیکی خطای کامپایل میده به مثال زیر توجه کنید:
package www.javapro.ir; public class Test1 { int a = 50; // instance variable // static method: printSum(); public void printSum() {// instance method: public static void main(String[] args) { } } |
خروجی: خطای کامپایل میدهد، چرا؟ به دلیل این که متغیرهای a وb و متد printSum و که غیراستاتیک هستند در متد استاتیک get صدا زده شده اند. دو راه حل برای برطرف کردن خطای کامپایل بالا موجود است:
راه اول: متغیرهای a و b و متد printSum و به تبع آن متغیر sum را را از نوع استاتیک تعریف کنیم،چرا متغیر sum را باید استاتیک تعریف کنیم؟ زیرا قرار است متد printSum را استاتیک تعریف کنیم و از جهتی قرار است متغیر sum درون متد printSum صدا بزنیم پس باید sum را از نوع استاتیک تعریفش کنیم.برای درک بهتر برا خودتون تمرین کنید مثلا متد printSum را استاتیک کنید و متغیر sum را درونش صدا بزنید و همین طور برا خودتون آزمون و خطا کنید که یادبگیرید دلیلش چیه 😊
package www.javapro.ir; public class Test1 { static int a = 50; public static void get(int c, int d) { printSum(); public static void printSum() { public static void main(String[] args) { } } |
خروجی:
180 |
راه حل دوم: با ایجاد شی از کلاس Test1، متغیرهای غیراستاتیک a و b و متد غیراستاتیک printSum را در درون متد استاتیک get صدا میزنیم.
package www.javapro.ir; public class Test1 { int a = 50; // instance variable // static method: t.printSum(); public void printSum() {// instance method: public static void main(String[] args) { } } |
خروجی:
180 |
هر چند که امروزه این اشتباه توسط IDE های امروزی تشخیص داده میشود و به برنامه نویس هشدار میدهد اما خب یکی از اشتباهات متداول و زیادی بود که توسط برنامه نویسان جاوا ممکنه است رخ دهد.
قصد داریم در سلسله آموزش هایی نکات کاربردی،خطاها و اشتباهات یا به زبان ساده گیرهایی که ممکنه در هنگام کدزدن به زبان جاوا براتون پیش بیاد را بررسی کنیم،پس با ما همراه باشید و به سایت جاواپرو سربزنید.
نظرات شما بسیار برای ما مهم است ،لطفا در نظرتون رو در مورد این آموزش جاوا برای ما ارسال کنید.
دوست من آرزوی سعادت و کامیابی رو برات دارم،خدانگهدار
این جلسه آموزشی را میتوانید بصورت کتاب الکترونیکی (PDF شده) در لینک زیر دریافت کنید.
این جلسه آموزشی را بصورت کامل و مرتب شده در لینک زیر دانلود کنید:(در صورت خرابی لینک گزارش دهید)
نشر این مطلب با ذکر منبع (لینک سایت) بلامانع است.
برای با خبر شدن از جدیدترین مطالب آموزشی جاوا عضو کانال تلگرام ما شوید.
بستن *نام و نام خانوادگی * پست الکترونیک * متن پیام |
دوره های آموزشی برنامه نویسی
انجام پروژه های برنامه نویسی
تدریس خصوصی برنامه نویسی
بیش از 7 سال از فعالیت جاواپرو میگذرد
جاواپرو دارای مجوز نشر دیجیتال از وزارت فرهنگ و ارشاد اسلامی است
جهت ارتباط مستقیم با جاواپرو در واتساپ و تلگرام :
09301904690
بستن دیگر باز نشو! |