NullPointerException
рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛
Optional
рд╡рд░реНрдЧ рдкреЗрд╢ рдХрд░рддрд╛ рд╣реИред
рдХрдИ рдФрд░ рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ
NullPointerException
рд╕рд╛рде рдорд┐рд▓реЗ, рдпрд╣ рдмрд╣реБрдд рд╣реА рдЕрдкреНрд░рд┐рдп рдЕрдкрд╡рд╛рдж рдХреЛрдб рдХреЛ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХрд┐рд╕ рдЬрдЧрд╣, рдЖрдкрдХреЗ рдкреВрд░реНрд╡рд╡рд░реНрддрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ (рдФрд░ рд╕рдВрднрд╡рддрдГ рдЖрдк) рдиреЗ
null
рд▓рд┐рдП рдХреБрдЦреНрдпрд╛рдд рдЪреЗрдХ рдирд╣реАрдВ рд▓рдЧрд╛рдпрд╛ рдерд╛ред
рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдХрд┐рд╕реА рд╡рд░реНрдЧ рдХреЗ рдХреБрдЫ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ
null
рд╕реЗ рдордирд╛ рдХрд┐рдпрд╛ рдЬрд╛рдП? рдЬрд╛рд╡рд╛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рд╣рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордирд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди
Optional
рд╕рд╛рде рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рджреГрд╢реНрдп рдмрди рдЬрд╛рддрд╛ рд╣реИред
рддреЛ, рд╣рдо рдЗрд╕ рдирд╡рд╛рдЪрд╛рд░ рдХреА рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг
рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ
Optional
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛:
import java.util.Date; import java.util.Optional; public class Person { private Optional<String> firstName; private Optional<String> secondName; private Optional<Integer> age; private Optional<PersonAddress> address; public Optional<String> getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = Optional.ofNullable(firstName); } public Optional<String> getSecondName() { return secondName; } public void setSecondName(String secondName) { this.secondName = Optional.of(secondName); } public Optional<Integer> getAge() { return age; } public void setAge(Integer age) { this.age = Optional.ofNullable(age); } public Optional<PersonAddress> getAddress() { return address; } public void setAddress(PersonAddress address) { this.address = Optional.of(address); } }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ, "рд╕реЗрдЯ" рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдорд╛рдиреЛрдВ рдХреЗ рд╡рд░реНрдЧ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░рддреЗ рд╕рдордп, рд╣рдо
Optional - of(), ofNullable())
рд╡рд░реНрдЧ
Optional - of(), ofNullable())
рдХреЗ рд╕реНрдерд┐рд░ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ
Optional
рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ; рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдРрд╕реА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ:
/** Optional */ // Optional Optional<Person> optionalPerson = Optional.empty(); //Optional Optional<Person> optionalNonNull = Optional.of(somePerson); //Optional Optional<Person> optionalNullable = Optional.ofNullable(somePerson);
рдирд┐рд░рд░реНрдердХ рдХреЛрдб рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реИрдХрд▓реНрдкрд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рдЕрдХреНрд╕рд░
null
рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░рдирд╛ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рд╕реЗ рдкреНрд░реЗрд╖рд┐рдд рдпрд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрддреА рд╣реИрдВ, рдХреЛрдб рдХреА рдХрдИ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд▓реЗрддреА рд╣реИрдВ рдпрджрд┐ рдЖрдкрдХреЛ рди рдХреЗрд╡рд▓ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╡рд╕реНрддреБ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдмрд▓реНрдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рд╛рде, рдЬрд┐рд╕рдореЗрдВ рдмрджрд▓реЗ рдореЗрдВ рдПрдХ рдФрд░ рдХреНрд╖реЗрддреНрд░ рд╣реЛрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдкрд╛рда рд╡рд┐рд╡рд░рдгред
рдЬрдм рд╣рдо рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реАрдзреЗ рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдмрд╢рд░реНрддреЗ рдХрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдкреНрд░реЗрд╖рд┐рдд рд╡рд╕реНрддреБ
null
рддреЛ рд╣рдореЗрдВ
NullPointerException
рдорд┐рд▓рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╡рд╕реНрддреБ рдХреЛ
null
рд▓рд┐рдП рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рд╣рдореЗрдВ рдЙрд╕ рдкрд╛рда рдХреНрд╖реЗрддреНрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ:
Person person = getDefaultPerson(); if (person != null) { PersonAddress personAddress = person.getAddress(); if (personAddress != null) { PersonAddressStreet street = personAddress.getStreet(); if(street != null) { streetName = street.getStreetName(); } else { streetName = "EMPTY"; } } }
рдФрд░ рдЕрдм рд╕рдм рдХреБрдЫ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди
Optional
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░:
String streetName = person.flatMap(Person::getAddress) .flatMap(PersonAddress::getStreet) .map(PersonAddressStreet::getStreetName) .orElse("EMPTY");
рдПрдХ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд, рдпрд╣ рдирд╣реАрдВ рд╣реИ?
IfPresent () рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдХреНрд░рд┐рдпрд╛рдПрдВ
ifPresent()
рд╡рд┐рдзрд┐ рднреА рдХреЛрдб рдХреЗ рдХреБрдЫ рдЕрддрд┐рд░реЗрдХ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддреА рд╣реИ, рдирд┐рдореНрди рд░реВрдк рдореЗрдВ:
if(person != null) { System.out.println(person); }
рдПрдХ рд╣реА рдХреНрд░рд┐рдпрд╛, рд▓реЗрдХрд┐рди
Optional
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛:
person.ifPresent(System.out::println);
рдПрдХ рд╡рд╕реНрддреБ рдкрд░ рдХреНрд░рд┐рдпрд╛ред рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ () рд╣реИ
isPresent()
рд╣рдореЗрдВ рдХреЛрдб рдЕрддрд┐рд░реЗрдХ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рд▓рд╛рдн рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЛ рдереЛрдбрд╝реА рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рджреЗрддрд╛ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдерд╛:
if(person != null) { System.out.println(person) } else { System.out.println("Person not found!"); }
рд╡рд╣реА, рд▓реЗрдХрд┐рди
Optional
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП:
if (person.isPresent()) { System.out.println(person.get()); } else { System.out.println("Person not found!"); }
OrElse (), orElseThrow () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдХреНрд░рд┐рдпрд╛рдПрдВ
рдФрд░ рдЕрдВрдд рдореЗрдВ, рдХреЛрдб рдореЗрдВ "рд╕реМрдВрджрд░реНрдп" рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдФрд░ рддрд░реАрдХреЗред
рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдерд╛:
Person personNew = person != null ? person : new Person();
рд╡рд╣реА, рд▓реЗрдХрд┐рди
Optional
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП:
Person personNew = person.orElse(new Person());
рдпрд╛, рдпрджрд┐ рдЖрдк рдХреЛрдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рд╕рдХрддреЗ рд╣реИрдВ:
Person personNewThrow = person.orElseThrow(Exception::new);
рдирд┐рд╖реНрдХрд░реНрд╖
рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ
Optional
NullPointerException
рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреА рдХреЛрдИ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдФрд░ рд╕рднреА
null
рдЬрд╛рдВрдЪреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди
Optional
рд╕рд╛рде рдпреЗ рдХреНрд░рд┐рдпрд╛рдПрдВ рддреЗрдЬрд╝ рдФрд░ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реАрдХреЗ рдФрд░ рдЬрд╛рдБрдЪ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЖрдЧреЗ рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд░реНрдгрд┐рдд рд╣реИрдВ рдФрд░ рд╣рдореЗрдВ рдмрд╕ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред
рдФрд░ рдпрд╣ рднреА, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ,
Optional
рдкрдардиреАрдпрддрд╛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдХреЛ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рджреЗрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рдЗрд╕ рдирд╡рд╛рдЪрд╛рд░ рдХрд╛ рдореЗрд░рд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг рд╣реИ, рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдЖрдк рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд▓рд┐рдВрдХ рд╕реЗ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдЧреЗ рдХреЗ рдЕрдзреНрдпрдпрди рдХреЗ рд▓рд┐рдП рдЬрд╛рдирдХрд╛рд░реА:
- рд╡реИрдХрд▓реНрдкрд┐рдХ (рдЬрд╛рд╡рд╛ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдПрд╕рдИ 8) - рдбреЙрдХреНрд╕.рдЖрд░реНрдХ.рдХреЙрдо
- рдЕрд╢рдХреНрдд рд╕реВрдЪрдХ рдЕрдкрд╡рд╛рджреЛрдВ рд╕реЗ рдердХ рдЧрдП? рдЬрд╛рд╡рд╛ рдПрд╕рдИ 8 рдХреЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ!
- рдПрдбреНрд╡рд┐рди рдбреЗрд▓реЛрд░рдЬреЛ рджреНрд╡рд╛рд░рд╛ рдЬрд╛рд╡рд╛ 8 рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд╕реНрддреБрдПрдВ