پرش به محتوای اصلی
مسیر تخصصی جاوا و Spring
درخواست پروژهارتباط با ماراهنما
جاواپرو v1.2.14یاد بگیر، تمرین کن، حرفه‌ای بساز
خانهدوره‌هاآموزش رایگانوبلاگمدرس‌هاخدمات
خانهکلاس Optional در زبان برنامه نویسی جاوا چیست و چرا باید از آن استفاده
وبلاگ »

کلاس Optional در زبان برنامه نویسی جاوا چیست و چرا باید از آن استفاده

کلاس Optional در زبان برنامه نویسی جاوا راهی است برای جلوگیری از خطای NullPointerException. اما چطور؟ با ماه همراه باشید و سطح کد های خود را بالا ببرید.

۴ دقیقه مطالعهوبلاگ »آموزش جاوا و انجام پروژه های برنامه نویسی
کلاس Optional در زبان برنامه نویسی جاوا چیست و چرا باید از آن استفاده
محتوای منتخب جاواپرو

خلاصه مطلب

کلاس Optional در زبان برنامه نویسی جاوا راهی است برای جلوگیری از خطای NullPointerException. اما چطور؟ با ماه همراه باشید و سطح کد های خود را بالا ببرید.
نوع محتوامقاله آموزشی
موضوعوبلاگ »
زمان مطالعه۴ دقیقه
آخرین ویرایش۳۰ اردیبهشت ۱۴۰۴

لیست دوره های آکادمی جاوا پرو

دوره پرتاب | آموزش پیش نیازهای قبل از شروع برنامه نویسیدوره مقدماتی زبان برنامه نویسی جاوادوره جامع شاهکار پیشرفته جاوادوره جامع طلایی Spring Coreدوره آموزش فریمورک Spring Bootدوره پروژه محور Spring Boot - سیستم دانشگاهدوره جامع دژبان Spring securityدوره جامع نخبگان معماری میکروسرویس با Java و Spring Boot

استثناء اشاره گر به تهی (NullPointerException)

این استثناء زمانی رخ میدهد که به متغیری دسترسی پیدا میکنیم که به هیچ آبجکتی اشاره نمیکند . مثلا :

String javaPro=null; if(javaPro.equals("Best")){ System.out.println(true); }

به دلیل اینکه String تعریف شده به هیچ ابجکتی اشاره نمیکند(اصطلاحا new نشده) استثنای nullpointerException روی میدهد.

این استثنا زیر کلاسی از RuntimeException است بنابراین از نوع unchecked exception (استثنای چک نشده) میباشد.

راه حل : استفاده از کلاس Optional

کلاسی است که در جاوا ۸ معرفی شده و هدف ان جلوگیری از استثناء معروف nullpointerexception میباشد(هرچند گویا به طور کامل از چنین خطایی نتوانسته جلوگیری کند)

میتوان گفت بیشتر ابزاری است برای راحت تر چک کردن مقادیر تهی و راحت تر گریختن از خطای nullpointerexception

بیگمان هرکس که با جاوا کد زده باشد با خطای nullpointerexception اشنا میباشد.

فرض کنید کلاسی به نام Person داریم و در ان یک فیلد به نام name و یک Getter برای آن داریم:

public class Person { private String name; public String getName() { return name; }}

حال در کلاس main برنامه ی خود یک متد داریم به این صورت:(فرض کنید این متد بر اساس یکسری عملیات به مقدار null رسیده است..مثلا Person را از دیتابیس خوانده و هیچ مقداری پیدا نکرده است

}()public static Person getPerson return null; }

طبعا هنگامی که در main چنین خط کدی را بنویسیم :

public static void main(String[] args) { getPerson().getName(); }

به خطای nullpointerexception برمیخوریم.

حال راه حل جاوا هشت برای گریز از این خطا چیست؟

ابتدا توضیحاتی اندک ولی کارامد درمورد متد های کلاس Optional میدهیم:

متد های استاتیک کلاس Optional
متد های استاتیک کلاس Optional

کلاس اپشنال از دیزاین پترن Factory استفاده میکند(اجازه ی ساخت شی با کلیدواژه new از ان را نداریم)

Optional.empty();Optional.of(T t);Optional.ofNullable(T value);

متد اول به جای همان مثال بالا که null برگشت دادیم استفاده میشود.

متد دوم یک مقدار میپذیرد با این شرط که تهی نباشد و متد سوم میتواند مقداری تهی نیز بپذیرد.(در صورتی که مقدار تهی باشد یک Optional.empty برمیگرداند )

حال مثال اول را اینگونه بازنویسی میکنیم:

در اغاز بایستی نوع بازگشتی متد را از جنس Optionalتعریف کنیم:

public static Optional getPerson() { return Optional.empty(); }

نکته : در کد بالا شرایط قبلی برقرار است. یعنی مثلا در پایگاه داده ، داده ی مورد نظر پیدا نشده و ما به جای null از کلاس Optional بعنوان نوع برگشتی استفاده میکنیم.

حال در متد main متد getPerson را call میکنیم:

public static void main(String[] args) { Optional op=getPerson(); System.out.println(op); }

خواهیم دید که دیگر خبری از ارور nullpointerexception نیست بلکه چنین چیزی در خروجی مشاهده میکنیم:

Optional.empty

سایر متد های سودمند کلاس Optional

orElse(T t);

اگر مقدار وجود داشت...مقدار T را برگشت میدهد وگرنه مقداری که در ورودی متد داده اید را برگشت میدهد(دیگر مقدار null درکار نخواهد بود)

مثال :

public class Main { public static void main(String[] args) { Student student = Optional.ofNullable(getStudentWithName("hamza")).orElse(new Student("no one", 0, "Unknown")); System.out.println(student.getName()); } public static Student getStudentWithName(String name ){ // lets suppose that our database contain only 2 students ahmed and hamza . if (name.equals("hamza") || name.equals("ahmed")) { return new Student(name , 22 , "Morocco"); } else { return null ; } } }

ممکن است اگر مقداری وجود نداشت بخواهید استثنایی به راه بیاندازید :

orElseThrow(T t)

متدی است که برای ایجاد یک استثنا در صورت خالی بودن Optional کاربرد دارد. برخلاف orElse که یک مقدار پیش‌فرض را برمی‌گرداند، orElseThrow به شما اجازه می‌دهد یک استثناء ایجاد کنید.

مثال :

public class Main { public static void main(String[] args) throws StudentNotFoundException { Student student = Optional.ofNullable(getStudentWithName("fs")).orElseThrow(()-> new StudentNotFoundException("the Student is not Present ")); System.out.println(student.getName()); } public static Student getStudentWithName(String name ){ // lets suppose that our database contain only 2 students ahmed and hamza . if (name.equals("hamza") || name.equals("ahmed")) { return new Student(name , 22 , "Morocco"); } else { return null ; } } }

متد دیگری که بسیار مهم است ( زمانی که بخواهیم قبل از دریافت مقدار درون Optional چک کنیم که دقیقا میداری دارد یا خیر)

isPresent();

گر مقداری داخل اپشنال بود true برگشت میدهد اگر نبود false

get();

اگر مقدار وجود داشت برگشت میدهد و اگر نبود nosuchelementexception برگشت میدهد(و بازهم خبری از ارور null نیست)

ifPresent(Consumer

اگر مقدار وجود داشت عملیات مورد نظرمان انجام شود

ifPresentOrElse(Consumer

اگر مقدار وجود داشت عملیات مورد نظر انجام شود و اگر تهی بود متد run از اینترفیس Runnable صدا زده میشود

و بسیار متد های سودمند دیگر توجه داشته باشید Runnable در بالا ربطی به ترد ندارد و صرفا بخاطر متد run از ان استفاده شده است

چه زمانی از Optional استفاده نکنیم؟

مثال :

private String firstName; public Optional getFirstName() { return Optional.ofNullable(firstName); } public void setFirstName(String firstName) { this.firstName = firstName; }

در چنین شرایطی اگر خروجی جیسون داشته باشید مشاهده خواهید کرد:

{"firstName":{"present":true}}

درحالی که باید مثلا چنین خروجی مشاهده میکردید:

{"firstName":"JavaPro"}

یکی از کاربرد های خیلی خوب کلاس Optional در Spring data jpa میباشد . زمانی که یک Repository دارید میتوانید بعنوان Return type از کلاس Optional استفاده کنید(مزیت های خیلی زیادی دارد) . مثال :

package com.javapro;import org.springframework.lang.Nullable; @Repositoryinterface UserRepository extends JpaRepository { User getByEmailAddress(EmailAddress emailAddress); Optional findOptionalByEmailAddress(EmailAddress emailAddress); // Best approach}

با تشکر از خانم ساناز اردشیری جهت تایپ نمودن محتوا.

منابع:

Oracle.com

baeldung.com

javaland

docs.spring.io

geeksforgeeks

متد های کلاس Optional
متد های کلاس Optional
برچسب‌هاوبلاگ »مقالات جاوا »کلاس Optionalاستثنای NullpointerExceptionخطای NullPointerExceptionویژگی های جاوا 8استثنای NoSuchElementExceptionکاربرد Optional در SpringOptional درجاوابرنامه نویسی جاواجاوااستثنا در جاواآموزش پروژه محور جاواآموزش جاوا
ادامه مسیر

پیشنهاد جاواپرو

موضوع را با آموزش‌های مرتبط ادامه دهید و نکته‌های کاربردی را در مسیر خود نگه دارید

مشاهده دوره‌ها
مطالب پیشنهادی

ادامه مطالعه

xدسته‌بندی نشده
۱۱ دی ۱۳۹۸ مطالعه کوتاه

x

پادکست شماره 3 – راه های کسب درآمد از برنامه نویسی

مطالعه مطلب
پادکست شماره 3 - راه های کسب درآمد از برنامه نویسیپادکست
۲۹ اردیبهشت ۱۴۰۴ مطالعه کوتاه

پادکست شماره 3 - راه های کسب درآمد از برنامه نویسی

در این پادکست برنامه نویسی به شیوه ها و راه های کسب درآمد از برنامه نویسی پرداخته ایم. یک کاغذ و قلم بردارید و به پادکست گوش بدید.

مطالعه مطلب
پادکست شماره 2 - چگونه وارد فضای برنامه نویسی شویم؟پادکست
۲۹ اردیبهشت ۱۴۰۴ مطالعه کوتاه

پادکست شماره 2 - چگونه وارد فضای برنامه نویسی شویم؟

در این پادکست برنامه نویسی یاد میگیریم که چگونه وارد فضای برنامه نویسی شویم و تخصص برنامه نویسی را به دست آوریم.

مطالعه مطلب
جاواپرومرجع تخصصی یادگیری و توسعهٔ جاوا

تجربه‌ای منظم، ساده و حرفه‌ای برای یادگیری عمیق جاوا، Spring و مهندسی نرم‌افزار؛ قابل استفاده در موبایل، تبلت و دسکتاپ

یادگیری

همه دوره‌هاآموزش رایگانمسیر یادگیریمدرس‌ها

جاواپرو

درباره ماخدمات تخصصیدرخواست پروژهبلاگ فنی

پشتیبانی

تماس با ماپرسش‌های متداولقوانین و حریم خصوصیبروزرسانی‌های جاواپروثبت تیکت
خرید امنپرداخت فقط در درگاه رسمیپشتیبانی آموزشیمسیر ارتباط شفاف و پیگیری‌پذیردسترسی پایداروب‌اپ واکنش‌گرا روی همه دستگاه‌ها
© ۱۴۰۵ جاواپرو؛ همه حقوق محفوظ استتوسعه توسط پایاپینگ
خانهدوره‌هاسبد