Вікіпідручник ukwikibooks https://uk.wikibooks.org/wiki/%D0%93%D0%BE%D0%BB%D0%BE%D0%B2%D0%BD%D0%B0_%D1%81%D1%82%D0%BE%D1%80%D1%96%D0%BD%D0%BA%D0%B0 MediaWiki 1.47.0-wmf.14 first-letter Медіа Спеціальна Обговорення Користувач Обговорення користувача Вікіпідручник Обговорення Вікіпідручника Файл Обговорення файлу MediaWiki Обговорення MediaWiki Шаблон Обговорення шаблону Довідка Обговорення довідки Категорія Обговорення категорії Полиця Обговорення полиці Рецепт Обговорення рецепта Субтитри Обговорення субтитрів Модуль Обговорення модуля Подія Обговорення події Освоюємо Kotlin/Основи 0 8361 41357 39692 2026-08-07T15:57:43Z Володимир Груша 985 /* null безпечність */ 41357 wikitext text/x-wiki {{Nav|Освоюємо Kotlin|Основи|programming|nocat=1}} ==Серодовища розробки (IDE)== Для програмування на Kotlin вам необхідне інтегроване середовище розробки (IDE). Офіційним середовищем є IntelliJ IDEA. Його можна звантажити з офіційного сайту jetbraints [https://www.jetbrains.com/idea/ тут]. При виборі версій, вибираєм IntelliJ IDEA Community Edition - воно безкоштовне. Другий спосіб опробувати прості програми - використати віртуальний емулятор на офіційному сайті (для початку згодиться). Його можна опробувати [https://play.kotlinlang.org/ тут] Можна також скористуватися іншими компіляторами, наприклад, IDE Eclipse з відповідним плагіном. ==Змінні== ===Оголошення змінних=== Оголошення змінних відбувається з вказанням ключового слова var або val після чого йде назва змінної. Тип змінної можна не вказувати, тоді компілятор сам спробує визначити її тип за тим, що ви присвоюєте змінній. Змінні з ключовим словом val називають незмінюватими (immutable) або лише для читання (read-only). <syntaxhighlight lang="kotlin" line start="1"> var x=5 //оголошення цілочисельної змінної val y=5 //оголошення val змінної var num: Int // оголошення цілочисельної змінної з прямим вказанням типу var isVar= true // створення змінної типу Boolean var hugeNumber = 6L //створення змінної типу Long var letter='D' //змінна типу Char var name="Tom" // змінна типу String var x=3.14 // змінна типу Double </syntaxhighlight> Можна при оголошенні змінної зразу вказати її тип: <syntaxhighlight lang="kotlin" line start="1"> var name:String="Tom" // змінна типу String var hugeNumber2: Long =6 // змінна типу Long </syntaxhighlight> Але переважно компілятор сам визначає тип змінної, по типу значення, яке присвоюється. Проте існують випадки, коли це необхідно. Наприклад, при вказанні параметрів функції і т.п. ===Типи змінних=== Цілочисельні типи представлені типами Byte, Short, Int та Long. {| class="wikitable" style="text-align:left" ! Тип ! Біт ! Діапазон значень |- | Byte | 8 біт | -128 до 127 |- | Short | 16 біт | –32768 до 32767 |- | Int | 32 біт | –2147483648 до 2147483647 |- | Long | 64 біт | -9 223 372 036 854 775 808 (<math>-2^{63}</math>) до 9 223 372 036 854 775 807 (<math>2^{63}</math> - 1) |} Дробові числа представлені типами <code>Float</code> (32 біта) та типом <code>Double</code> (64 біта). Для представлення символів використовується тип Char. <syntaxhighlight lang="kotlin" line start="1"> var letter='D' // символи вводяться в одинарних лапках </syntaxhighlight> Для представлення рядків використовується тип String. <syntaxhighlight lang="kotlin" line start="1"> var name ="John" </syntaxhighlight> Зверніть увагу, що для присвоєння символу використовуються одинарні лапки. Подвійні лапки означають, що змінна буде типу String. Як і в іших мовах для використання спеціальних символів використовується \ (backslash). <syntaxhighlight lang="kotlin" line start="1"> var apostrophe= '\'' //використовуємо одинарну лапку/апостроф var myString="Ви ввели\n символ $apostrophe" // використовуємо символ нового рядка \n println (myString) </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Ви ввели символ ' </pre>}} Можна ввести рядок символів, який відображатиметься без змін як він введений, використовуючи потрійні лапки на початку тексту і в кінці: <syntaxhighlight lang="kotlin" line start="1"> var myString=""" Ви ввели\n поможіть бо я заплутався """ println (myString) </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Ви ввели\n поможіть бо я заплутався </pre>}} Boolean змінні застосовуються для значень true або false. <syntaxhighlight lang="kotlin" line start="1"> var isMan = true </syntaxhighlight> Також існують безнакові змінні (unsigned) цих же типів, що відповідно можуть вміщати вдвічі більші додатні числа у себе (UBite, UShort, UInt, ULong): <syntaxhighlight lang="kotlin" line start="1"> var x:UInt=5u; </syntaxhighlight> Коли в змінну необхідно записати велике число, то можна використовувати символ _ між цифрами, для кращого візуального представлення числа: <syntaxhighlight lang="kotlin" line start="1"> var x:Int=5_500_000 // ніякої помилки, все правильно </syntaxhighlight> ===Перетворення типів=== Для перетворення одного типу в інший використовуються відповідні функції, наприклад toLong(), що викликаються на відповідному об'єкті (змінній). <syntaxhighlight lang="kotlin" line start="1"> var k=65 // створиться змінна типу Int var l:Long = k.toLong() //до типу Long </syntaxhighlight> ==Коментарі== У Kotlin є три види коментарів: <syntaxhighlight lang="kotlin" line start="1"> //однорядковий коментар //новий коментар /* багаторядковий коментар */ /** * KDoc коментар * для документування функцій * та класів */ </syntaxhighlight> Тобто однорядкові коментарі починаються з двох косих рисок <code>//</code>. Багаторядкові вміщуються в символи <code>/* та */</code>. Все, що в цих символах, компілятор не сприймає як код. Останній вид коментарів застосовується для документування функцій та класів. Так, наприклад, якщо спереді функції є такий коментар, то при наведенні в місці використання на назву функції, компілятор видасть підказку з даним текстом. Всередині може спеціальним чином використовуватися опис параметрів функції: <syntaxhighlight lang="kotlin" line start="1"> /** * Ця функція обчислює суму двох цілих чисел. * @param a Перше ціле число. * @param b Друге ціле число. * @return Сума a та b. */ fun addNumbers(a: Int, b: Int): Int { return a + b } </syntaxhighlight> Детальніші про функції далі, у відповідному підрозділі. ==Привіт Світе!== Проста програма складається мінімум із одної функції main, що схоже на С/С++ чи java. <syntaxhighlight lang="kotlin" line start="1"> fun main(args: Array<String>){ // вказання аргументів функції необов'язкове val message="Привіт, Світе!" println (message) // якщо виводимо лише значення змінної pintln ("Ми говоримо: $message") //якщо вставляємо змінну в рядок println("Ми говоримо знову: "+message) // можна й так } </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Привіт, Світе! Ми говоримо: Привіт, Світе! Ми говоримо знову: Привіт, Світе! </pre>}} Зверніть увагу, що для вставляння змінної в рядок використовується знак <code>$</code> ==Читання з консолі== Ви можете прочитати з консолі введений користувачем текст або числа використовуючи функцію readln(): <syntaxhighlight lang="kotlin" line start="1"> println ("Введіть своє ім'я:") val name=readln() // читаємо ім'я (тип String) println ("Скільки вам років:") val age=readln().toInt() // читаємо і конвертуємо введений текст (String) у число (Int) println("Привіт $name ($age)") </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Введіть своє ім'я: Володимир Скільки вам років: 18 Привіт Володимир (18) </pre>}} ==Конкатенація== Оператор + може використовуватись як для додавання так і для конкатенації (з'єднання) тексту, але тут є деякі особливості: <syntaxhighlight lang="kotlin" line start="1"> println("Hello"+" Igor") // так працює, виведе два слова println((2+5)+" hello")// не працює, помилка, бо пробує до Int додати текстовий рядок </syntaxhighlight> Якщо хочемо, щоб нам зробило додаавання і з'єднало з текстовим рядком, то це можна зробити двома способами. Перший переставити місцями текст і математичний вираз: <syntaxhighlight lang="kotlin" line start="1"> println("hello "+(2+5)) // виведе: hello 7 </syntaxhighlight> Другий спосіб - поставити на початку порожній текстовий рядок: <syntaxhighlight lang="kotlin" line start="1"> println(""+(2+5)+" hello")// виведе: 7 hello </syntaxhighlight> Конкатенацію можна використовувати не тільки у функції println(): <syntaxhighlight lang="kotlin" line start="1"> val text:String=""+(5+4)+" Hello" //так теж можна </syntaxhighlight> ==Константи на рівні компіляції== Перед ключовим словом <code>val</code> можна використати ключове слово <code>const</code>. В такому разі значення константи буде підставлятися в код під час компіляції: <syntaxhighlight lang="kotlin" line start="1"> const val MY_CONST=55 fun main(){ println (MY_CONST) } </syntaxhighlight> Такі константи прийнято писати великими буквами та з використанням символів підкреслення. Вони повинні бути оголошені на початку модуля поза межами інших блоків (як то функції чи класи). Винятками є оголошення таких констант в середені спеціальних конструкцій як то object та companion object. Значення, що присвоюється має бути базового типу, як то String, Int і т.п. [[Категорія:Освоюємо Kotlin]] ==null безпечність== В Kotlin на відміну від Java не можна так просто присвоїти значення null (що означає пусто, нічого). Ви повинні передбачити, що змінна може прийняти null використавши оператор <code>?</code>: <syntaxhighlight lang="kotlin" line start="1"> val name: String? = null </syntaxhighlight> Позначивши змінну таким чином, подальші помилки на совісті програміста, що застосовуватиме змінну і в подальшому треба використовувати спеціальні оператори. Так щоб отримати довжину рядка такої змінної ми повинні використати оператор <code>!!</code>: {{XWarning|1=<span style="color: red;">'''Небезпечний код'''</span> <syntaxhighlight lang="kotlin" line start="1"> val name: String? = null println(name.length) // так не можна, помилка компіляції println (name!!.length) //так можна, але можливе аварійне завершення при виконанні </syntaxhighlight>}} Використавши два знаки оклику ми усуваємо помилку при компіляції, але можемо отримати помилку ([[Освоюємо Kotlin/Винятки|виняток]]) при виконанні програми, коли змінна буде рівна null, оскільки програма не зможе отримати довжину неіснуючого рядка. Найкращим виходом з даної ситуації є перевірка змінної на null і якщо null, то присвоїти змінній якесь інше значення. Це можна зробити використавши умову if (див. розділ "[[Освоюємо Kotlin/Умовні конструкції|Умовні конструкції]]"), або оператор <code>?:</code> (так званий елвіс оператор): <syntaxhighlight lang="kotlin" line start="1"> val name: String? = null // 'name' є nullable String val displayName: String = name ?: "Гість" // якщо 'name' рівна null, присвоюємо змінній значення "Гість" println(displayName) //вивід: Гість val nameNotNull: String? = "Іван" val displayNameNotNull: String = nameNotNull ?: "Гість" println(displayNameNotNull) // Вивід: Іван </syntaxhighlight> Приклад, коли можна отримати null, це наприклад ввід з клавіатури. Якщо ми будемо читати число так <code> val number=readln().toInt()</code>, то користувач може ввести замість числа букви, тоді перетворення до типу Int введеного тексту закінчиться аварійною ситуацією ([[Освоюємо Kotlin/Винятки|винятком]]). Ми можемо використати функцію <code>toIntOrNull()</code>, тоді якщо перетворення до типу Int буде невдале, то функція поверне null. І вже тоді можна здійснити перевірку на null і зробити певні дії: <syntaxhighlight lang="kotlin" line start="1"> fun main(){ println("Введіть ціле число:") val number:Int?=readln().toIntOrNull() if (number==null) //якщо число рівне null, то вивід "Ви ввели: не число" println("Ви ввели: не число") else // в іншому випадку виводимо наше число println("Ви ввели: $number") } </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Введіть ціле число: фіав Ви ввели: не число </pre>}} Елвіс оператор може бути більш функціональним. Так, якщо необхідно виконати якийсь код при null значенні, можна написати так: <syntaxhighlight lang="kotlin" line start="1" highlite="2-5"> val nameNotNull: String? = "Іван" val displayNameNotNull: String = nameNotNull ?: run{ println("Неправильний логін") "Гість" } println("Логін:"+displayNameNotNull) // Вивід: Іван </syntaxhighlight> {{Nav}} m7prlmj6velmf7vdrhgh8yh0hkg75w8 41358 41357 2026-08-07T15:59:25Z Володимир Груша 985 /* null безпечність */ 41358 wikitext text/x-wiki {{Nav|Освоюємо Kotlin|Основи|programming|nocat=1}} ==Серодовища розробки (IDE)== Для програмування на Kotlin вам необхідне інтегроване середовище розробки (IDE). Офіційним середовищем є IntelliJ IDEA. Його можна звантажити з офіційного сайту jetbraints [https://www.jetbrains.com/idea/ тут]. При виборі версій, вибираєм IntelliJ IDEA Community Edition - воно безкоштовне. Другий спосіб опробувати прості програми - використати віртуальний емулятор на офіційному сайті (для початку згодиться). Його можна опробувати [https://play.kotlinlang.org/ тут] Можна також скористуватися іншими компіляторами, наприклад, IDE Eclipse з відповідним плагіном. ==Змінні== ===Оголошення змінних=== Оголошення змінних відбувається з вказанням ключового слова var або val після чого йде назва змінної. Тип змінної можна не вказувати, тоді компілятор сам спробує визначити її тип за тим, що ви присвоюєте змінній. Змінні з ключовим словом val називають незмінюватими (immutable) або лише для читання (read-only). <syntaxhighlight lang="kotlin" line start="1"> var x=5 //оголошення цілочисельної змінної val y=5 //оголошення val змінної var num: Int // оголошення цілочисельної змінної з прямим вказанням типу var isVar= true // створення змінної типу Boolean var hugeNumber = 6L //створення змінної типу Long var letter='D' //змінна типу Char var name="Tom" // змінна типу String var x=3.14 // змінна типу Double </syntaxhighlight> Можна при оголошенні змінної зразу вказати її тип: <syntaxhighlight lang="kotlin" line start="1"> var name:String="Tom" // змінна типу String var hugeNumber2: Long =6 // змінна типу Long </syntaxhighlight> Але переважно компілятор сам визначає тип змінної, по типу значення, яке присвоюється. Проте існують випадки, коли це необхідно. Наприклад, при вказанні параметрів функції і т.п. ===Типи змінних=== Цілочисельні типи представлені типами Byte, Short, Int та Long. {| class="wikitable" style="text-align:left" ! Тип ! Біт ! Діапазон значень |- | Byte | 8 біт | -128 до 127 |- | Short | 16 біт | –32768 до 32767 |- | Int | 32 біт | –2147483648 до 2147483647 |- | Long | 64 біт | -9 223 372 036 854 775 808 (<math>-2^{63}</math>) до 9 223 372 036 854 775 807 (<math>2^{63}</math> - 1) |} Дробові числа представлені типами <code>Float</code> (32 біта) та типом <code>Double</code> (64 біта). Для представлення символів використовується тип Char. <syntaxhighlight lang="kotlin" line start="1"> var letter='D' // символи вводяться в одинарних лапках </syntaxhighlight> Для представлення рядків використовується тип String. <syntaxhighlight lang="kotlin" line start="1"> var name ="John" </syntaxhighlight> Зверніть увагу, що для присвоєння символу використовуються одинарні лапки. Подвійні лапки означають, що змінна буде типу String. Як і в іших мовах для використання спеціальних символів використовується \ (backslash). <syntaxhighlight lang="kotlin" line start="1"> var apostrophe= '\'' //використовуємо одинарну лапку/апостроф var myString="Ви ввели\n символ $apostrophe" // використовуємо символ нового рядка \n println (myString) </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Ви ввели символ ' </pre>}} Можна ввести рядок символів, який відображатиметься без змін як він введений, використовуючи потрійні лапки на початку тексту і в кінці: <syntaxhighlight lang="kotlin" line start="1"> var myString=""" Ви ввели\n поможіть бо я заплутався """ println (myString) </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Ви ввели\n поможіть бо я заплутався </pre>}} Boolean змінні застосовуються для значень true або false. <syntaxhighlight lang="kotlin" line start="1"> var isMan = true </syntaxhighlight> Також існують безнакові змінні (unsigned) цих же типів, що відповідно можуть вміщати вдвічі більші додатні числа у себе (UBite, UShort, UInt, ULong): <syntaxhighlight lang="kotlin" line start="1"> var x:UInt=5u; </syntaxhighlight> Коли в змінну необхідно записати велике число, то можна використовувати символ _ між цифрами, для кращого візуального представлення числа: <syntaxhighlight lang="kotlin" line start="1"> var x:Int=5_500_000 // ніякої помилки, все правильно </syntaxhighlight> ===Перетворення типів=== Для перетворення одного типу в інший використовуються відповідні функції, наприклад toLong(), що викликаються на відповідному об'єкті (змінній). <syntaxhighlight lang="kotlin" line start="1"> var k=65 // створиться змінна типу Int var l:Long = k.toLong() //до типу Long </syntaxhighlight> ==Коментарі== У Kotlin є три види коментарів: <syntaxhighlight lang="kotlin" line start="1"> //однорядковий коментар //новий коментар /* багаторядковий коментар */ /** * KDoc коментар * для документування функцій * та класів */ </syntaxhighlight> Тобто однорядкові коментарі починаються з двох косих рисок <code>//</code>. Багаторядкові вміщуються в символи <code>/* та */</code>. Все, що в цих символах, компілятор не сприймає як код. Останній вид коментарів застосовується для документування функцій та класів. Так, наприклад, якщо спереді функції є такий коментар, то при наведенні в місці використання на назву функції, компілятор видасть підказку з даним текстом. Всередині може спеціальним чином використовуватися опис параметрів функції: <syntaxhighlight lang="kotlin" line start="1"> /** * Ця функція обчислює суму двох цілих чисел. * @param a Перше ціле число. * @param b Друге ціле число. * @return Сума a та b. */ fun addNumbers(a: Int, b: Int): Int { return a + b } </syntaxhighlight> Детальніші про функції далі, у відповідному підрозділі. ==Привіт Світе!== Проста програма складається мінімум із одної функції main, що схоже на С/С++ чи java. <syntaxhighlight lang="kotlin" line start="1"> fun main(args: Array<String>){ // вказання аргументів функції необов'язкове val message="Привіт, Світе!" println (message) // якщо виводимо лише значення змінної pintln ("Ми говоримо: $message") //якщо вставляємо змінну в рядок println("Ми говоримо знову: "+message) // можна й так } </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Привіт, Світе! Ми говоримо: Привіт, Світе! Ми говоримо знову: Привіт, Світе! </pre>}} Зверніть увагу, що для вставляння змінної в рядок використовується знак <code>$</code> ==Читання з консолі== Ви можете прочитати з консолі введений користувачем текст або числа використовуючи функцію readln(): <syntaxhighlight lang="kotlin" line start="1"> println ("Введіть своє ім'я:") val name=readln() // читаємо ім'я (тип String) println ("Скільки вам років:") val age=readln().toInt() // читаємо і конвертуємо введений текст (String) у число (Int) println("Привіт $name ($age)") </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Введіть своє ім'я: Володимир Скільки вам років: 18 Привіт Володимир (18) </pre>}} ==Конкатенація== Оператор + може використовуватись як для додавання так і для конкатенації (з'єднання) тексту, але тут є деякі особливості: <syntaxhighlight lang="kotlin" line start="1"> println("Hello"+" Igor") // так працює, виведе два слова println((2+5)+" hello")// не працює, помилка, бо пробує до Int додати текстовий рядок </syntaxhighlight> Якщо хочемо, щоб нам зробило додаавання і з'єднало з текстовим рядком, то це можна зробити двома способами. Перший переставити місцями текст і математичний вираз: <syntaxhighlight lang="kotlin" line start="1"> println("hello "+(2+5)) // виведе: hello 7 </syntaxhighlight> Другий спосіб - поставити на початку порожній текстовий рядок: <syntaxhighlight lang="kotlin" line start="1"> println(""+(2+5)+" hello")// виведе: 7 hello </syntaxhighlight> Конкатенацію можна використовувати не тільки у функції println(): <syntaxhighlight lang="kotlin" line start="1"> val text:String=""+(5+4)+" Hello" //так теж можна </syntaxhighlight> ==Константи на рівні компіляції== Перед ключовим словом <code>val</code> можна використати ключове слово <code>const</code>. В такому разі значення константи буде підставлятися в код під час компіляції: <syntaxhighlight lang="kotlin" line start="1"> const val MY_CONST=55 fun main(){ println (MY_CONST) } </syntaxhighlight> Такі константи прийнято писати великими буквами та з використанням символів підкреслення. Вони повинні бути оголошені на початку модуля поза межами інших блоків (як то функції чи класи). Винятками є оголошення таких констант в середені спеціальних конструкцій як то object та companion object. Значення, що присвоюється має бути базового типу, як то String, Int і т.п. [[Категорія:Освоюємо Kotlin]] ==null безпечність== В Kotlin на відміну від Java не можна так просто присвоїти значення null (що означає пусто, нічого). Ви повинні передбачити, що змінна може прийняти null використавши оператор <code>?</code>: <syntaxhighlight lang="kotlin" line start="1"> val name: String? = null </syntaxhighlight> Позначивши змінну таким чином, подальші помилки на совісті програміста, що застосовуватиме змінну і в подальшому треба використовувати спеціальні оператори. Так щоб отримати довжину рядка такої змінної ми повинні використати оператор <code>!!</code>: {{XWarning|1=<span style="color: red;">'''Небезпечний код'''</span> <syntaxhighlight lang="kotlin" line start="1"> val name: String? = null println(name.length) // так не можна, помилка компіляції println (name!!.length) //так можна, але можливе аварійне завершення при виконанні </syntaxhighlight>}} Використавши два знаки оклику ми усуваємо помилку при компіляції, але можемо отримати помилку ([[Освоюємо Kotlin/Винятки|виняток]]) при виконанні програми, коли змінна буде рівна null, оскільки програма не зможе отримати довжину неіснуючого рядка. Найкращим виходом з даної ситуації є перевірка змінної на null і якщо null, то присвоїти змінній якесь інше значення. Це можна зробити використавши умову if (див. розділ "[[Освоюємо Kotlin/Умовні конструкції|Умовні конструкції]]"), або оператор <code>?:</code> (так званий елвіс оператор): <syntaxhighlight lang="kotlin" line start="1"> val name: String? = null // 'name' є nullable String val displayName: String = name ?: "Гість" // якщо 'name' рівна null, присвоюємо змінній значення "Гість" println(displayName) //вивід: Гість val nameNotNull: String? = "Іван" val displayNameNotNull: String = nameNotNull ?: "Гість" println(displayNameNotNull) // Вивід: Іван </syntaxhighlight> Приклад, коли можна отримати null, це наприклад ввід з клавіатури. Якщо ми будемо читати число так <code> val number=readln().toInt()</code>, то користувач може ввести замість числа букви, тоді перетворення до типу Int введеного тексту закінчиться аварійною ситуацією ([[Освоюємо Kotlin/Винятки|винятком]]). Ми можемо використати функцію <code>toIntOrNull()</code>, тоді якщо перетворення до типу Int буде невдале, то функція поверне null. І вже тоді можна здійснити перевірку на null і зробити певні дії: <syntaxhighlight lang="kotlin" line start="1"> fun main(){ println("Введіть ціле число:") val number:Int?=readln().toIntOrNull() if (number==null) //якщо число рівне null, то вивід "Ви ввели: не число" println("Ви ввели: не число") else // в іншому випадку виводимо наше число println("Ви ввели: $number") } </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Введіть ціле число: фіав Ви ввели: не число </pre>}} Елвіс оператор може бути більш функціональним. Так, якщо необхідно виконати якийсь код при null значенні, можна написати так: <syntaxhighlight lang="kotlin" line start="1" highlight="2-5"> val nameNotNull: String? = "Іван" val displayNameNotNull: String = nameNotNull ?: run{ println("Неправильний логін") "Гість" } println("Логін:"+displayNameNotNull) // Вивід: Іван </syntaxhighlight> Останній рядок в run присвоюється змінній, яка перевірялась. {{Nav}} kchq67kk2gopb725tdllhyrk4zj4t0s 41359 41358 2026-08-07T16:00:50Z Володимир Груша 985 /* null безпечність */ 41359 wikitext text/x-wiki {{Nav|Освоюємо Kotlin|Основи|programming|nocat=1}} ==Серодовища розробки (IDE)== Для програмування на Kotlin вам необхідне інтегроване середовище розробки (IDE). Офіційним середовищем є IntelliJ IDEA. Його можна звантажити з офіційного сайту jetbraints [https://www.jetbrains.com/idea/ тут]. При виборі версій, вибираєм IntelliJ IDEA Community Edition - воно безкоштовне. Другий спосіб опробувати прості програми - використати віртуальний емулятор на офіційному сайті (для початку згодиться). Його можна опробувати [https://play.kotlinlang.org/ тут] Можна також скористуватися іншими компіляторами, наприклад, IDE Eclipse з відповідним плагіном. ==Змінні== ===Оголошення змінних=== Оголошення змінних відбувається з вказанням ключового слова var або val після чого йде назва змінної. Тип змінної можна не вказувати, тоді компілятор сам спробує визначити її тип за тим, що ви присвоюєте змінній. Змінні з ключовим словом val називають незмінюватими (immutable) або лише для читання (read-only). <syntaxhighlight lang="kotlin" line start="1"> var x=5 //оголошення цілочисельної змінної val y=5 //оголошення val змінної var num: Int // оголошення цілочисельної змінної з прямим вказанням типу var isVar= true // створення змінної типу Boolean var hugeNumber = 6L //створення змінної типу Long var letter='D' //змінна типу Char var name="Tom" // змінна типу String var x=3.14 // змінна типу Double </syntaxhighlight> Можна при оголошенні змінної зразу вказати її тип: <syntaxhighlight lang="kotlin" line start="1"> var name:String="Tom" // змінна типу String var hugeNumber2: Long =6 // змінна типу Long </syntaxhighlight> Але переважно компілятор сам визначає тип змінної, по типу значення, яке присвоюється. Проте існують випадки, коли це необхідно. Наприклад, при вказанні параметрів функції і т.п. ===Типи змінних=== Цілочисельні типи представлені типами Byte, Short, Int та Long. {| class="wikitable" style="text-align:left" ! Тип ! Біт ! Діапазон значень |- | Byte | 8 біт | -128 до 127 |- | Short | 16 біт | –32768 до 32767 |- | Int | 32 біт | –2147483648 до 2147483647 |- | Long | 64 біт | -9 223 372 036 854 775 808 (<math>-2^{63}</math>) до 9 223 372 036 854 775 807 (<math>2^{63}</math> - 1) |} Дробові числа представлені типами <code>Float</code> (32 біта) та типом <code>Double</code> (64 біта). Для представлення символів використовується тип Char. <syntaxhighlight lang="kotlin" line start="1"> var letter='D' // символи вводяться в одинарних лапках </syntaxhighlight> Для представлення рядків використовується тип String. <syntaxhighlight lang="kotlin" line start="1"> var name ="John" </syntaxhighlight> Зверніть увагу, що для присвоєння символу використовуються одинарні лапки. Подвійні лапки означають, що змінна буде типу String. Як і в іших мовах для використання спеціальних символів використовується \ (backslash). <syntaxhighlight lang="kotlin" line start="1"> var apostrophe= '\'' //використовуємо одинарну лапку/апостроф var myString="Ви ввели\n символ $apostrophe" // використовуємо символ нового рядка \n println (myString) </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Ви ввели символ ' </pre>}} Можна ввести рядок символів, який відображатиметься без змін як він введений, використовуючи потрійні лапки на початку тексту і в кінці: <syntaxhighlight lang="kotlin" line start="1"> var myString=""" Ви ввели\n поможіть бо я заплутався """ println (myString) </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Ви ввели\n поможіть бо я заплутався </pre>}} Boolean змінні застосовуються для значень true або false. <syntaxhighlight lang="kotlin" line start="1"> var isMan = true </syntaxhighlight> Також існують безнакові змінні (unsigned) цих же типів, що відповідно можуть вміщати вдвічі більші додатні числа у себе (UBite, UShort, UInt, ULong): <syntaxhighlight lang="kotlin" line start="1"> var x:UInt=5u; </syntaxhighlight> Коли в змінну необхідно записати велике число, то можна використовувати символ _ між цифрами, для кращого візуального представлення числа: <syntaxhighlight lang="kotlin" line start="1"> var x:Int=5_500_000 // ніякої помилки, все правильно </syntaxhighlight> ===Перетворення типів=== Для перетворення одного типу в інший використовуються відповідні функції, наприклад toLong(), що викликаються на відповідному об'єкті (змінній). <syntaxhighlight lang="kotlin" line start="1"> var k=65 // створиться змінна типу Int var l:Long = k.toLong() //до типу Long </syntaxhighlight> ==Коментарі== У Kotlin є три види коментарів: <syntaxhighlight lang="kotlin" line start="1"> //однорядковий коментар //новий коментар /* багаторядковий коментар */ /** * KDoc коментар * для документування функцій * та класів */ </syntaxhighlight> Тобто однорядкові коментарі починаються з двох косих рисок <code>//</code>. Багаторядкові вміщуються в символи <code>/* та */</code>. Все, що в цих символах, компілятор не сприймає як код. Останній вид коментарів застосовується для документування функцій та класів. Так, наприклад, якщо спереді функції є такий коментар, то при наведенні в місці використання на назву функції, компілятор видасть підказку з даним текстом. Всередині може спеціальним чином використовуватися опис параметрів функції: <syntaxhighlight lang="kotlin" line start="1"> /** * Ця функція обчислює суму двох цілих чисел. * @param a Перше ціле число. * @param b Друге ціле число. * @return Сума a та b. */ fun addNumbers(a: Int, b: Int): Int { return a + b } </syntaxhighlight> Детальніші про функції далі, у відповідному підрозділі. ==Привіт Світе!== Проста програма складається мінімум із одної функції main, що схоже на С/С++ чи java. <syntaxhighlight lang="kotlin" line start="1"> fun main(args: Array<String>){ // вказання аргументів функції необов'язкове val message="Привіт, Світе!" println (message) // якщо виводимо лише значення змінної pintln ("Ми говоримо: $message") //якщо вставляємо змінну в рядок println("Ми говоримо знову: "+message) // можна й так } </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Привіт, Світе! Ми говоримо: Привіт, Світе! Ми говоримо знову: Привіт, Світе! </pre>}} Зверніть увагу, що для вставляння змінної в рядок використовується знак <code>$</code> ==Читання з консолі== Ви можете прочитати з консолі введений користувачем текст або числа використовуючи функцію readln(): <syntaxhighlight lang="kotlin" line start="1"> println ("Введіть своє ім'я:") val name=readln() // читаємо ім'я (тип String) println ("Скільки вам років:") val age=readln().toInt() // читаємо і конвертуємо введений текст (String) у число (Int) println("Привіт $name ($age)") </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Введіть своє ім'я: Володимир Скільки вам років: 18 Привіт Володимир (18) </pre>}} ==Конкатенація== Оператор + може використовуватись як для додавання так і для конкатенації (з'єднання) тексту, але тут є деякі особливості: <syntaxhighlight lang="kotlin" line start="1"> println("Hello"+" Igor") // так працює, виведе два слова println((2+5)+" hello")// не працює, помилка, бо пробує до Int додати текстовий рядок </syntaxhighlight> Якщо хочемо, щоб нам зробило додаавання і з'єднало з текстовим рядком, то це можна зробити двома способами. Перший переставити місцями текст і математичний вираз: <syntaxhighlight lang="kotlin" line start="1"> println("hello "+(2+5)) // виведе: hello 7 </syntaxhighlight> Другий спосіб - поставити на початку порожній текстовий рядок: <syntaxhighlight lang="kotlin" line start="1"> println(""+(2+5)+" hello")// виведе: 7 hello </syntaxhighlight> Конкатенацію можна використовувати не тільки у функції println(): <syntaxhighlight lang="kotlin" line start="1"> val text:String=""+(5+4)+" Hello" //так теж можна </syntaxhighlight> ==Константи на рівні компіляції== Перед ключовим словом <code>val</code> можна використати ключове слово <code>const</code>. В такому разі значення константи буде підставлятися в код під час компіляції: <syntaxhighlight lang="kotlin" line start="1"> const val MY_CONST=55 fun main(){ println (MY_CONST) } </syntaxhighlight> Такі константи прийнято писати великими буквами та з використанням символів підкреслення. Вони повинні бути оголошені на початку модуля поза межами інших блоків (як то функції чи класи). Винятками є оголошення таких констант в середені спеціальних конструкцій як то object та companion object. Значення, що присвоюється має бути базового типу, як то String, Int і т.п. [[Категорія:Освоюємо Kotlin]] ==null безпечність== В Kotlin на відміну від Java не можна так просто присвоїти значення null (що означає пусто, нічого). Ви повинні передбачити, що змінна може прийняти null використавши оператор <code>?</code>: <syntaxhighlight lang="kotlin" line start="1"> val name: String? = null </syntaxhighlight> Позначивши змінну таким чином, подальші помилки на совісті програміста, що застосовуватиме змінну і в подальшому треба використовувати спеціальні оператори. Так щоб отримати довжину рядка такої змінної ми повинні використати оператор <code>!!</code>: {{XWarning|1=<span style="color: red;">'''Небезпечний код'''</span> <syntaxhighlight lang="kotlin" line start="1"> val name: String? = null println(name.length) // так не можна, помилка компіляції println (name!!.length) //так можна, але можливе аварійне завершення при виконанні </syntaxhighlight>}} Використавши два знаки оклику ми усуваємо помилку при компіляції, але можемо отримати помилку ([[Освоюємо Kotlin/Винятки|виняток]]) при виконанні програми, коли змінна буде рівна null, оскільки програма не зможе отримати довжину неіснуючого рядка. Найкращим виходом з даної ситуації є перевірка змінної на null і якщо null, то присвоїти змінній якесь інше значення. Це можна зробити використавши умову if (див. розділ "[[Освоюємо Kotlin/Умовні конструкції|Умовні конструкції]]"), або оператор <code>?:</code> (так званий елвіс оператор): <syntaxhighlight lang="kotlin" line start="1"> val name: String? = null // 'name' є nullable String val displayName: String = name ?: "Гість" // якщо 'name' рівна null, присвоюємо змінній значення "Гість" println(displayName) //вивід: Гість val nameNotNull: String? = "Іван" val displayNameNotNull: String = nameNotNull ?: "Гість" println(displayNameNotNull) // Вивід: Іван </syntaxhighlight> Приклад, коли можна отримати null, це наприклад ввід з клавіатури. Якщо ми будемо читати число так <code> val number=readln().toInt()</code>, то користувач може ввести замість числа букви, тоді перетворення до типу Int введеного тексту закінчиться аварійною ситуацією ([[Освоюємо Kotlin/Винятки|винятком]]). Ми можемо використати функцію <code>toIntOrNull()</code>, тоді якщо перетворення до типу Int буде невдале, то функція поверне null. І вже тоді можна здійснити перевірку на null і зробити певні дії: <syntaxhighlight lang="kotlin" line start="1"> fun main(){ println("Введіть ціле число:") val number:Int?=readln().toIntOrNull() if (number==null) //якщо число рівне null, то вивід "Ви ввели: не число" println("Ви ввели: не число") else // в іншому випадку виводимо наше число println("Ви ввели: $number") } </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Введіть ціле число: фіав Ви ввели: не число </pre>}} Елвіс оператор може бути більш функціональним. Так, якщо необхідно виконати якийсь код при null значенні, можна написати так: <syntaxhighlight lang="kotlin" line start="1" highlight="2-5"> val nameNotNull: String? = null val displayNameNotNull: String = nameNotNull ?: run{ println("Неправильний логін") "Гість" } println("Логін:"+displayNameNotNull) // Логін:Гість </syntaxhighlight> Останній рядок в run присвоюється змінній, яка перевірялась. {{Nav}} b5g2mzcv24nyffn1vrueumdijfjk3ds 41360 41359 2026-08-07T16:02:16Z Володимир Груша 985 /* null безпечність */ 41360 wikitext text/x-wiki {{Nav|Освоюємо Kotlin|Основи|programming|nocat=1}} ==Серодовища розробки (IDE)== Для програмування на Kotlin вам необхідне інтегроване середовище розробки (IDE). Офіційним середовищем є IntelliJ IDEA. Його можна звантажити з офіційного сайту jetbraints [https://www.jetbrains.com/idea/ тут]. При виборі версій, вибираєм IntelliJ IDEA Community Edition - воно безкоштовне. Другий спосіб опробувати прості програми - використати віртуальний емулятор на офіційному сайті (для початку згодиться). Його можна опробувати [https://play.kotlinlang.org/ тут] Можна також скористуватися іншими компіляторами, наприклад, IDE Eclipse з відповідним плагіном. ==Змінні== ===Оголошення змінних=== Оголошення змінних відбувається з вказанням ключового слова var або val після чого йде назва змінної. Тип змінної можна не вказувати, тоді компілятор сам спробує визначити її тип за тим, що ви присвоюєте змінній. Змінні з ключовим словом val називають незмінюватими (immutable) або лише для читання (read-only). <syntaxhighlight lang="kotlin" line start="1"> var x=5 //оголошення цілочисельної змінної val y=5 //оголошення val змінної var num: Int // оголошення цілочисельної змінної з прямим вказанням типу var isVar= true // створення змінної типу Boolean var hugeNumber = 6L //створення змінної типу Long var letter='D' //змінна типу Char var name="Tom" // змінна типу String var x=3.14 // змінна типу Double </syntaxhighlight> Можна при оголошенні змінної зразу вказати її тип: <syntaxhighlight lang="kotlin" line start="1"> var name:String="Tom" // змінна типу String var hugeNumber2: Long =6 // змінна типу Long </syntaxhighlight> Але переважно компілятор сам визначає тип змінної, по типу значення, яке присвоюється. Проте існують випадки, коли це необхідно. Наприклад, при вказанні параметрів функції і т.п. ===Типи змінних=== Цілочисельні типи представлені типами Byte, Short, Int та Long. {| class="wikitable" style="text-align:left" ! Тип ! Біт ! Діапазон значень |- | Byte | 8 біт | -128 до 127 |- | Short | 16 біт | –32768 до 32767 |- | Int | 32 біт | –2147483648 до 2147483647 |- | Long | 64 біт | -9 223 372 036 854 775 808 (<math>-2^{63}</math>) до 9 223 372 036 854 775 807 (<math>2^{63}</math> - 1) |} Дробові числа представлені типами <code>Float</code> (32 біта) та типом <code>Double</code> (64 біта). Для представлення символів використовується тип Char. <syntaxhighlight lang="kotlin" line start="1"> var letter='D' // символи вводяться в одинарних лапках </syntaxhighlight> Для представлення рядків використовується тип String. <syntaxhighlight lang="kotlin" line start="1"> var name ="John" </syntaxhighlight> Зверніть увагу, що для присвоєння символу використовуються одинарні лапки. Подвійні лапки означають, що змінна буде типу String. Як і в іших мовах для використання спеціальних символів використовується \ (backslash). <syntaxhighlight lang="kotlin" line start="1"> var apostrophe= '\'' //використовуємо одинарну лапку/апостроф var myString="Ви ввели\n символ $apostrophe" // використовуємо символ нового рядка \n println (myString) </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Ви ввели символ ' </pre>}} Можна ввести рядок символів, який відображатиметься без змін як він введений, використовуючи потрійні лапки на початку тексту і в кінці: <syntaxhighlight lang="kotlin" line start="1"> var myString=""" Ви ввели\n поможіть бо я заплутався """ println (myString) </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Ви ввели\n поможіть бо я заплутався </pre>}} Boolean змінні застосовуються для значень true або false. <syntaxhighlight lang="kotlin" line start="1"> var isMan = true </syntaxhighlight> Також існують безнакові змінні (unsigned) цих же типів, що відповідно можуть вміщати вдвічі більші додатні числа у себе (UBite, UShort, UInt, ULong): <syntaxhighlight lang="kotlin" line start="1"> var x:UInt=5u; </syntaxhighlight> Коли в змінну необхідно записати велике число, то можна використовувати символ _ між цифрами, для кращого візуального представлення числа: <syntaxhighlight lang="kotlin" line start="1"> var x:Int=5_500_000 // ніякої помилки, все правильно </syntaxhighlight> ===Перетворення типів=== Для перетворення одного типу в інший використовуються відповідні функції, наприклад toLong(), що викликаються на відповідному об'єкті (змінній). <syntaxhighlight lang="kotlin" line start="1"> var k=65 // створиться змінна типу Int var l:Long = k.toLong() //до типу Long </syntaxhighlight> ==Коментарі== У Kotlin є три види коментарів: <syntaxhighlight lang="kotlin" line start="1"> //однорядковий коментар //новий коментар /* багаторядковий коментар */ /** * KDoc коментар * для документування функцій * та класів */ </syntaxhighlight> Тобто однорядкові коментарі починаються з двох косих рисок <code>//</code>. Багаторядкові вміщуються в символи <code>/* та */</code>. Все, що в цих символах, компілятор не сприймає як код. Останній вид коментарів застосовується для документування функцій та класів. Так, наприклад, якщо спереді функції є такий коментар, то при наведенні в місці використання на назву функції, компілятор видасть підказку з даним текстом. Всередині може спеціальним чином використовуватися опис параметрів функції: <syntaxhighlight lang="kotlin" line start="1"> /** * Ця функція обчислює суму двох цілих чисел. * @param a Перше ціле число. * @param b Друге ціле число. * @return Сума a та b. */ fun addNumbers(a: Int, b: Int): Int { return a + b } </syntaxhighlight> Детальніші про функції далі, у відповідному підрозділі. ==Привіт Світе!== Проста програма складається мінімум із одної функції main, що схоже на С/С++ чи java. <syntaxhighlight lang="kotlin" line start="1"> fun main(args: Array<String>){ // вказання аргументів функції необов'язкове val message="Привіт, Світе!" println (message) // якщо виводимо лише значення змінної pintln ("Ми говоримо: $message") //якщо вставляємо змінну в рядок println("Ми говоримо знову: "+message) // можна й так } </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Привіт, Світе! Ми говоримо: Привіт, Світе! Ми говоримо знову: Привіт, Світе! </pre>}} Зверніть увагу, що для вставляння змінної в рядок використовується знак <code>$</code> ==Читання з консолі== Ви можете прочитати з консолі введений користувачем текст або числа використовуючи функцію readln(): <syntaxhighlight lang="kotlin" line start="1"> println ("Введіть своє ім'я:") val name=readln() // читаємо ім'я (тип String) println ("Скільки вам років:") val age=readln().toInt() // читаємо і конвертуємо введений текст (String) у число (Int) println("Привіт $name ($age)") </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Введіть своє ім'я: Володимир Скільки вам років: 18 Привіт Володимир (18) </pre>}} ==Конкатенація== Оператор + може використовуватись як для додавання так і для конкатенації (з'єднання) тексту, але тут є деякі особливості: <syntaxhighlight lang="kotlin" line start="1"> println("Hello"+" Igor") // так працює, виведе два слова println((2+5)+" hello")// не працює, помилка, бо пробує до Int додати текстовий рядок </syntaxhighlight> Якщо хочемо, щоб нам зробило додаавання і з'єднало з текстовим рядком, то це можна зробити двома способами. Перший переставити місцями текст і математичний вираз: <syntaxhighlight lang="kotlin" line start="1"> println("hello "+(2+5)) // виведе: hello 7 </syntaxhighlight> Другий спосіб - поставити на початку порожній текстовий рядок: <syntaxhighlight lang="kotlin" line start="1"> println(""+(2+5)+" hello")// виведе: 7 hello </syntaxhighlight> Конкатенацію можна використовувати не тільки у функції println(): <syntaxhighlight lang="kotlin" line start="1"> val text:String=""+(5+4)+" Hello" //так теж можна </syntaxhighlight> ==Константи на рівні компіляції== Перед ключовим словом <code>val</code> можна використати ключове слово <code>const</code>. В такому разі значення константи буде підставлятися в код під час компіляції: <syntaxhighlight lang="kotlin" line start="1"> const val MY_CONST=55 fun main(){ println (MY_CONST) } </syntaxhighlight> Такі константи прийнято писати великими буквами та з використанням символів підкреслення. Вони повинні бути оголошені на початку модуля поза межами інших блоків (як то функції чи класи). Винятками є оголошення таких констант в середені спеціальних конструкцій як то object та companion object. Значення, що присвоюється має бути базового типу, як то String, Int і т.п. [[Категорія:Освоюємо Kotlin]] ==null безпечність== В Kotlin на відміну від Java не можна так просто присвоїти значення null (що означає пусто, нічого). Ви повинні передбачити, що змінна може прийняти null використавши оператор <code>?</code>: <syntaxhighlight lang="kotlin" line start="1"> val name: String? = null </syntaxhighlight> Позначивши змінну таким чином, подальші помилки на совісті програміста, що застосовуватиме змінну і в подальшому треба використовувати спеціальні оператори. Так щоб отримати довжину рядка такої змінної ми повинні використати оператор <code>!!</code>: {{XWarning|1=<span style="color: red;">'''Небезпечний код'''</span> <syntaxhighlight lang="kotlin" line start="1"> val name: String? = null println(name.length) // так не можна, помилка компіляції println (name!!.length) //так можна, але можливе аварійне завершення при виконанні </syntaxhighlight>}} Використавши два знаки оклику ми усуваємо помилку при компіляції, але можемо отримати помилку ([[Освоюємо Kotlin/Винятки|виняток]]) при виконанні програми, коли змінна буде рівна null, оскільки програма не зможе отримати довжину неіснуючого рядка. Найкращим виходом з даної ситуації є перевірка змінної на null і якщо null, то присвоїти змінній якесь інше значення. Це можна зробити використавши умову if (див. розділ "[[Освоюємо Kotlin/Умовні конструкції|Умовні конструкції]]"), або оператор <code>?:</code> (так званий елвіс оператор): <syntaxhighlight lang="kotlin" line start="1"> val name: String? = null // 'name' є nullable String val displayName: String = name ?: "Гість" // якщо 'name' рівна null, присвоюємо змінній значення "Гість" println(displayName) //вивід: Гість val nameNotNull: String? = "Іван" val displayNameNotNull: String = nameNotNull ?: "Гість" println(displayNameNotNull) // Вивід: Іван </syntaxhighlight> Приклад, коли можна отримати null, це наприклад ввід з клавіатури. Якщо ми будемо читати число так <code> val number=readln().toInt()</code>, то користувач може ввести замість числа букви, тоді перетворення до типу Int введеного тексту закінчиться аварійною ситуацією ([[Освоюємо Kotlin/Винятки|винятком]]). Ми можемо використати функцію <code>toIntOrNull()</code>, тоді якщо перетворення до типу Int буде невдале, то функція поверне null. І вже тоді можна здійснити перевірку на null і зробити певні дії: <syntaxhighlight lang="kotlin" line start="1"> fun main(){ println("Введіть ціле число:") val number:Int?=readln().toIntOrNull() if (number==null) //якщо число рівне null, то вивід "Ви ввели: не число" println("Ви ввели: не число") else // в іншому випадку виводимо наше число println("Ви ввели: $number") } </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Введіть ціле число: фіав Ви ввели: не число </pre>}} Елвіс оператор може бути більш функціональним. Так, якщо необхідно виконати якийсь код при null значенні, можна написати так: <syntaxhighlight lang="kotlin" line start="1" highlight="2-5"> val nameNotNull: String? = null val displayNameNotNull: String = nameNotNull ?: run{ println("Неправильний логін") "Гість" } println("Логін:"+displayNameNotNull)</syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Неправильний логін Логін:Гість </pre>}} Останній рядок в run присвоюється змінній, яка перевірялась. {{Nav}} pclp5o0qcj1b4dkie3trtj87qlswxaq 41361 41360 2026-08-07T16:06:39Z Володимир Груша 985 /* null безпечність */ 41361 wikitext text/x-wiki {{Nav|Освоюємо Kotlin|Основи|programming|nocat=1}} ==Серодовища розробки (IDE)== Для програмування на Kotlin вам необхідне інтегроване середовище розробки (IDE). Офіційним середовищем є IntelliJ IDEA. Його можна звантажити з офіційного сайту jetbraints [https://www.jetbrains.com/idea/ тут]. При виборі версій, вибираєм IntelliJ IDEA Community Edition - воно безкоштовне. Другий спосіб опробувати прості програми - використати віртуальний емулятор на офіційному сайті (для початку згодиться). Його можна опробувати [https://play.kotlinlang.org/ тут] Можна також скористуватися іншими компіляторами, наприклад, IDE Eclipse з відповідним плагіном. ==Змінні== ===Оголошення змінних=== Оголошення змінних відбувається з вказанням ключового слова var або val після чого йде назва змінної. Тип змінної можна не вказувати, тоді компілятор сам спробує визначити її тип за тим, що ви присвоюєте змінній. Змінні з ключовим словом val називають незмінюватими (immutable) або лише для читання (read-only). <syntaxhighlight lang="kotlin" line start="1"> var x=5 //оголошення цілочисельної змінної val y=5 //оголошення val змінної var num: Int // оголошення цілочисельної змінної з прямим вказанням типу var isVar= true // створення змінної типу Boolean var hugeNumber = 6L //створення змінної типу Long var letter='D' //змінна типу Char var name="Tom" // змінна типу String var x=3.14 // змінна типу Double </syntaxhighlight> Можна при оголошенні змінної зразу вказати її тип: <syntaxhighlight lang="kotlin" line start="1"> var name:String="Tom" // змінна типу String var hugeNumber2: Long =6 // змінна типу Long </syntaxhighlight> Але переважно компілятор сам визначає тип змінної, по типу значення, яке присвоюється. Проте існують випадки, коли це необхідно. Наприклад, при вказанні параметрів функції і т.п. ===Типи змінних=== Цілочисельні типи представлені типами Byte, Short, Int та Long. {| class="wikitable" style="text-align:left" ! Тип ! Біт ! Діапазон значень |- | Byte | 8 біт | -128 до 127 |- | Short | 16 біт | –32768 до 32767 |- | Int | 32 біт | –2147483648 до 2147483647 |- | Long | 64 біт | -9 223 372 036 854 775 808 (<math>-2^{63}</math>) до 9 223 372 036 854 775 807 (<math>2^{63}</math> - 1) |} Дробові числа представлені типами <code>Float</code> (32 біта) та типом <code>Double</code> (64 біта). Для представлення символів використовується тип Char. <syntaxhighlight lang="kotlin" line start="1"> var letter='D' // символи вводяться в одинарних лапках </syntaxhighlight> Для представлення рядків використовується тип String. <syntaxhighlight lang="kotlin" line start="1"> var name ="John" </syntaxhighlight> Зверніть увагу, що для присвоєння символу використовуються одинарні лапки. Подвійні лапки означають, що змінна буде типу String. Як і в іших мовах для використання спеціальних символів використовується \ (backslash). <syntaxhighlight lang="kotlin" line start="1"> var apostrophe= '\'' //використовуємо одинарну лапку/апостроф var myString="Ви ввели\n символ $apostrophe" // використовуємо символ нового рядка \n println (myString) </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Ви ввели символ ' </pre>}} Можна ввести рядок символів, який відображатиметься без змін як він введений, використовуючи потрійні лапки на початку тексту і в кінці: <syntaxhighlight lang="kotlin" line start="1"> var myString=""" Ви ввели\n поможіть бо я заплутався """ println (myString) </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Ви ввели\n поможіть бо я заплутався </pre>}} Boolean змінні застосовуються для значень true або false. <syntaxhighlight lang="kotlin" line start="1"> var isMan = true </syntaxhighlight> Також існують безнакові змінні (unsigned) цих же типів, що відповідно можуть вміщати вдвічі більші додатні числа у себе (UBite, UShort, UInt, ULong): <syntaxhighlight lang="kotlin" line start="1"> var x:UInt=5u; </syntaxhighlight> Коли в змінну необхідно записати велике число, то можна використовувати символ _ між цифрами, для кращого візуального представлення числа: <syntaxhighlight lang="kotlin" line start="1"> var x:Int=5_500_000 // ніякої помилки, все правильно </syntaxhighlight> ===Перетворення типів=== Для перетворення одного типу в інший використовуються відповідні функції, наприклад toLong(), що викликаються на відповідному об'єкті (змінній). <syntaxhighlight lang="kotlin" line start="1"> var k=65 // створиться змінна типу Int var l:Long = k.toLong() //до типу Long </syntaxhighlight> ==Коментарі== У Kotlin є три види коментарів: <syntaxhighlight lang="kotlin" line start="1"> //однорядковий коментар //новий коментар /* багаторядковий коментар */ /** * KDoc коментар * для документування функцій * та класів */ </syntaxhighlight> Тобто однорядкові коментарі починаються з двох косих рисок <code>//</code>. Багаторядкові вміщуються в символи <code>/* та */</code>. Все, що в цих символах, компілятор не сприймає як код. Останній вид коментарів застосовується для документування функцій та класів. Так, наприклад, якщо спереді функції є такий коментар, то при наведенні в місці використання на назву функції, компілятор видасть підказку з даним текстом. Всередині може спеціальним чином використовуватися опис параметрів функції: <syntaxhighlight lang="kotlin" line start="1"> /** * Ця функція обчислює суму двох цілих чисел. * @param a Перше ціле число. * @param b Друге ціле число. * @return Сума a та b. */ fun addNumbers(a: Int, b: Int): Int { return a + b } </syntaxhighlight> Детальніші про функції далі, у відповідному підрозділі. ==Привіт Світе!== Проста програма складається мінімум із одної функції main, що схоже на С/С++ чи java. <syntaxhighlight lang="kotlin" line start="1"> fun main(args: Array<String>){ // вказання аргументів функції необов'язкове val message="Привіт, Світе!" println (message) // якщо виводимо лише значення змінної pintln ("Ми говоримо: $message") //якщо вставляємо змінну в рядок println("Ми говоримо знову: "+message) // можна й так } </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Привіт, Світе! Ми говоримо: Привіт, Світе! Ми говоримо знову: Привіт, Світе! </pre>}} Зверніть увагу, що для вставляння змінної в рядок використовується знак <code>$</code> ==Читання з консолі== Ви можете прочитати з консолі введений користувачем текст або числа використовуючи функцію readln(): <syntaxhighlight lang="kotlin" line start="1"> println ("Введіть своє ім'я:") val name=readln() // читаємо ім'я (тип String) println ("Скільки вам років:") val age=readln().toInt() // читаємо і конвертуємо введений текст (String) у число (Int) println("Привіт $name ($age)") </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Введіть своє ім'я: Володимир Скільки вам років: 18 Привіт Володимир (18) </pre>}} ==Конкатенація== Оператор + може використовуватись як для додавання так і для конкатенації (з'єднання) тексту, але тут є деякі особливості: <syntaxhighlight lang="kotlin" line start="1"> println("Hello"+" Igor") // так працює, виведе два слова println((2+5)+" hello")// не працює, помилка, бо пробує до Int додати текстовий рядок </syntaxhighlight> Якщо хочемо, щоб нам зробило додаавання і з'єднало з текстовим рядком, то це можна зробити двома способами. Перший переставити місцями текст і математичний вираз: <syntaxhighlight lang="kotlin" line start="1"> println("hello "+(2+5)) // виведе: hello 7 </syntaxhighlight> Другий спосіб - поставити на початку порожній текстовий рядок: <syntaxhighlight lang="kotlin" line start="1"> println(""+(2+5)+" hello")// виведе: 7 hello </syntaxhighlight> Конкатенацію можна використовувати не тільки у функції println(): <syntaxhighlight lang="kotlin" line start="1"> val text:String=""+(5+4)+" Hello" //так теж можна </syntaxhighlight> ==Константи на рівні компіляції== Перед ключовим словом <code>val</code> можна використати ключове слово <code>const</code>. В такому разі значення константи буде підставлятися в код під час компіляції: <syntaxhighlight lang="kotlin" line start="1"> const val MY_CONST=55 fun main(){ println (MY_CONST) } </syntaxhighlight> Такі константи прийнято писати великими буквами та з використанням символів підкреслення. Вони повинні бути оголошені на початку модуля поза межами інших блоків (як то функції чи класи). Винятками є оголошення таких констант в середені спеціальних конструкцій як то object та companion object. Значення, що присвоюється має бути базового типу, як то String, Int і т.п. [[Категорія:Освоюємо Kotlin]] ==null безпечність== В Kotlin на відміну від Java не можна так просто присвоїти значення null (що означає пусто, нічого). Ви повинні передбачити, що змінна може прийняти null використавши оператор <code>?</code>: <syntaxhighlight lang="kotlin" line start="1"> val name: String? = null </syntaxhighlight> Позначивши змінну таким чином, подальші помилки на совісті програміста, що застосовуватиме змінну і в подальшому треба використовувати спеціальні оператори. Так щоб отримати довжину рядка такої змінної ми повинні використати оператор <code>!!</code>: {{XWarning|1=<span style="color: red;">'''Небезпечний код'''</span> <syntaxhighlight lang="kotlin" line start="1"> val name: String? = null println(name.length) // так не можна, помилка компіляції println (name!!.length) //так можна, але можливе аварійне завершення при виконанні </syntaxhighlight>}} Використавши два знаки оклику ми усуваємо помилку при компіляції, але можемо отримати помилку ([[Освоюємо Kotlin/Винятки|виняток]]) при виконанні програми, коли змінна буде рівна null, оскільки програма не зможе отримати довжину неіснуючого рядка. Найкращим виходом з даної ситуації є перевірка змінної на null і якщо null, то присвоїти змінній якесь інше значення. Це можна зробити використавши умову if (див. розділ "[[Освоюємо Kotlin/Умовні конструкції|Умовні конструкції]]"), або оператор <code>?:</code> (так званий елвіс оператор): <syntaxhighlight lang="kotlin" line start="1"> val name: String? = null // 'name' є nullable String val displayName: String = name ?: "Гість" // якщо 'name' рівна null, присвоюємо змінній значення "Гість" println(displayName) //вивід: Гість val nameNotNull: String? = "Іван" val displayNameNotNull: String = nameNotNull ?: "Гість" println(displayNameNotNull) // Вивід: Іван </syntaxhighlight> Приклад, коли можна отримати null, це наприклад ввід з клавіатури. Якщо ми будемо читати число так <code> val number=readln().toInt()</code>, то користувач може ввести замість числа букви, тоді перетворення до типу Int введеного тексту закінчиться аварійною ситуацією ([[Освоюємо Kotlin/Винятки|винятком]]). Ми можемо використати функцію <code>toIntOrNull()</code>, тоді якщо перетворення до типу Int буде невдале, то функція поверне null. І вже тоді можна здійснити перевірку на null і зробити певні дії: <syntaxhighlight lang="kotlin" line start="1"> fun main(){ println("Введіть ціле число:") val number:Int?=readln().toIntOrNull() if (number==null) //якщо число рівне null, то вивід "Ви ввели: не число" println("Ви ввели: не число") else // в іншому випадку виводимо наше число println("Ви ввели: $number") } </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Введіть ціле число: фіав Ви ввели: не число </pre>}} Елвіс оператор може бути більш функціональним. Так, якщо необхідно виконати якийсь код при null значенні, можна написати так: <syntaxhighlight lang="kotlin" line start="1" highlight="2-5"> val nameNotNull: String? = null val displayNameNotNull: String = nameNotNull ?: run{ println("Неправильний логін") "Гість" } println("Логін:"+displayNameNotNull) </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Неправильний логін Логін:Гість </pre>}} Останній рядок в run присвоюється змінній, яка перевірялась. Можна просто завершити виконання функції main() або будь-якої функції використавши ключове слово return <syntaxhighlight lang="kotlin" line start="1"> fun main(args: Array<String>) { val nameNotNull: String? = null val displayNameNotNull: String = nameNotNull ?: return println(displayNameNotNull) } </syntaxhighlight> {{Nav}} g2p590vv34epz9iwhh6rvvl2kr8l846 41362 41361 2026-08-07T16:07:50Z Володимир Груша 985 /* null безпечність */ 41362 wikitext text/x-wiki {{Nav|Освоюємо Kotlin|Основи|programming|nocat=1}} ==Серодовища розробки (IDE)== Для програмування на Kotlin вам необхідне інтегроване середовище розробки (IDE). Офіційним середовищем є IntelliJ IDEA. Його можна звантажити з офіційного сайту jetbraints [https://www.jetbrains.com/idea/ тут]. При виборі версій, вибираєм IntelliJ IDEA Community Edition - воно безкоштовне. Другий спосіб опробувати прості програми - використати віртуальний емулятор на офіційному сайті (для початку згодиться). Його можна опробувати [https://play.kotlinlang.org/ тут] Можна також скористуватися іншими компіляторами, наприклад, IDE Eclipse з відповідним плагіном. ==Змінні== ===Оголошення змінних=== Оголошення змінних відбувається з вказанням ключового слова var або val після чого йде назва змінної. Тип змінної можна не вказувати, тоді компілятор сам спробує визначити її тип за тим, що ви присвоюєте змінній. Змінні з ключовим словом val називають незмінюватими (immutable) або лише для читання (read-only). <syntaxhighlight lang="kotlin" line start="1"> var x=5 //оголошення цілочисельної змінної val y=5 //оголошення val змінної var num: Int // оголошення цілочисельної змінної з прямим вказанням типу var isVar= true // створення змінної типу Boolean var hugeNumber = 6L //створення змінної типу Long var letter='D' //змінна типу Char var name="Tom" // змінна типу String var x=3.14 // змінна типу Double </syntaxhighlight> Можна при оголошенні змінної зразу вказати її тип: <syntaxhighlight lang="kotlin" line start="1"> var name:String="Tom" // змінна типу String var hugeNumber2: Long =6 // змінна типу Long </syntaxhighlight> Але переважно компілятор сам визначає тип змінної, по типу значення, яке присвоюється. Проте існують випадки, коли це необхідно. Наприклад, при вказанні параметрів функції і т.п. ===Типи змінних=== Цілочисельні типи представлені типами Byte, Short, Int та Long. {| class="wikitable" style="text-align:left" ! Тип ! Біт ! Діапазон значень |- | Byte | 8 біт | -128 до 127 |- | Short | 16 біт | –32768 до 32767 |- | Int | 32 біт | –2147483648 до 2147483647 |- | Long | 64 біт | -9 223 372 036 854 775 808 (<math>-2^{63}</math>) до 9 223 372 036 854 775 807 (<math>2^{63}</math> - 1) |} Дробові числа представлені типами <code>Float</code> (32 біта) та типом <code>Double</code> (64 біта). Для представлення символів використовується тип Char. <syntaxhighlight lang="kotlin" line start="1"> var letter='D' // символи вводяться в одинарних лапках </syntaxhighlight> Для представлення рядків використовується тип String. <syntaxhighlight lang="kotlin" line start="1"> var name ="John" </syntaxhighlight> Зверніть увагу, що для присвоєння символу використовуються одинарні лапки. Подвійні лапки означають, що змінна буде типу String. Як і в іших мовах для використання спеціальних символів використовується \ (backslash). <syntaxhighlight lang="kotlin" line start="1"> var apostrophe= '\'' //використовуємо одинарну лапку/апостроф var myString="Ви ввели\n символ $apostrophe" // використовуємо символ нового рядка \n println (myString) </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Ви ввели символ ' </pre>}} Можна ввести рядок символів, який відображатиметься без змін як він введений, використовуючи потрійні лапки на початку тексту і в кінці: <syntaxhighlight lang="kotlin" line start="1"> var myString=""" Ви ввели\n поможіть бо я заплутався """ println (myString) </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Ви ввели\n поможіть бо я заплутався </pre>}} Boolean змінні застосовуються для значень true або false. <syntaxhighlight lang="kotlin" line start="1"> var isMan = true </syntaxhighlight> Також існують безнакові змінні (unsigned) цих же типів, що відповідно можуть вміщати вдвічі більші додатні числа у себе (UBite, UShort, UInt, ULong): <syntaxhighlight lang="kotlin" line start="1"> var x:UInt=5u; </syntaxhighlight> Коли в змінну необхідно записати велике число, то можна використовувати символ _ між цифрами, для кращого візуального представлення числа: <syntaxhighlight lang="kotlin" line start="1"> var x:Int=5_500_000 // ніякої помилки, все правильно </syntaxhighlight> ===Перетворення типів=== Для перетворення одного типу в інший використовуються відповідні функції, наприклад toLong(), що викликаються на відповідному об'єкті (змінній). <syntaxhighlight lang="kotlin" line start="1"> var k=65 // створиться змінна типу Int var l:Long = k.toLong() //до типу Long </syntaxhighlight> ==Коментарі== У Kotlin є три види коментарів: <syntaxhighlight lang="kotlin" line start="1"> //однорядковий коментар //новий коментар /* багаторядковий коментар */ /** * KDoc коментар * для документування функцій * та класів */ </syntaxhighlight> Тобто однорядкові коментарі починаються з двох косих рисок <code>//</code>. Багаторядкові вміщуються в символи <code>/* та */</code>. Все, що в цих символах, компілятор не сприймає як код. Останній вид коментарів застосовується для документування функцій та класів. Так, наприклад, якщо спереді функції є такий коментар, то при наведенні в місці використання на назву функції, компілятор видасть підказку з даним текстом. Всередині може спеціальним чином використовуватися опис параметрів функції: <syntaxhighlight lang="kotlin" line start="1"> /** * Ця функція обчислює суму двох цілих чисел. * @param a Перше ціле число. * @param b Друге ціле число. * @return Сума a та b. */ fun addNumbers(a: Int, b: Int): Int { return a + b } </syntaxhighlight> Детальніші про функції далі, у відповідному підрозділі. ==Привіт Світе!== Проста програма складається мінімум із одної функції main, що схоже на С/С++ чи java. <syntaxhighlight lang="kotlin" line start="1"> fun main(args: Array<String>){ // вказання аргументів функції необов'язкове val message="Привіт, Світе!" println (message) // якщо виводимо лише значення змінної pintln ("Ми говоримо: $message") //якщо вставляємо змінну в рядок println("Ми говоримо знову: "+message) // можна й так } </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Привіт, Світе! Ми говоримо: Привіт, Світе! Ми говоримо знову: Привіт, Світе! </pre>}} Зверніть увагу, що для вставляння змінної в рядок використовується знак <code>$</code> ==Читання з консолі== Ви можете прочитати з консолі введений користувачем текст або числа використовуючи функцію readln(): <syntaxhighlight lang="kotlin" line start="1"> println ("Введіть своє ім'я:") val name=readln() // читаємо ім'я (тип String) println ("Скільки вам років:") val age=readln().toInt() // читаємо і конвертуємо введений текст (String) у число (Int) println("Привіт $name ($age)") </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Введіть своє ім'я: Володимир Скільки вам років: 18 Привіт Володимир (18) </pre>}} ==Конкатенація== Оператор + може використовуватись як для додавання так і для конкатенації (з'єднання) тексту, але тут є деякі особливості: <syntaxhighlight lang="kotlin" line start="1"> println("Hello"+" Igor") // так працює, виведе два слова println((2+5)+" hello")// не працює, помилка, бо пробує до Int додати текстовий рядок </syntaxhighlight> Якщо хочемо, щоб нам зробило додаавання і з'єднало з текстовим рядком, то це можна зробити двома способами. Перший переставити місцями текст і математичний вираз: <syntaxhighlight lang="kotlin" line start="1"> println("hello "+(2+5)) // виведе: hello 7 </syntaxhighlight> Другий спосіб - поставити на початку порожній текстовий рядок: <syntaxhighlight lang="kotlin" line start="1"> println(""+(2+5)+" hello")// виведе: 7 hello </syntaxhighlight> Конкатенацію можна використовувати не тільки у функції println(): <syntaxhighlight lang="kotlin" line start="1"> val text:String=""+(5+4)+" Hello" //так теж можна </syntaxhighlight> ==Константи на рівні компіляції== Перед ключовим словом <code>val</code> можна використати ключове слово <code>const</code>. В такому разі значення константи буде підставлятися в код під час компіляції: <syntaxhighlight lang="kotlin" line start="1"> const val MY_CONST=55 fun main(){ println (MY_CONST) } </syntaxhighlight> Такі константи прийнято писати великими буквами та з використанням символів підкреслення. Вони повинні бути оголошені на початку модуля поза межами інших блоків (як то функції чи класи). Винятками є оголошення таких констант в середені спеціальних конструкцій як то object та companion object. Значення, що присвоюється має бути базового типу, як то String, Int і т.п. [[Категорія:Освоюємо Kotlin]] ==null безпечність== В Kotlin на відміну від Java не можна так просто присвоїти значення null (що означає пусто, нічого). Ви повинні передбачити, що змінна може прийняти null використавши оператор <code>?</code>: <syntaxhighlight lang="kotlin" line start="1"> val name: String? = null </syntaxhighlight> Позначивши змінну таким чином, подальші помилки на совісті програміста, що застосовуватиме змінну і в подальшому треба використовувати спеціальні оператори. Так щоб отримати довжину рядка такої змінної ми повинні використати оператор <code>!!</code>: {{XWarning|1=<span style="color: red;">'''Небезпечний код'''</span> <syntaxhighlight lang="kotlin" line start="1"> val name: String? = null println(name.length) // так не можна, помилка компіляції println (name!!.length) //так можна, але можливе аварійне завершення при виконанні </syntaxhighlight>}} Використавши два знаки оклику ми усуваємо помилку при компіляції, але можемо отримати помилку ([[Освоюємо Kotlin/Винятки|виняток]]) при виконанні програми, коли змінна буде рівна null, оскільки програма не зможе отримати довжину неіснуючого рядка. Найкращим виходом з даної ситуації є перевірка змінної на null і якщо null, то присвоїти змінній якесь інше значення. Це можна зробити використавши умову if (див. розділ "[[Освоюємо Kotlin/Умовні конструкції|Умовні конструкції]]"), або оператор <code>?:</code> (так званий елвіс оператор): <syntaxhighlight lang="kotlin" line start="1"> val name: String? = null // 'name' є nullable String val displayName: String = name ?: "Гість" // якщо 'name' рівна null, присвоюємо змінній значення "Гість" println(displayName) //вивід: Гість val nameNotNull: String? = "Іван" val displayNameNotNull: String = nameNotNull ?: "Гість" println(displayNameNotNull) // Вивід: Іван </syntaxhighlight> Приклад, коли можна отримати null, це наприклад ввід з клавіатури. Якщо ми будемо читати число так <code> val number=readln().toInt()</code>, то користувач може ввести замість числа букви, тоді перетворення до типу Int введеного тексту закінчиться аварійною ситуацією ([[Освоюємо Kotlin/Винятки|винятком]]). Ми можемо використати функцію <code>toIntOrNull()</code>, тоді якщо перетворення до типу Int буде невдале, то функція поверне null. І вже тоді можна здійснити перевірку на null і зробити певні дії: <syntaxhighlight lang="kotlin" line start="1"> fun main(){ println("Введіть ціле число:") val number:Int?=readln().toIntOrNull() if (number==null) //якщо число рівне null, то вивід "Ви ввели: не число" println("Ви ввели: не число") else // в іншому випадку виводимо наше число println("Ви ввели: $number") } </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Введіть ціле число: фіав Ви ввели: не число </pre>}} Елвіс оператор може бути більш функціональним. Так, якщо необхідно виконати якийсь код при null значенні, можна написати так: <syntaxhighlight lang="kotlin" line start="1" highlight="2-5"> val nameNotNull: String? = null val displayNameNotNull: String = nameNotNull ?: run{ println("Неправильний логін") "Гість" } println("Логін:"+displayNameNotNull) </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Неправильний логін Логін:Гість </pre>}} Останній рядок в run присвоюється змінній, яка перевірялась. Можна просто завершити виконання функції main() або будь-якої функції використавши ключове слово return <syntaxhighlight lang="kotlin" line start="1"> fun main(args: Array<String>) { val nameNotNull: String? = null val displayNameNotNull: String = nameNotNull ?: return println(displayNameNotNull) } </syntaxhighlight> В даному випадку на екран нічого не буде виведено, оскільки після return програма закінчує виконная {{Nav}} tpo3aq1xzyr8p85ipdqrgcrg6b0duxn 41363 41362 2026-08-07T16:08:06Z Володимир Груша 985 /* null безпечність */ 41363 wikitext text/x-wiki {{Nav|Освоюємо Kotlin|Основи|programming|nocat=1}} ==Серодовища розробки (IDE)== Для програмування на Kotlin вам необхідне інтегроване середовище розробки (IDE). Офіційним середовищем є IntelliJ IDEA. Його можна звантажити з офіційного сайту jetbraints [https://www.jetbrains.com/idea/ тут]. При виборі версій, вибираєм IntelliJ IDEA Community Edition - воно безкоштовне. Другий спосіб опробувати прості програми - використати віртуальний емулятор на офіційному сайті (для початку згодиться). Його можна опробувати [https://play.kotlinlang.org/ тут] Можна також скористуватися іншими компіляторами, наприклад, IDE Eclipse з відповідним плагіном. ==Змінні== ===Оголошення змінних=== Оголошення змінних відбувається з вказанням ключового слова var або val після чого йде назва змінної. Тип змінної можна не вказувати, тоді компілятор сам спробує визначити її тип за тим, що ви присвоюєте змінній. Змінні з ключовим словом val називають незмінюватими (immutable) або лише для читання (read-only). <syntaxhighlight lang="kotlin" line start="1"> var x=5 //оголошення цілочисельної змінної val y=5 //оголошення val змінної var num: Int // оголошення цілочисельної змінної з прямим вказанням типу var isVar= true // створення змінної типу Boolean var hugeNumber = 6L //створення змінної типу Long var letter='D' //змінна типу Char var name="Tom" // змінна типу String var x=3.14 // змінна типу Double </syntaxhighlight> Можна при оголошенні змінної зразу вказати її тип: <syntaxhighlight lang="kotlin" line start="1"> var name:String="Tom" // змінна типу String var hugeNumber2: Long =6 // змінна типу Long </syntaxhighlight> Але переважно компілятор сам визначає тип змінної, по типу значення, яке присвоюється. Проте існують випадки, коли це необхідно. Наприклад, при вказанні параметрів функції і т.п. ===Типи змінних=== Цілочисельні типи представлені типами Byte, Short, Int та Long. {| class="wikitable" style="text-align:left" ! Тип ! Біт ! Діапазон значень |- | Byte | 8 біт | -128 до 127 |- | Short | 16 біт | –32768 до 32767 |- | Int | 32 біт | –2147483648 до 2147483647 |- | Long | 64 біт | -9 223 372 036 854 775 808 (<math>-2^{63}</math>) до 9 223 372 036 854 775 807 (<math>2^{63}</math> - 1) |} Дробові числа представлені типами <code>Float</code> (32 біта) та типом <code>Double</code> (64 біта). Для представлення символів використовується тип Char. <syntaxhighlight lang="kotlin" line start="1"> var letter='D' // символи вводяться в одинарних лапках </syntaxhighlight> Для представлення рядків використовується тип String. <syntaxhighlight lang="kotlin" line start="1"> var name ="John" </syntaxhighlight> Зверніть увагу, що для присвоєння символу використовуються одинарні лапки. Подвійні лапки означають, що змінна буде типу String. Як і в іших мовах для використання спеціальних символів використовується \ (backslash). <syntaxhighlight lang="kotlin" line start="1"> var apostrophe= '\'' //використовуємо одинарну лапку/апостроф var myString="Ви ввели\n символ $apostrophe" // використовуємо символ нового рядка \n println (myString) </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Ви ввели символ ' </pre>}} Можна ввести рядок символів, який відображатиметься без змін як він введений, використовуючи потрійні лапки на початку тексту і в кінці: <syntaxhighlight lang="kotlin" line start="1"> var myString=""" Ви ввели\n поможіть бо я заплутався """ println (myString) </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Ви ввели\n поможіть бо я заплутався </pre>}} Boolean змінні застосовуються для значень true або false. <syntaxhighlight lang="kotlin" line start="1"> var isMan = true </syntaxhighlight> Також існують безнакові змінні (unsigned) цих же типів, що відповідно можуть вміщати вдвічі більші додатні числа у себе (UBite, UShort, UInt, ULong): <syntaxhighlight lang="kotlin" line start="1"> var x:UInt=5u; </syntaxhighlight> Коли в змінну необхідно записати велике число, то можна використовувати символ _ між цифрами, для кращого візуального представлення числа: <syntaxhighlight lang="kotlin" line start="1"> var x:Int=5_500_000 // ніякої помилки, все правильно </syntaxhighlight> ===Перетворення типів=== Для перетворення одного типу в інший використовуються відповідні функції, наприклад toLong(), що викликаються на відповідному об'єкті (змінній). <syntaxhighlight lang="kotlin" line start="1"> var k=65 // створиться змінна типу Int var l:Long = k.toLong() //до типу Long </syntaxhighlight> ==Коментарі== У Kotlin є три види коментарів: <syntaxhighlight lang="kotlin" line start="1"> //однорядковий коментар //новий коментар /* багаторядковий коментар */ /** * KDoc коментар * для документування функцій * та класів */ </syntaxhighlight> Тобто однорядкові коментарі починаються з двох косих рисок <code>//</code>. Багаторядкові вміщуються в символи <code>/* та */</code>. Все, що в цих символах, компілятор не сприймає як код. Останній вид коментарів застосовується для документування функцій та класів. Так, наприклад, якщо спереді функції є такий коментар, то при наведенні в місці використання на назву функції, компілятор видасть підказку з даним текстом. Всередині може спеціальним чином використовуватися опис параметрів функції: <syntaxhighlight lang="kotlin" line start="1"> /** * Ця функція обчислює суму двох цілих чисел. * @param a Перше ціле число. * @param b Друге ціле число. * @return Сума a та b. */ fun addNumbers(a: Int, b: Int): Int { return a + b } </syntaxhighlight> Детальніші про функції далі, у відповідному підрозділі. ==Привіт Світе!== Проста програма складається мінімум із одної функції main, що схоже на С/С++ чи java. <syntaxhighlight lang="kotlin" line start="1"> fun main(args: Array<String>){ // вказання аргументів функції необов'язкове val message="Привіт, Світе!" println (message) // якщо виводимо лише значення змінної pintln ("Ми говоримо: $message") //якщо вставляємо змінну в рядок println("Ми говоримо знову: "+message) // можна й так } </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Привіт, Світе! Ми говоримо: Привіт, Світе! Ми говоримо знову: Привіт, Світе! </pre>}} Зверніть увагу, що для вставляння змінної в рядок використовується знак <code>$</code> ==Читання з консолі== Ви можете прочитати з консолі введений користувачем текст або числа використовуючи функцію readln(): <syntaxhighlight lang="kotlin" line start="1"> println ("Введіть своє ім'я:") val name=readln() // читаємо ім'я (тип String) println ("Скільки вам років:") val age=readln().toInt() // читаємо і конвертуємо введений текст (String) у число (Int) println("Привіт $name ($age)") </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Введіть своє ім'я: Володимир Скільки вам років: 18 Привіт Володимир (18) </pre>}} ==Конкатенація== Оператор + може використовуватись як для додавання так і для конкатенації (з'єднання) тексту, але тут є деякі особливості: <syntaxhighlight lang="kotlin" line start="1"> println("Hello"+" Igor") // так працює, виведе два слова println((2+5)+" hello")// не працює, помилка, бо пробує до Int додати текстовий рядок </syntaxhighlight> Якщо хочемо, щоб нам зробило додаавання і з'єднало з текстовим рядком, то це можна зробити двома способами. Перший переставити місцями текст і математичний вираз: <syntaxhighlight lang="kotlin" line start="1"> println("hello "+(2+5)) // виведе: hello 7 </syntaxhighlight> Другий спосіб - поставити на початку порожній текстовий рядок: <syntaxhighlight lang="kotlin" line start="1"> println(""+(2+5)+" hello")// виведе: 7 hello </syntaxhighlight> Конкатенацію можна використовувати не тільки у функції println(): <syntaxhighlight lang="kotlin" line start="1"> val text:String=""+(5+4)+" Hello" //так теж можна </syntaxhighlight> ==Константи на рівні компіляції== Перед ключовим словом <code>val</code> можна використати ключове слово <code>const</code>. В такому разі значення константи буде підставлятися в код під час компіляції: <syntaxhighlight lang="kotlin" line start="1"> const val MY_CONST=55 fun main(){ println (MY_CONST) } </syntaxhighlight> Такі константи прийнято писати великими буквами та з використанням символів підкреслення. Вони повинні бути оголошені на початку модуля поза межами інших блоків (як то функції чи класи). Винятками є оголошення таких констант в середені спеціальних конструкцій як то object та companion object. Значення, що присвоюється має бути базового типу, як то String, Int і т.п. [[Категорія:Освоюємо Kotlin]] ==null безпечність== В Kotlin на відміну від Java не можна так просто присвоїти значення null (що означає пусто, нічого). Ви повинні передбачити, що змінна може прийняти null використавши оператор <code>?</code>: <syntaxhighlight lang="kotlin" line start="1"> val name: String? = null </syntaxhighlight> Позначивши змінну таким чином, подальші помилки на совісті програміста, що застосовуватиме змінну і в подальшому треба використовувати спеціальні оператори. Так щоб отримати довжину рядка такої змінної ми повинні використати оператор <code>!!</code>: {{XWarning|1=<span style="color: red;">'''Небезпечний код'''</span> <syntaxhighlight lang="kotlin" line start="1"> val name: String? = null println(name.length) // так не можна, помилка компіляції println (name!!.length) //так можна, але можливе аварійне завершення при виконанні </syntaxhighlight>}} Використавши два знаки оклику ми усуваємо помилку при компіляції, але можемо отримати помилку ([[Освоюємо Kotlin/Винятки|виняток]]) при виконанні програми, коли змінна буде рівна null, оскільки програма не зможе отримати довжину неіснуючого рядка. Найкращим виходом з даної ситуації є перевірка змінної на null і якщо null, то присвоїти змінній якесь інше значення. Це можна зробити використавши умову if (див. розділ "[[Освоюємо Kotlin/Умовні конструкції|Умовні конструкції]]"), або оператор <code>?:</code> (так званий елвіс оператор): <syntaxhighlight lang="kotlin" line start="1"> val name: String? = null // 'name' є nullable String val displayName: String = name ?: "Гість" // якщо 'name' рівна null, присвоюємо змінній значення "Гість" println(displayName) //вивід: Гість val nameNotNull: String? = "Іван" val displayNameNotNull: String = nameNotNull ?: "Гість" println(displayNameNotNull) // Вивід: Іван </syntaxhighlight> Приклад, коли можна отримати null, це наприклад ввід з клавіатури. Якщо ми будемо читати число так <code> val number=readln().toInt()</code>, то користувач може ввести замість числа букви, тоді перетворення до типу Int введеного тексту закінчиться аварійною ситуацією ([[Освоюємо Kotlin/Винятки|винятком]]). Ми можемо використати функцію <code>toIntOrNull()</code>, тоді якщо перетворення до типу Int буде невдале, то функція поверне null. І вже тоді можна здійснити перевірку на null і зробити певні дії: <syntaxhighlight lang="kotlin" line start="1"> fun main(){ println("Введіть ціле число:") val number:Int?=readln().toIntOrNull() if (number==null) //якщо число рівне null, то вивід "Ви ввели: не число" println("Ви ввели: не число") else // в іншому випадку виводимо наше число println("Ви ввели: $number") } </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Введіть ціле число: фіав Ви ввели: не число </pre>}} Елвіс оператор може бути більш функціональним. Так, якщо необхідно виконати якийсь код при null значенні, можна написати так: <syntaxhighlight lang="kotlin" line start="1" highlight="2-5"> val nameNotNull: String? = null val displayNameNotNull: String = nameNotNull ?: run{ println("Неправильний логін") "Гість" } println("Логін:"+displayNameNotNull) </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Неправильний логін Логін:Гість </pre>}} Останній рядок в run присвоюється змінній, яка перевірялась. Можна просто завершити виконання функції main() або будь-якої функції використавши ключове слово return <syntaxhighlight lang="kotlin" line start="1"> fun main(args: Array<String>) { val nameNotNull: String? = null val displayNameNotNull: String = nameNotNull ?: return println(displayNameNotNull) } </syntaxhighlight> В даному випадку на екран нічого не буде виведено, оскільки після return програма закінчує виконання. {{Nav}} ey3socyn0bfc7hnmlx6a7xoe4d3xslz 41364 41363 2026-08-07T16:27:18Z Володимир Груша 985 /* null безпечність */ 41364 wikitext text/x-wiki {{Nav|Освоюємо Kotlin|Основи|programming|nocat=1}} ==Серодовища розробки (IDE)== Для програмування на Kotlin вам необхідне інтегроване середовище розробки (IDE). Офіційним середовищем є IntelliJ IDEA. Його можна звантажити з офіційного сайту jetbraints [https://www.jetbrains.com/idea/ тут]. При виборі версій, вибираєм IntelliJ IDEA Community Edition - воно безкоштовне. Другий спосіб опробувати прості програми - використати віртуальний емулятор на офіційному сайті (для початку згодиться). Його можна опробувати [https://play.kotlinlang.org/ тут] Можна також скористуватися іншими компіляторами, наприклад, IDE Eclipse з відповідним плагіном. ==Змінні== ===Оголошення змінних=== Оголошення змінних відбувається з вказанням ключового слова var або val після чого йде назва змінної. Тип змінної можна не вказувати, тоді компілятор сам спробує визначити її тип за тим, що ви присвоюєте змінній. Змінні з ключовим словом val називають незмінюватими (immutable) або лише для читання (read-only). <syntaxhighlight lang="kotlin" line start="1"> var x=5 //оголошення цілочисельної змінної val y=5 //оголошення val змінної var num: Int // оголошення цілочисельної змінної з прямим вказанням типу var isVar= true // створення змінної типу Boolean var hugeNumber = 6L //створення змінної типу Long var letter='D' //змінна типу Char var name="Tom" // змінна типу String var x=3.14 // змінна типу Double </syntaxhighlight> Можна при оголошенні змінної зразу вказати її тип: <syntaxhighlight lang="kotlin" line start="1"> var name:String="Tom" // змінна типу String var hugeNumber2: Long =6 // змінна типу Long </syntaxhighlight> Але переважно компілятор сам визначає тип змінної, по типу значення, яке присвоюється. Проте існують випадки, коли це необхідно. Наприклад, при вказанні параметрів функції і т.п. ===Типи змінних=== Цілочисельні типи представлені типами Byte, Short, Int та Long. {| class="wikitable" style="text-align:left" ! Тип ! Біт ! Діапазон значень |- | Byte | 8 біт | -128 до 127 |- | Short | 16 біт | –32768 до 32767 |- | Int | 32 біт | –2147483648 до 2147483647 |- | Long | 64 біт | -9 223 372 036 854 775 808 (<math>-2^{63}</math>) до 9 223 372 036 854 775 807 (<math>2^{63}</math> - 1) |} Дробові числа представлені типами <code>Float</code> (32 біта) та типом <code>Double</code> (64 біта). Для представлення символів використовується тип Char. <syntaxhighlight lang="kotlin" line start="1"> var letter='D' // символи вводяться в одинарних лапках </syntaxhighlight> Для представлення рядків використовується тип String. <syntaxhighlight lang="kotlin" line start="1"> var name ="John" </syntaxhighlight> Зверніть увагу, що для присвоєння символу використовуються одинарні лапки. Подвійні лапки означають, що змінна буде типу String. Як і в іших мовах для використання спеціальних символів використовується \ (backslash). <syntaxhighlight lang="kotlin" line start="1"> var apostrophe= '\'' //використовуємо одинарну лапку/апостроф var myString="Ви ввели\n символ $apostrophe" // використовуємо символ нового рядка \n println (myString) </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Ви ввели символ ' </pre>}} Можна ввести рядок символів, який відображатиметься без змін як він введений, використовуючи потрійні лапки на початку тексту і в кінці: <syntaxhighlight lang="kotlin" line start="1"> var myString=""" Ви ввели\n поможіть бо я заплутався """ println (myString) </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Ви ввели\n поможіть бо я заплутався </pre>}} Boolean змінні застосовуються для значень true або false. <syntaxhighlight lang="kotlin" line start="1"> var isMan = true </syntaxhighlight> Також існують безнакові змінні (unsigned) цих же типів, що відповідно можуть вміщати вдвічі більші додатні числа у себе (UBite, UShort, UInt, ULong): <syntaxhighlight lang="kotlin" line start="1"> var x:UInt=5u; </syntaxhighlight> Коли в змінну необхідно записати велике число, то можна використовувати символ _ між цифрами, для кращого візуального представлення числа: <syntaxhighlight lang="kotlin" line start="1"> var x:Int=5_500_000 // ніякої помилки, все правильно </syntaxhighlight> ===Перетворення типів=== Для перетворення одного типу в інший використовуються відповідні функції, наприклад toLong(), що викликаються на відповідному об'єкті (змінній). <syntaxhighlight lang="kotlin" line start="1"> var k=65 // створиться змінна типу Int var l:Long = k.toLong() //до типу Long </syntaxhighlight> ==Коментарі== У Kotlin є три види коментарів: <syntaxhighlight lang="kotlin" line start="1"> //однорядковий коментар //новий коментар /* багаторядковий коментар */ /** * KDoc коментар * для документування функцій * та класів */ </syntaxhighlight> Тобто однорядкові коментарі починаються з двох косих рисок <code>//</code>. Багаторядкові вміщуються в символи <code>/* та */</code>. Все, що в цих символах, компілятор не сприймає як код. Останній вид коментарів застосовується для документування функцій та класів. Так, наприклад, якщо спереді функції є такий коментар, то при наведенні в місці використання на назву функції, компілятор видасть підказку з даним текстом. Всередині може спеціальним чином використовуватися опис параметрів функції: <syntaxhighlight lang="kotlin" line start="1"> /** * Ця функція обчислює суму двох цілих чисел. * @param a Перше ціле число. * @param b Друге ціле число. * @return Сума a та b. */ fun addNumbers(a: Int, b: Int): Int { return a + b } </syntaxhighlight> Детальніші про функції далі, у відповідному підрозділі. ==Привіт Світе!== Проста програма складається мінімум із одної функції main, що схоже на С/С++ чи java. <syntaxhighlight lang="kotlin" line start="1"> fun main(args: Array<String>){ // вказання аргументів функції необов'язкове val message="Привіт, Світе!" println (message) // якщо виводимо лише значення змінної pintln ("Ми говоримо: $message") //якщо вставляємо змінну в рядок println("Ми говоримо знову: "+message) // можна й так } </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Привіт, Світе! Ми говоримо: Привіт, Світе! Ми говоримо знову: Привіт, Світе! </pre>}} Зверніть увагу, що для вставляння змінної в рядок використовується знак <code>$</code> ==Читання з консолі== Ви можете прочитати з консолі введений користувачем текст або числа використовуючи функцію readln(): <syntaxhighlight lang="kotlin" line start="1"> println ("Введіть своє ім'я:") val name=readln() // читаємо ім'я (тип String) println ("Скільки вам років:") val age=readln().toInt() // читаємо і конвертуємо введений текст (String) у число (Int) println("Привіт $name ($age)") </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Введіть своє ім'я: Володимир Скільки вам років: 18 Привіт Володимир (18) </pre>}} ==Конкатенація== Оператор + може використовуватись як для додавання так і для конкатенації (з'єднання) тексту, але тут є деякі особливості: <syntaxhighlight lang="kotlin" line start="1"> println("Hello"+" Igor") // так працює, виведе два слова println((2+5)+" hello")// не працює, помилка, бо пробує до Int додати текстовий рядок </syntaxhighlight> Якщо хочемо, щоб нам зробило додаавання і з'єднало з текстовим рядком, то це можна зробити двома способами. Перший переставити місцями текст і математичний вираз: <syntaxhighlight lang="kotlin" line start="1"> println("hello "+(2+5)) // виведе: hello 7 </syntaxhighlight> Другий спосіб - поставити на початку порожній текстовий рядок: <syntaxhighlight lang="kotlin" line start="1"> println(""+(2+5)+" hello")// виведе: 7 hello </syntaxhighlight> Конкатенацію можна використовувати не тільки у функції println(): <syntaxhighlight lang="kotlin" line start="1"> val text:String=""+(5+4)+" Hello" //так теж можна </syntaxhighlight> ==Константи на рівні компіляції== Перед ключовим словом <code>val</code> можна використати ключове слово <code>const</code>. В такому разі значення константи буде підставлятися в код під час компіляції: <syntaxhighlight lang="kotlin" line start="1"> const val MY_CONST=55 fun main(){ println (MY_CONST) } </syntaxhighlight> Такі константи прийнято писати великими буквами та з використанням символів підкреслення. Вони повинні бути оголошені на початку модуля поза межами інших блоків (як то функції чи класи). Винятками є оголошення таких констант в середені спеціальних конструкцій як то object та companion object. Значення, що присвоюється має бути базового типу, як то String, Int і т.п. [[Категорія:Освоюємо Kotlin]] ==null безпечність== В Kotlin на відміну від Java не можна так просто присвоїти значення null (що означає пусто, нічого). Ви повинні передбачити, що змінна може прийняти null використавши оператор <code>?</code>: <syntaxhighlight lang="kotlin" line start="1"> val name: String? = null </syntaxhighlight> Позначивши змінну таким чином, подальші помилки на совісті програміста, що застосовуватиме змінну і в подальшому треба використовувати спеціальні оператори. Так щоб отримати довжину рядка такої змінної ми повинні використати оператор <code>!!</code>: {{XWarning|1=<span style="color: red;">'''Небезпечний код'''</span> <syntaxhighlight lang="kotlin" line start="1"> val name: String? = null println(name.length) // так не можна, помилка компіляції println (name!!.length) //так можна, але можливе аварійне завершення при виконанні </syntaxhighlight>}} Використавши два знаки оклику ми усуваємо помилку при компіляції, але можемо отримати аварійне завершення програми ([[Освоюємо Kotlin/Винятки|виняток]]), коли змінна буде рівна null, оскільки програма не зможе отримати довжину неіснуючого рядка. Можна з допомогою ? здійснити так званий безпечний виклик. <syntaxhighlight lang="kotlin" line start="1"> val name: String? = null val length: Int? = name?.length </syntaxhighlight>}} В цьому разі програме провіряє length на null і якщо null, то змінній length буде присвоєно теж null і не буде обчислена довжина рядка. Таким чином наш null передався далі, але рано чи пізно нам буде необхідна перевірка змінної на null і якщо null, то здійснити якісь дії. Наприклад, можна присвоїти змінній якесь інше значення. Це можна зробити використавши умову if (див. розділ "[[Освоюємо Kotlin/Умовні конструкції|Умовні конструкції]]"), або оператор <code>?:</code> (так званий "елвіс оператор"): <syntaxhighlight lang="kotlin" line start="1"> val name: String? = null // 'name' є nullable String val displayName: String = name ?: "Гість" // якщо 'name' рівна null, присвоюємо змінній значення "Гість" println(displayName) //вивід: Гість val nameNotNull: String? = "Іван" val displayNameNotNull: String = nameNotNull ?: "Гість" println(displayNameNotNull) // Вивід: Іван </syntaxhighlight> Приклад, коли можна отримати null, це наприклад ввід з клавіатури. Якщо ми будемо читати число так <code> val number=readln().toInt()</code>, то користувач може ввести замість числа букви, тоді перетворення до типу Int введеного тексту закінчиться аварійною ситуацією ([[Освоюємо Kotlin/Винятки|винятком]]). Ми можемо використати функцію <code>toIntOrNull()</code>, тоді якщо перетворення до типу Int буде невдале, то функція поверне null. І вже тоді можна здійснити перевірку на null і зробити певні дії: <syntaxhighlight lang="kotlin" line start="1"> fun main(){ println("Введіть ціле число:") val number:Int?=readln().toIntOrNull() if (number==null) //якщо число рівне null, то вивід "Ви ввели: не число" println("Ви ввели: не число") else // в іншому випадку виводимо наше число println("Ви ввели: $number") } </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Введіть ціле число: фіав Ви ввели: не число </pre>}} Елвіс оператор може бути більш функціональним. Так, якщо необхідно виконати якийсь код при null значенні, можна написати так: <syntaxhighlight lang="kotlin" line start="1" highlight="2-5"> val nameNotNull: String? = null val displayNameNotNull: String = nameNotNull ?: run{ println("Неправильний логін") "Гість" } println("Логін:"+displayNameNotNull) </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Неправильний логін Логін:Гість </pre>}} Останній рядок в run присвоюється змінній, яка перевірялась. Можна просто завершити виконання функції main() або будь-якої функції використавши ключове слово return <syntaxhighlight lang="kotlin" line start="1"> fun main(args: Array<String>) { val nameNotNull: String? = null val displayNameNotNull: String = nameNotNull ?: return println(displayNameNotNull) } </syntaxhighlight> В даному випадку на екран нічого не буде виведено, оскільки після return програма закінчує виконання. {{Nav}} acy0kewbmxlmzthl7be85vkk2xodn8o 41365 41364 2026-08-07T16:29:29Z Володимир Груша 985 /* null безпечність */ 41365 wikitext text/x-wiki {{Nav|Освоюємо Kotlin|Основи|programming|nocat=1}} ==Серодовища розробки (IDE)== Для програмування на Kotlin вам необхідне інтегроване середовище розробки (IDE). Офіційним середовищем є IntelliJ IDEA. Його можна звантажити з офіційного сайту jetbraints [https://www.jetbrains.com/idea/ тут]. При виборі версій, вибираєм IntelliJ IDEA Community Edition - воно безкоштовне. Другий спосіб опробувати прості програми - використати віртуальний емулятор на офіційному сайті (для початку згодиться). Його можна опробувати [https://play.kotlinlang.org/ тут] Можна також скористуватися іншими компіляторами, наприклад, IDE Eclipse з відповідним плагіном. ==Змінні== ===Оголошення змінних=== Оголошення змінних відбувається з вказанням ключового слова var або val після чого йде назва змінної. Тип змінної можна не вказувати, тоді компілятор сам спробує визначити її тип за тим, що ви присвоюєте змінній. Змінні з ключовим словом val називають незмінюватими (immutable) або лише для читання (read-only). <syntaxhighlight lang="kotlin" line start="1"> var x=5 //оголошення цілочисельної змінної val y=5 //оголошення val змінної var num: Int // оголошення цілочисельної змінної з прямим вказанням типу var isVar= true // створення змінної типу Boolean var hugeNumber = 6L //створення змінної типу Long var letter='D' //змінна типу Char var name="Tom" // змінна типу String var x=3.14 // змінна типу Double </syntaxhighlight> Можна при оголошенні змінної зразу вказати її тип: <syntaxhighlight lang="kotlin" line start="1"> var name:String="Tom" // змінна типу String var hugeNumber2: Long =6 // змінна типу Long </syntaxhighlight> Але переважно компілятор сам визначає тип змінної, по типу значення, яке присвоюється. Проте існують випадки, коли це необхідно. Наприклад, при вказанні параметрів функції і т.п. ===Типи змінних=== Цілочисельні типи представлені типами Byte, Short, Int та Long. {| class="wikitable" style="text-align:left" ! Тип ! Біт ! Діапазон значень |- | Byte | 8 біт | -128 до 127 |- | Short | 16 біт | –32768 до 32767 |- | Int | 32 біт | –2147483648 до 2147483647 |- | Long | 64 біт | -9 223 372 036 854 775 808 (<math>-2^{63}</math>) до 9 223 372 036 854 775 807 (<math>2^{63}</math> - 1) |} Дробові числа представлені типами <code>Float</code> (32 біта) та типом <code>Double</code> (64 біта). Для представлення символів використовується тип Char. <syntaxhighlight lang="kotlin" line start="1"> var letter='D' // символи вводяться в одинарних лапках </syntaxhighlight> Для представлення рядків використовується тип String. <syntaxhighlight lang="kotlin" line start="1"> var name ="John" </syntaxhighlight> Зверніть увагу, що для присвоєння символу використовуються одинарні лапки. Подвійні лапки означають, що змінна буде типу String. Як і в іших мовах для використання спеціальних символів використовується \ (backslash). <syntaxhighlight lang="kotlin" line start="1"> var apostrophe= '\'' //використовуємо одинарну лапку/апостроф var myString="Ви ввели\n символ $apostrophe" // використовуємо символ нового рядка \n println (myString) </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Ви ввели символ ' </pre>}} Можна ввести рядок символів, який відображатиметься без змін як він введений, використовуючи потрійні лапки на початку тексту і в кінці: <syntaxhighlight lang="kotlin" line start="1"> var myString=""" Ви ввели\n поможіть бо я заплутався """ println (myString) </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Ви ввели\n поможіть бо я заплутався </pre>}} Boolean змінні застосовуються для значень true або false. <syntaxhighlight lang="kotlin" line start="1"> var isMan = true </syntaxhighlight> Також існують безнакові змінні (unsigned) цих же типів, що відповідно можуть вміщати вдвічі більші додатні числа у себе (UBite, UShort, UInt, ULong): <syntaxhighlight lang="kotlin" line start="1"> var x:UInt=5u; </syntaxhighlight> Коли в змінну необхідно записати велике число, то можна використовувати символ _ між цифрами, для кращого візуального представлення числа: <syntaxhighlight lang="kotlin" line start="1"> var x:Int=5_500_000 // ніякої помилки, все правильно </syntaxhighlight> ===Перетворення типів=== Для перетворення одного типу в інший використовуються відповідні функції, наприклад toLong(), що викликаються на відповідному об'єкті (змінній). <syntaxhighlight lang="kotlin" line start="1"> var k=65 // створиться змінна типу Int var l:Long = k.toLong() //до типу Long </syntaxhighlight> ==Коментарі== У Kotlin є три види коментарів: <syntaxhighlight lang="kotlin" line start="1"> //однорядковий коментар //новий коментар /* багаторядковий коментар */ /** * KDoc коментар * для документування функцій * та класів */ </syntaxhighlight> Тобто однорядкові коментарі починаються з двох косих рисок <code>//</code>. Багаторядкові вміщуються в символи <code>/* та */</code>. Все, що в цих символах, компілятор не сприймає як код. Останній вид коментарів застосовується для документування функцій та класів. Так, наприклад, якщо спереді функції є такий коментар, то при наведенні в місці використання на назву функції, компілятор видасть підказку з даним текстом. Всередині може спеціальним чином використовуватися опис параметрів функції: <syntaxhighlight lang="kotlin" line start="1"> /** * Ця функція обчислює суму двох цілих чисел. * @param a Перше ціле число. * @param b Друге ціле число. * @return Сума a та b. */ fun addNumbers(a: Int, b: Int): Int { return a + b } </syntaxhighlight> Детальніші про функції далі, у відповідному підрозділі. ==Привіт Світе!== Проста програма складається мінімум із одної функції main, що схоже на С/С++ чи java. <syntaxhighlight lang="kotlin" line start="1"> fun main(args: Array<String>){ // вказання аргументів функції необов'язкове val message="Привіт, Світе!" println (message) // якщо виводимо лише значення змінної pintln ("Ми говоримо: $message") //якщо вставляємо змінну в рядок println("Ми говоримо знову: "+message) // можна й так } </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Привіт, Світе! Ми говоримо: Привіт, Світе! Ми говоримо знову: Привіт, Світе! </pre>}} Зверніть увагу, що для вставляння змінної в рядок використовується знак <code>$</code> ==Читання з консолі== Ви можете прочитати з консолі введений користувачем текст або числа використовуючи функцію readln(): <syntaxhighlight lang="kotlin" line start="1"> println ("Введіть своє ім'я:") val name=readln() // читаємо ім'я (тип String) println ("Скільки вам років:") val age=readln().toInt() // читаємо і конвертуємо введений текст (String) у число (Int) println("Привіт $name ($age)") </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Введіть своє ім'я: Володимир Скільки вам років: 18 Привіт Володимир (18) </pre>}} ==Конкатенація== Оператор + може використовуватись як для додавання так і для конкатенації (з'єднання) тексту, але тут є деякі особливості: <syntaxhighlight lang="kotlin" line start="1"> println("Hello"+" Igor") // так працює, виведе два слова println((2+5)+" hello")// не працює, помилка, бо пробує до Int додати текстовий рядок </syntaxhighlight> Якщо хочемо, щоб нам зробило додаавання і з'єднало з текстовим рядком, то це можна зробити двома способами. Перший переставити місцями текст і математичний вираз: <syntaxhighlight lang="kotlin" line start="1"> println("hello "+(2+5)) // виведе: hello 7 </syntaxhighlight> Другий спосіб - поставити на початку порожній текстовий рядок: <syntaxhighlight lang="kotlin" line start="1"> println(""+(2+5)+" hello")// виведе: 7 hello </syntaxhighlight> Конкатенацію можна використовувати не тільки у функції println(): <syntaxhighlight lang="kotlin" line start="1"> val text:String=""+(5+4)+" Hello" //так теж можна </syntaxhighlight> ==Константи на рівні компіляції== Перед ключовим словом <code>val</code> можна використати ключове слово <code>const</code>. В такому разі значення константи буде підставлятися в код під час компіляції: <syntaxhighlight lang="kotlin" line start="1"> const val MY_CONST=55 fun main(){ println (MY_CONST) } </syntaxhighlight> Такі константи прийнято писати великими буквами та з використанням символів підкреслення. Вони повинні бути оголошені на початку модуля поза межами інших блоків (як то функції чи класи). Винятками є оголошення таких констант в середені спеціальних конструкцій як то object та companion object. Значення, що присвоюється має бути базового типу, як то String, Int і т.п. [[Категорія:Освоюємо Kotlin]] ==null безпечність== В Kotlin на відміну від Java не можна так просто присвоїти значення null (що означає пусто, нічого). Ви повинні передбачити, що змінна може прийняти null використавши оператор <code>?</code>: <syntaxhighlight lang="kotlin" line start="1"> val name: String? = null </syntaxhighlight> Позначивши змінну таким чином, подальші помилки на совісті програміста, що застосовуватиме змінну і в подальшому треба використовувати спеціальні оператори. Так щоб отримати довжину рядка такої змінної ми повинні використати оператор <code>!!</code>: {{XWarning|1=<span style="color: red;">'''Небезпечний код'''</span> <syntaxhighlight lang="kotlin" line start="1"> val name: String? = null println(name.length) // так не можна, помилка компіляції println (name!!.length) //так можна, але можливе аварійне завершення при виконанні </syntaxhighlight>}} Використавши два знаки оклику ми усуваємо помилку при компіляції, але можемо отримати аварійне завершення програми ([[Освоюємо Kotlin/Винятки|виняток]]), коли змінна буде рівна null, оскільки програма не зможе отримати довжину неіснуючого рядка. Можна з допомогою ? здійснити так званий безпечний виклик. <syntaxhighlight lang="kotlin" line start="1"> val name: String? = null val length: Int? = name?.length </syntaxhighlight> В цьому разі програме провіряє length на null і якщо null, то змінній length буде присвоєно теж null і не буде обчислена довжина рядка. Таким чином наш null передався далі, але рано чи пізно нам буде необхідна перевірка змінної на null і якщо null, то здійснити якісь дії. Наприклад, можна присвоїти змінній якесь інше значення. Це можна зробити використавши умову if (див. розділ "[[Освоюємо Kotlin/Умовні конструкції|Умовні конструкції]]"), або оператор <code>?:</code> (так званий "елвіс оператор"): <syntaxhighlight lang="kotlin" line start="1"> val name: String? = null // 'name' є nullable String val displayName: String = name ?: "Гість" // якщо 'name' рівна null, присвоюємо змінній значення "Гість" println(displayName) //вивід: Гість val nameNotNull: String? = "Іван" val displayNameNotNull: String = nameNotNull ?: "Гість" println(displayNameNotNull) // Вивід: Іван </syntaxhighlight> Приклад, коли можна отримати null, це наприклад ввід з клавіатури. Якщо ми будемо читати число так <code> val number=readln().toInt()</code>, то користувач може ввести замість числа букви, тоді перетворення до типу Int введеного тексту закінчиться аварійною ситуацією ([[Освоюємо Kotlin/Винятки|винятком]]). Ми можемо використати функцію <code>toIntOrNull()</code>, тоді якщо перетворення до типу Int буде невдале, то функція поверне null. І вже тоді можна здійснити перевірку на null і зробити певні дії: <syntaxhighlight lang="kotlin" line start="1"> fun main(){ println("Введіть ціле число:") val number:Int?=readln().toIntOrNull() if (number==null) //якщо число рівне null, то вивід "Ви ввели: не число" println("Ви ввели: не число") else // в іншому випадку виводимо наше число println("Ви ввели: $number") } </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Введіть ціле число: фіав Ви ввели: не число </pre>}} Елвіс оператор може бути більш функціональним. Так, якщо необхідно виконати якийсь код при null значенні, можна написати так: <syntaxhighlight lang="kotlin" line start="1" highlight="2-5"> val nameNotNull: String? = null val displayNameNotNull: String = nameNotNull ?: run{ println("Неправильний логін") "Гість" } println("Логін:"+displayNameNotNull) </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Неправильний логін Логін:Гість </pre>}} Останній рядок в run присвоюється змінній, яка перевірялась. Можна просто завершити виконання функції main() або будь-якої функції використавши ключове слово return <syntaxhighlight lang="kotlin" line start="1"> fun main(args: Array<String>) { val nameNotNull: String? = null val displayNameNotNull: String = nameNotNull ?: return println(displayNameNotNull) } </syntaxhighlight> В даному випадку на екран нічого не буде виведено, оскільки після return програма закінчує виконання. {{Nav}} lmy1rf5v9tahtnar3k04o03bovd5m4f 41366 41365 2026-08-07T16:40:59Z Володимир Груша 985 /* null безпечність */ 41366 wikitext text/x-wiki {{Nav|Освоюємо Kotlin|Основи|programming|nocat=1}} ==Серодовища розробки (IDE)== Для програмування на Kotlin вам необхідне інтегроване середовище розробки (IDE). Офіційним середовищем є IntelliJ IDEA. Його можна звантажити з офіційного сайту jetbraints [https://www.jetbrains.com/idea/ тут]. При виборі версій, вибираєм IntelliJ IDEA Community Edition - воно безкоштовне. Другий спосіб опробувати прості програми - використати віртуальний емулятор на офіційному сайті (для початку згодиться). Його можна опробувати [https://play.kotlinlang.org/ тут] Можна також скористуватися іншими компіляторами, наприклад, IDE Eclipse з відповідним плагіном. ==Змінні== ===Оголошення змінних=== Оголошення змінних відбувається з вказанням ключового слова var або val після чого йде назва змінної. Тип змінної можна не вказувати, тоді компілятор сам спробує визначити її тип за тим, що ви присвоюєте змінній. Змінні з ключовим словом val називають незмінюватими (immutable) або лише для читання (read-only). <syntaxhighlight lang="kotlin" line start="1"> var x=5 //оголошення цілочисельної змінної val y=5 //оголошення val змінної var num: Int // оголошення цілочисельної змінної з прямим вказанням типу var isVar= true // створення змінної типу Boolean var hugeNumber = 6L //створення змінної типу Long var letter='D' //змінна типу Char var name="Tom" // змінна типу String var x=3.14 // змінна типу Double </syntaxhighlight> Можна при оголошенні змінної зразу вказати її тип: <syntaxhighlight lang="kotlin" line start="1"> var name:String="Tom" // змінна типу String var hugeNumber2: Long =6 // змінна типу Long </syntaxhighlight> Але переважно компілятор сам визначає тип змінної, по типу значення, яке присвоюється. Проте існують випадки, коли це необхідно. Наприклад, при вказанні параметрів функції і т.п. ===Типи змінних=== Цілочисельні типи представлені типами Byte, Short, Int та Long. {| class="wikitable" style="text-align:left" ! Тип ! Біт ! Діапазон значень |- | Byte | 8 біт | -128 до 127 |- | Short | 16 біт | –32768 до 32767 |- | Int | 32 біт | –2147483648 до 2147483647 |- | Long | 64 біт | -9 223 372 036 854 775 808 (<math>-2^{63}</math>) до 9 223 372 036 854 775 807 (<math>2^{63}</math> - 1) |} Дробові числа представлені типами <code>Float</code> (32 біта) та типом <code>Double</code> (64 біта). Для представлення символів використовується тип Char. <syntaxhighlight lang="kotlin" line start="1"> var letter='D' // символи вводяться в одинарних лапках </syntaxhighlight> Для представлення рядків використовується тип String. <syntaxhighlight lang="kotlin" line start="1"> var name ="John" </syntaxhighlight> Зверніть увагу, що для присвоєння символу використовуються одинарні лапки. Подвійні лапки означають, що змінна буде типу String. Як і в іших мовах для використання спеціальних символів використовується \ (backslash). <syntaxhighlight lang="kotlin" line start="1"> var apostrophe= '\'' //використовуємо одинарну лапку/апостроф var myString="Ви ввели\n символ $apostrophe" // використовуємо символ нового рядка \n println (myString) </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Ви ввели символ ' </pre>}} Можна ввести рядок символів, який відображатиметься без змін як він введений, використовуючи потрійні лапки на початку тексту і в кінці: <syntaxhighlight lang="kotlin" line start="1"> var myString=""" Ви ввели\n поможіть бо я заплутався """ println (myString) </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Ви ввели\n поможіть бо я заплутався </pre>}} Boolean змінні застосовуються для значень true або false. <syntaxhighlight lang="kotlin" line start="1"> var isMan = true </syntaxhighlight> Також існують безнакові змінні (unsigned) цих же типів, що відповідно можуть вміщати вдвічі більші додатні числа у себе (UBite, UShort, UInt, ULong): <syntaxhighlight lang="kotlin" line start="1"> var x:UInt=5u; </syntaxhighlight> Коли в змінну необхідно записати велике число, то можна використовувати символ _ між цифрами, для кращого візуального представлення числа: <syntaxhighlight lang="kotlin" line start="1"> var x:Int=5_500_000 // ніякої помилки, все правильно </syntaxhighlight> ===Перетворення типів=== Для перетворення одного типу в інший використовуються відповідні функції, наприклад toLong(), що викликаються на відповідному об'єкті (змінній). <syntaxhighlight lang="kotlin" line start="1"> var k=65 // створиться змінна типу Int var l:Long = k.toLong() //до типу Long </syntaxhighlight> ==Коментарі== У Kotlin є три види коментарів: <syntaxhighlight lang="kotlin" line start="1"> //однорядковий коментар //новий коментар /* багаторядковий коментар */ /** * KDoc коментар * для документування функцій * та класів */ </syntaxhighlight> Тобто однорядкові коментарі починаються з двох косих рисок <code>//</code>. Багаторядкові вміщуються в символи <code>/* та */</code>. Все, що в цих символах, компілятор не сприймає як код. Останній вид коментарів застосовується для документування функцій та класів. Так, наприклад, якщо спереді функції є такий коментар, то при наведенні в місці використання на назву функції, компілятор видасть підказку з даним текстом. Всередині може спеціальним чином використовуватися опис параметрів функції: <syntaxhighlight lang="kotlin" line start="1"> /** * Ця функція обчислює суму двох цілих чисел. * @param a Перше ціле число. * @param b Друге ціле число. * @return Сума a та b. */ fun addNumbers(a: Int, b: Int): Int { return a + b } </syntaxhighlight> Детальніші про функції далі, у відповідному підрозділі. ==Привіт Світе!== Проста програма складається мінімум із одної функції main, що схоже на С/С++ чи java. <syntaxhighlight lang="kotlin" line start="1"> fun main(args: Array<String>){ // вказання аргументів функції необов'язкове val message="Привіт, Світе!" println (message) // якщо виводимо лише значення змінної pintln ("Ми говоримо: $message") //якщо вставляємо змінну в рядок println("Ми говоримо знову: "+message) // можна й так } </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Привіт, Світе! Ми говоримо: Привіт, Світе! Ми говоримо знову: Привіт, Світе! </pre>}} Зверніть увагу, що для вставляння змінної в рядок використовується знак <code>$</code> ==Читання з консолі== Ви можете прочитати з консолі введений користувачем текст або числа використовуючи функцію readln(): <syntaxhighlight lang="kotlin" line start="1"> println ("Введіть своє ім'я:") val name=readln() // читаємо ім'я (тип String) println ("Скільки вам років:") val age=readln().toInt() // читаємо і конвертуємо введений текст (String) у число (Int) println("Привіт $name ($age)") </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Введіть своє ім'я: Володимир Скільки вам років: 18 Привіт Володимир (18) </pre>}} ==Конкатенація== Оператор + може використовуватись як для додавання так і для конкатенації (з'єднання) тексту, але тут є деякі особливості: <syntaxhighlight lang="kotlin" line start="1"> println("Hello"+" Igor") // так працює, виведе два слова println((2+5)+" hello")// не працює, помилка, бо пробує до Int додати текстовий рядок </syntaxhighlight> Якщо хочемо, щоб нам зробило додаавання і з'єднало з текстовим рядком, то це можна зробити двома способами. Перший переставити місцями текст і математичний вираз: <syntaxhighlight lang="kotlin" line start="1"> println("hello "+(2+5)) // виведе: hello 7 </syntaxhighlight> Другий спосіб - поставити на початку порожній текстовий рядок: <syntaxhighlight lang="kotlin" line start="1"> println(""+(2+5)+" hello")// виведе: 7 hello </syntaxhighlight> Конкатенацію можна використовувати не тільки у функції println(): <syntaxhighlight lang="kotlin" line start="1"> val text:String=""+(5+4)+" Hello" //так теж можна </syntaxhighlight> ==Константи на рівні компіляції== Перед ключовим словом <code>val</code> можна використати ключове слово <code>const</code>. В такому разі значення константи буде підставлятися в код під час компіляції: <syntaxhighlight lang="kotlin" line start="1"> const val MY_CONST=55 fun main(){ println (MY_CONST) } </syntaxhighlight> Такі константи прийнято писати великими буквами та з використанням символів підкреслення. Вони повинні бути оголошені на початку модуля поза межами інших блоків (як то функції чи класи). Винятками є оголошення таких констант в середені спеціальних конструкцій як то object та companion object. Значення, що присвоюється має бути базового типу, як то String, Int і т.п. [[Категорія:Освоюємо Kotlin]] ==null безпечність== В Kotlin на відміну від Java не можна так просто присвоїти значення null (що означає пусто, нічого). Ви повинні передбачити, що змінна може прийняти null використавши оператор <code>?</code>: <syntaxhighlight lang="kotlin" line start="1"> val name: String? = null </syntaxhighlight> Позначивши змінну таким чином, подальші помилки на совісті програміста, що застосовуватиме змінну і в подальшому треба використовувати спеціальні оператори. Так щоб отримати довжину рядка такої змінної ми повинні використати оператор <code>!!</code>: {{XWarning|1=<span style="color: red;">'''Небезпечний код'''</span> <syntaxhighlight lang="kotlin" line start="1"> val name: String? = null println(name.length) // так не можна, помилка компіляції println (name!!.length) //так можна, але можливе аварійне завершення при виконанні </syntaxhighlight>}} Використавши два знаки оклику ми усуваємо помилку при компіляції, але можемо отримати аварійне завершення програми ([[Освоюємо Kotlin/Винятки|виняток]]), коли змінна буде рівна null, оскільки програма не зможе отримати довжину неіснуючого рядка. Можна з допомогою <code>?</code> здійснити так званий безпечний виклик. <syntaxhighlight lang="kotlin" line start="1"> val name: String? = null val length: Int? = name?.length </syntaxhighlight> В цьому разі програме провіряє length на null і якщо null, то змінній length буде присвоєно теж null і не буде обчислена довжина рядка. Таким чином наш null передався далі, але рано чи пізно нам буде необхідна перевірка змінної на null і якщо null, то здійснити якісь дії. Наприклад, можна присвоїти змінній якесь інше значення. Це можна зробити використавши умову if (див. розділ "[[Освоюємо Kotlin/Умовні конструкції|Умовні конструкції]]"), або оператор <code>?:</code> (так званий "елвіс оператор"): <syntaxhighlight lang="kotlin" line start="1"> val name: String? = null // 'name' є nullable String val displayName: String = name ?: "Гість" // якщо 'name' рівна null, присвоюємо змінній значення "Гість" println(displayName) //вивід: Гість val nameNotNull: String? = "Іван" val displayNameNotNull: String = nameNotNull ?: "Гість" println(displayNameNotNull) // Вивід: Іван </syntaxhighlight> Приклад, коли можна отримати null, це наприклад ввід з клавіатури. Якщо ми будемо читати число так <code> val number=readln().toInt()</code>, то користувач може ввести замість числа букви, тоді перетворення до типу Int введеного тексту закінчиться аварійною ситуацією ([[Освоюємо Kotlin/Винятки|винятком]]). Ми можемо використати функцію <code>toIntOrNull()</code>, тоді якщо перетворення до типу Int буде невдале, то функція поверне null. І вже тоді можна здійснити перевірку на null і зробити певні дії: <syntaxhighlight lang="kotlin" line start="1"> fun main(){ println("Введіть ціле число:") val number:Int?=readln().toIntOrNull() if (number==null) //якщо число рівне null, то вивід "Ви ввели: не число" println("Ви ввели: не число") else // в іншому випадку виводимо наше число println("Ви ввели: $number") } </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Введіть ціле число: фіав Ви ввели: не число </pre>}} Елвіс оператор може бути більш функціональним. Так, якщо необхідно виконати якийсь код при null значенні, можна написати так: <syntaxhighlight lang="kotlin" line start="1" highlight="2-5"> val nameNotNull: String? = null val displayNameNotNull: String = nameNotNull ?: run{ println("Неправильний логін") "Гість" } println("Логін:"+displayNameNotNull) </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Неправильний логін Логін:Гість </pre>}} Останній рядок в run присвоюється змінній, яка перевірялась. Можна просто завершити виконання функції main() або будь-якої функції використавши ключове слово return <syntaxhighlight lang="kotlin" line start="1"> fun main(args: Array<String>) { val nameNotNull: String? = null val displayNameNotNull: String = nameNotNull ?: return println(displayNameNotNull) } </syntaxhighlight> В даному випадку на екран нічого не буде виведено, оскільки після return програма закінчує виконання. {{Nav}} hig4vmq4aorow1nhvt2t5iziuh9jr6h 41367 41366 2026-08-07T16:41:54Z Володимир Груша 985 /* null безпечність */ 41367 wikitext text/x-wiki {{Nav|Освоюємо Kotlin|Основи|programming|nocat=1}} ==Серодовища розробки (IDE)== Для програмування на Kotlin вам необхідне інтегроване середовище розробки (IDE). Офіційним середовищем є IntelliJ IDEA. Його можна звантажити з офіційного сайту jetbraints [https://www.jetbrains.com/idea/ тут]. При виборі версій, вибираєм IntelliJ IDEA Community Edition - воно безкоштовне. Другий спосіб опробувати прості програми - використати віртуальний емулятор на офіційному сайті (для початку згодиться). Його можна опробувати [https://play.kotlinlang.org/ тут] Можна також скористуватися іншими компіляторами, наприклад, IDE Eclipse з відповідним плагіном. ==Змінні== ===Оголошення змінних=== Оголошення змінних відбувається з вказанням ключового слова var або val після чого йде назва змінної. Тип змінної можна не вказувати, тоді компілятор сам спробує визначити її тип за тим, що ви присвоюєте змінній. Змінні з ключовим словом val називають незмінюватими (immutable) або лише для читання (read-only). <syntaxhighlight lang="kotlin" line start="1"> var x=5 //оголошення цілочисельної змінної val y=5 //оголошення val змінної var num: Int // оголошення цілочисельної змінної з прямим вказанням типу var isVar= true // створення змінної типу Boolean var hugeNumber = 6L //створення змінної типу Long var letter='D' //змінна типу Char var name="Tom" // змінна типу String var x=3.14 // змінна типу Double </syntaxhighlight> Можна при оголошенні змінної зразу вказати її тип: <syntaxhighlight lang="kotlin" line start="1"> var name:String="Tom" // змінна типу String var hugeNumber2: Long =6 // змінна типу Long </syntaxhighlight> Але переважно компілятор сам визначає тип змінної, по типу значення, яке присвоюється. Проте існують випадки, коли це необхідно. Наприклад, при вказанні параметрів функції і т.п. ===Типи змінних=== Цілочисельні типи представлені типами Byte, Short, Int та Long. {| class="wikitable" style="text-align:left" ! Тип ! Біт ! Діапазон значень |- | Byte | 8 біт | -128 до 127 |- | Short | 16 біт | –32768 до 32767 |- | Int | 32 біт | –2147483648 до 2147483647 |- | Long | 64 біт | -9 223 372 036 854 775 808 (<math>-2^{63}</math>) до 9 223 372 036 854 775 807 (<math>2^{63}</math> - 1) |} Дробові числа представлені типами <code>Float</code> (32 біта) та типом <code>Double</code> (64 біта). Для представлення символів використовується тип Char. <syntaxhighlight lang="kotlin" line start="1"> var letter='D' // символи вводяться в одинарних лапках </syntaxhighlight> Для представлення рядків використовується тип String. <syntaxhighlight lang="kotlin" line start="1"> var name ="John" </syntaxhighlight> Зверніть увагу, що для присвоєння символу використовуються одинарні лапки. Подвійні лапки означають, що змінна буде типу String. Як і в іших мовах для використання спеціальних символів використовується \ (backslash). <syntaxhighlight lang="kotlin" line start="1"> var apostrophe= '\'' //використовуємо одинарну лапку/апостроф var myString="Ви ввели\n символ $apostrophe" // використовуємо символ нового рядка \n println (myString) </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Ви ввели символ ' </pre>}} Можна ввести рядок символів, який відображатиметься без змін як він введений, використовуючи потрійні лапки на початку тексту і в кінці: <syntaxhighlight lang="kotlin" line start="1"> var myString=""" Ви ввели\n поможіть бо я заплутався """ println (myString) </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Ви ввели\n поможіть бо я заплутався </pre>}} Boolean змінні застосовуються для значень true або false. <syntaxhighlight lang="kotlin" line start="1"> var isMan = true </syntaxhighlight> Також існують безнакові змінні (unsigned) цих же типів, що відповідно можуть вміщати вдвічі більші додатні числа у себе (UBite, UShort, UInt, ULong): <syntaxhighlight lang="kotlin" line start="1"> var x:UInt=5u; </syntaxhighlight> Коли в змінну необхідно записати велике число, то можна використовувати символ _ між цифрами, для кращого візуального представлення числа: <syntaxhighlight lang="kotlin" line start="1"> var x:Int=5_500_000 // ніякої помилки, все правильно </syntaxhighlight> ===Перетворення типів=== Для перетворення одного типу в інший використовуються відповідні функції, наприклад toLong(), що викликаються на відповідному об'єкті (змінній). <syntaxhighlight lang="kotlin" line start="1"> var k=65 // створиться змінна типу Int var l:Long = k.toLong() //до типу Long </syntaxhighlight> ==Коментарі== У Kotlin є три види коментарів: <syntaxhighlight lang="kotlin" line start="1"> //однорядковий коментар //новий коментар /* багаторядковий коментар */ /** * KDoc коментар * для документування функцій * та класів */ </syntaxhighlight> Тобто однорядкові коментарі починаються з двох косих рисок <code>//</code>. Багаторядкові вміщуються в символи <code>/* та */</code>. Все, що в цих символах, компілятор не сприймає як код. Останній вид коментарів застосовується для документування функцій та класів. Так, наприклад, якщо спереді функції є такий коментар, то при наведенні в місці використання на назву функції, компілятор видасть підказку з даним текстом. Всередині може спеціальним чином використовуватися опис параметрів функції: <syntaxhighlight lang="kotlin" line start="1"> /** * Ця функція обчислює суму двох цілих чисел. * @param a Перше ціле число. * @param b Друге ціле число. * @return Сума a та b. */ fun addNumbers(a: Int, b: Int): Int { return a + b } </syntaxhighlight> Детальніші про функції далі, у відповідному підрозділі. ==Привіт Світе!== Проста програма складається мінімум із одної функції main, що схоже на С/С++ чи java. <syntaxhighlight lang="kotlin" line start="1"> fun main(args: Array<String>){ // вказання аргументів функції необов'язкове val message="Привіт, Світе!" println (message) // якщо виводимо лише значення змінної pintln ("Ми говоримо: $message") //якщо вставляємо змінну в рядок println("Ми говоримо знову: "+message) // можна й так } </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Привіт, Світе! Ми говоримо: Привіт, Світе! Ми говоримо знову: Привіт, Світе! </pre>}} Зверніть увагу, що для вставляння змінної в рядок використовується знак <code>$</code> ==Читання з консолі== Ви можете прочитати з консолі введений користувачем текст або числа використовуючи функцію readln(): <syntaxhighlight lang="kotlin" line start="1"> println ("Введіть своє ім'я:") val name=readln() // читаємо ім'я (тип String) println ("Скільки вам років:") val age=readln().toInt() // читаємо і конвертуємо введений текст (String) у число (Int) println("Привіт $name ($age)") </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Введіть своє ім'я: Володимир Скільки вам років: 18 Привіт Володимир (18) </pre>}} ==Конкатенація== Оператор + може використовуватись як для додавання так і для конкатенації (з'єднання) тексту, але тут є деякі особливості: <syntaxhighlight lang="kotlin" line start="1"> println("Hello"+" Igor") // так працює, виведе два слова println((2+5)+" hello")// не працює, помилка, бо пробує до Int додати текстовий рядок </syntaxhighlight> Якщо хочемо, щоб нам зробило додаавання і з'єднало з текстовим рядком, то це можна зробити двома способами. Перший переставити місцями текст і математичний вираз: <syntaxhighlight lang="kotlin" line start="1"> println("hello "+(2+5)) // виведе: hello 7 </syntaxhighlight> Другий спосіб - поставити на початку порожній текстовий рядок: <syntaxhighlight lang="kotlin" line start="1"> println(""+(2+5)+" hello")// виведе: 7 hello </syntaxhighlight> Конкатенацію можна використовувати не тільки у функції println(): <syntaxhighlight lang="kotlin" line start="1"> val text:String=""+(5+4)+" Hello" //так теж можна </syntaxhighlight> ==Константи на рівні компіляції== Перед ключовим словом <code>val</code> можна використати ключове слово <code>const</code>. В такому разі значення константи буде підставлятися в код під час компіляції: <syntaxhighlight lang="kotlin" line start="1"> const val MY_CONST=55 fun main(){ println (MY_CONST) } </syntaxhighlight> Такі константи прийнято писати великими буквами та з використанням символів підкреслення. Вони повинні бути оголошені на початку модуля поза межами інших блоків (як то функції чи класи). Винятками є оголошення таких констант в середені спеціальних конструкцій як то object та companion object. Значення, що присвоюється має бути базового типу, як то String, Int і т.п. [[Категорія:Освоюємо Kotlin]] ==null безпечність== В Kotlin на відміну від Java не можна так просто присвоїти значення null (що означає пусто, нічого). Ви повинні передбачити, що змінна може прийняти null використавши оператор <code>?</code>: <syntaxhighlight lang="kotlin" line start="1"> val name: String? = null </syntaxhighlight> Позначивши змінну таким чином, подальші помилки на совісті програміста, що застосовуватиме змінну і в подальшому треба використовувати спеціальні оператори. Так щоб отримати довжину рядка такої змінної ми повинні використати оператор <code>!!</code>: {{XWarning|1=<span style="color: red;">'''Небезпечний код'''</span> <syntaxhighlight lang="kotlin" line start="1"> val name: String? = null println(name.length) // так не можна, помилка компіляції println (name!!.length) //так можна, але можливе аварійне завершення при виконанні </syntaxhighlight>}} Використавши два знаки оклику ми усуваємо помилку при компіляції, але можемо отримати аварійне завершення програми ([[Освоюємо Kotlin/Винятки|виняток]]), коли змінна буде рівна null, оскільки програма не зможе отримати довжину неіснуючого рядка. Можна з допомогою <code>?</code> здійснити так званий безпечний виклик. <syntaxhighlight lang="kotlin" line start="1"> val name: String? = null val length: Int? = name?.length </syntaxhighlight> В цьому разі програме провіряє змінну name на значення null і, якщо null, то змінній length буде присвоєно теж null і не буде обчислена довжина рядка. Таким чином наш null передався далі, але рано чи пізно нам буде необхідна перевірка змінної на null і якщо null, то здійснити якісь дії. Наприклад, можна присвоїти змінній якесь інше значення. Це можна зробити використавши умову if (див. розділ "[[Освоюємо Kotlin/Умовні конструкції|Умовні конструкції]]"), або оператор <code>?:</code> (так званий "елвіс оператор"): <syntaxhighlight lang="kotlin" line start="1"> val name: String? = null // 'name' є nullable String val displayName: String = name ?: "Гість" // якщо 'name' рівна null, присвоюємо змінній значення "Гість" println(displayName) //вивід: Гість val nameNotNull: String? = "Іван" val displayNameNotNull: String = nameNotNull ?: "Гість" println(displayNameNotNull) // Вивід: Іван </syntaxhighlight> Приклад, коли можна отримати null, це наприклад ввід з клавіатури. Якщо ми будемо читати число так <code> val number=readln().toInt()</code>, то користувач може ввести замість числа букви, тоді перетворення до типу Int введеного тексту закінчиться аварійною ситуацією ([[Освоюємо Kotlin/Винятки|винятком]]). Ми можемо використати функцію <code>toIntOrNull()</code>, тоді якщо перетворення до типу Int буде невдале, то функція поверне null. І вже тоді можна здійснити перевірку на null і зробити певні дії: <syntaxhighlight lang="kotlin" line start="1"> fun main(){ println("Введіть ціле число:") val number:Int?=readln().toIntOrNull() if (number==null) //якщо число рівне null, то вивід "Ви ввели: не число" println("Ви ввели: не число") else // в іншому випадку виводимо наше число println("Ви ввели: $number") } </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Введіть ціле число: фіав Ви ввели: не число </pre>}} Елвіс оператор може бути більш функціональним. Так, якщо необхідно виконати якийсь код при null значенні, можна написати так: <syntaxhighlight lang="kotlin" line start="1" highlight="2-5"> val nameNotNull: String? = null val displayNameNotNull: String = nameNotNull ?: run{ println("Неправильний логін") "Гість" } println("Логін:"+displayNameNotNull) </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Неправильний логін Логін:Гість </pre>}} Останній рядок в run присвоюється змінній, яка перевірялась. Можна просто завершити виконання функції main() або будь-якої функції використавши ключове слово return <syntaxhighlight lang="kotlin" line start="1"> fun main(args: Array<String>) { val nameNotNull: String? = null val displayNameNotNull: String = nameNotNull ?: return println(displayNameNotNull) } </syntaxhighlight> В даному випадку на екран нічого не буде виведено, оскільки після return програма закінчує виконання. {{Nav}} 05wd4n6v7j8zaokk4txoqim8yz4mqho 41368 41367 2026-08-07T16:46:47Z Володимир Груша 985 /* null безпечність */ 41368 wikitext text/x-wiki {{Nav|Освоюємо Kotlin|Основи|programming|nocat=1}} ==Серодовища розробки (IDE)== Для програмування на Kotlin вам необхідне інтегроване середовище розробки (IDE). Офіційним середовищем є IntelliJ IDEA. Його можна звантажити з офіційного сайту jetbraints [https://www.jetbrains.com/idea/ тут]. При виборі версій, вибираєм IntelliJ IDEA Community Edition - воно безкоштовне. Другий спосіб опробувати прості програми - використати віртуальний емулятор на офіційному сайті (для початку згодиться). Його можна опробувати [https://play.kotlinlang.org/ тут] Можна також скористуватися іншими компіляторами, наприклад, IDE Eclipse з відповідним плагіном. ==Змінні== ===Оголошення змінних=== Оголошення змінних відбувається з вказанням ключового слова var або val після чого йде назва змінної. Тип змінної можна не вказувати, тоді компілятор сам спробує визначити її тип за тим, що ви присвоюєте змінній. Змінні з ключовим словом val називають незмінюватими (immutable) або лише для читання (read-only). <syntaxhighlight lang="kotlin" line start="1"> var x=5 //оголошення цілочисельної змінної val y=5 //оголошення val змінної var num: Int // оголошення цілочисельної змінної з прямим вказанням типу var isVar= true // створення змінної типу Boolean var hugeNumber = 6L //створення змінної типу Long var letter='D' //змінна типу Char var name="Tom" // змінна типу String var x=3.14 // змінна типу Double </syntaxhighlight> Можна при оголошенні змінної зразу вказати її тип: <syntaxhighlight lang="kotlin" line start="1"> var name:String="Tom" // змінна типу String var hugeNumber2: Long =6 // змінна типу Long </syntaxhighlight> Але переважно компілятор сам визначає тип змінної, по типу значення, яке присвоюється. Проте існують випадки, коли це необхідно. Наприклад, при вказанні параметрів функції і т.п. ===Типи змінних=== Цілочисельні типи представлені типами Byte, Short, Int та Long. {| class="wikitable" style="text-align:left" ! Тип ! Біт ! Діапазон значень |- | Byte | 8 біт | -128 до 127 |- | Short | 16 біт | –32768 до 32767 |- | Int | 32 біт | –2147483648 до 2147483647 |- | Long | 64 біт | -9 223 372 036 854 775 808 (<math>-2^{63}</math>) до 9 223 372 036 854 775 807 (<math>2^{63}</math> - 1) |} Дробові числа представлені типами <code>Float</code> (32 біта) та типом <code>Double</code> (64 біта). Для представлення символів використовується тип Char. <syntaxhighlight lang="kotlin" line start="1"> var letter='D' // символи вводяться в одинарних лапках </syntaxhighlight> Для представлення рядків використовується тип String. <syntaxhighlight lang="kotlin" line start="1"> var name ="John" </syntaxhighlight> Зверніть увагу, що для присвоєння символу використовуються одинарні лапки. Подвійні лапки означають, що змінна буде типу String. Як і в іших мовах для використання спеціальних символів використовується \ (backslash). <syntaxhighlight lang="kotlin" line start="1"> var apostrophe= '\'' //використовуємо одинарну лапку/апостроф var myString="Ви ввели\n символ $apostrophe" // використовуємо символ нового рядка \n println (myString) </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Ви ввели символ ' </pre>}} Можна ввести рядок символів, який відображатиметься без змін як він введений, використовуючи потрійні лапки на початку тексту і в кінці: <syntaxhighlight lang="kotlin" line start="1"> var myString=""" Ви ввели\n поможіть бо я заплутався """ println (myString) </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Ви ввели\n поможіть бо я заплутався </pre>}} Boolean змінні застосовуються для значень true або false. <syntaxhighlight lang="kotlin" line start="1"> var isMan = true </syntaxhighlight> Також існують безнакові змінні (unsigned) цих же типів, що відповідно можуть вміщати вдвічі більші додатні числа у себе (UBite, UShort, UInt, ULong): <syntaxhighlight lang="kotlin" line start="1"> var x:UInt=5u; </syntaxhighlight> Коли в змінну необхідно записати велике число, то можна використовувати символ _ між цифрами, для кращого візуального представлення числа: <syntaxhighlight lang="kotlin" line start="1"> var x:Int=5_500_000 // ніякої помилки, все правильно </syntaxhighlight> ===Перетворення типів=== Для перетворення одного типу в інший використовуються відповідні функції, наприклад toLong(), що викликаються на відповідному об'єкті (змінній). <syntaxhighlight lang="kotlin" line start="1"> var k=65 // створиться змінна типу Int var l:Long = k.toLong() //до типу Long </syntaxhighlight> ==Коментарі== У Kotlin є три види коментарів: <syntaxhighlight lang="kotlin" line start="1"> //однорядковий коментар //новий коментар /* багаторядковий коментар */ /** * KDoc коментар * для документування функцій * та класів */ </syntaxhighlight> Тобто однорядкові коментарі починаються з двох косих рисок <code>//</code>. Багаторядкові вміщуються в символи <code>/* та */</code>. Все, що в цих символах, компілятор не сприймає як код. Останній вид коментарів застосовується для документування функцій та класів. Так, наприклад, якщо спереді функції є такий коментар, то при наведенні в місці використання на назву функції, компілятор видасть підказку з даним текстом. Всередині може спеціальним чином використовуватися опис параметрів функції: <syntaxhighlight lang="kotlin" line start="1"> /** * Ця функція обчислює суму двох цілих чисел. * @param a Перше ціле число. * @param b Друге ціле число. * @return Сума a та b. */ fun addNumbers(a: Int, b: Int): Int { return a + b } </syntaxhighlight> Детальніші про функції далі, у відповідному підрозділі. ==Привіт Світе!== Проста програма складається мінімум із одної функції main, що схоже на С/С++ чи java. <syntaxhighlight lang="kotlin" line start="1"> fun main(args: Array<String>){ // вказання аргументів функції необов'язкове val message="Привіт, Світе!" println (message) // якщо виводимо лише значення змінної pintln ("Ми говоримо: $message") //якщо вставляємо змінну в рядок println("Ми говоримо знову: "+message) // можна й так } </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Привіт, Світе! Ми говоримо: Привіт, Світе! Ми говоримо знову: Привіт, Світе! </pre>}} Зверніть увагу, що для вставляння змінної в рядок використовується знак <code>$</code> ==Читання з консолі== Ви можете прочитати з консолі введений користувачем текст або числа використовуючи функцію readln(): <syntaxhighlight lang="kotlin" line start="1"> println ("Введіть своє ім'я:") val name=readln() // читаємо ім'я (тип String) println ("Скільки вам років:") val age=readln().toInt() // читаємо і конвертуємо введений текст (String) у число (Int) println("Привіт $name ($age)") </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Введіть своє ім'я: Володимир Скільки вам років: 18 Привіт Володимир (18) </pre>}} ==Конкатенація== Оператор + може використовуватись як для додавання так і для конкатенації (з'єднання) тексту, але тут є деякі особливості: <syntaxhighlight lang="kotlin" line start="1"> println("Hello"+" Igor") // так працює, виведе два слова println((2+5)+" hello")// не працює, помилка, бо пробує до Int додати текстовий рядок </syntaxhighlight> Якщо хочемо, щоб нам зробило додаавання і з'єднало з текстовим рядком, то це можна зробити двома способами. Перший переставити місцями текст і математичний вираз: <syntaxhighlight lang="kotlin" line start="1"> println("hello "+(2+5)) // виведе: hello 7 </syntaxhighlight> Другий спосіб - поставити на початку порожній текстовий рядок: <syntaxhighlight lang="kotlin" line start="1"> println(""+(2+5)+" hello")// виведе: 7 hello </syntaxhighlight> Конкатенацію можна використовувати не тільки у функції println(): <syntaxhighlight lang="kotlin" line start="1"> val text:String=""+(5+4)+" Hello" //так теж можна </syntaxhighlight> ==Константи на рівні компіляції== Перед ключовим словом <code>val</code> можна використати ключове слово <code>const</code>. В такому разі значення константи буде підставлятися в код під час компіляції: <syntaxhighlight lang="kotlin" line start="1"> const val MY_CONST=55 fun main(){ println (MY_CONST) } </syntaxhighlight> Такі константи прийнято писати великими буквами та з використанням символів підкреслення. Вони повинні бути оголошені на початку модуля поза межами інших блоків (як то функції чи класи). Винятками є оголошення таких констант в середені спеціальних конструкцій як то object та companion object. Значення, що присвоюється має бути базового типу, як то String, Int і т.п. [[Категорія:Освоюємо Kotlin]] ==null безпечність== В Kotlin на відміну від Java не можна так просто присвоїти значення null (що означає пусто, нічого). Ви повинні передбачити, що змінна може прийняти null використавши оператор <code>?</code>: <syntaxhighlight lang="kotlin" line start="1"> val name: String? = null </syntaxhighlight> Позначивши змінну таким чином, подальші помилки на совісті програміста, що застосовуватиме змінну і в подальшому треба використовувати спеціальні оператори. Так щоб отримати довжину рядка такої змінної ми повинні використати оператор <code>!!</code>: {{XWarning|1=<span style="color: red;">'''Небезпечний код'''</span> <syntaxhighlight lang="kotlin" line start="1"> val name: String? = null println(name.length) // так не можна, помилка компіляції println (name!!.length) //так можна, але можливе аварійне завершення при виконанні </syntaxhighlight>}} Використавши два знаки оклику ми усуваємо помилку при компіляції, але можемо отримати аварійне завершення програми ([[Освоюємо Kotlin/Винятки|виняток]]), коли змінна буде рівна null, оскільки програма не зможе отримати довжину неіснуючого рядка. Можна з допомогою <code>?</code> здійснити так званий безпечний виклик. <syntaxhighlight lang="kotlin" line start="1"> val name: String? = null val length: Int? = name?.length </syntaxhighlight> В цьому разі програме провіряє змінну name на значення null і, якщо null, то змінній length буде присвоєно теж null і не буде обчислена довжина рядка. Таким чином наш null передався далі, але рано чи пізно нам буде необхідна перевірка змінної на null і якщо null, то здійснити якісь дії. Наприклад, можна присвоїти змінній якесь інше значення. Це можна зробити використавши умову if (див. розділ "[[Освоюємо Kotlin/Умовні конструкції|Умовні конструкції]]"), або оператор <code>?:</code> (так званий "елвіс оператор"): <syntaxhighlight lang="kotlin" line start="1"> val name: String? = null // 'name' є nullable String val displayName: String = name ?: "Гість" // якщо 'name' рівна null, присвоюємо змінній значення "Гість" println(displayName) //вивід: Гість val nameNotNull: String? = "Іван" val displayNameNotNull: String = nameNotNull ?: "Гість" println(displayNameNotNull) // Вивід: Іван </syntaxhighlight> Приклад, коли можна отримати null, це наприклад ввід з клавіатури. Якщо ми будемо читати число так <code> val number=readln().toInt()</code>, то користувач може ввести замість числа букви, тоді перетворення до типу Int введеного тексту закінчиться аварійною ситуацією ([[Освоюємо Kotlin/Винятки|винятком]]). Ми можемо використати функцію <code>toIntOrNull()</code>, тоді якщо перетворення до типу Int буде невдале, то функція поверне null. І вже тоді можна здійснити перевірку на null і зробити певні дії: <syntaxhighlight lang="kotlin" line start="1"> fun main(){ println("Введіть ціле число:") val number:Int?=readln().toIntOrNull() if (number==null) //якщо число рівне null, то вивід "Ви ввели: не число" println("Ви ввели: не число") else // в іншому випадку виводимо наше число println("Ви ввели: $number") } </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Введіть ціле число: фіав Ви ввели: не число </pre>}} Елвіс оператор може бути більш функціональним. Так, якщо необхідно виконати якийсь код при null значенні, можна написати так: <syntaxhighlight lang="kotlin" line start="1" highlight="2-5"> val nameNotNull: String? = null val displayNameNotNull: String = nameNotNull ?: run{ println("Неправильний логін") "Гість" } println("Логін:"+displayNameNotNull) </syntaxhighlight> {{XConsole|1='''Результат:''' <pre> Неправильний логін Логін:Гість </pre>}} Останній рядок в run присвоюється змінній, яка перевірялась. Можна просто завершити виконання функції main() або будь-якої функції використавши ключове слово return <syntaxhighlight lang="kotlin" line start="1"> fun main(args: Array<String>) { val nameNotNull: String? = null val displayNameNotNull: String = nameNotNull ?: return println(displayNameNotNull) } </syntaxhighlight> В даному випадку на екран нічого не буде виведено, оскільки після return функція main() завершується, а отже програма закінчує виконання. {{Nav}} nupypvqxh6j3pm0m2l42bqx2pl8x620 Кулінарна книга/Джерела/Українські страви 1960 р. 0 8645 41373 41356 2026-08-08T08:10:58Z Heffalump1974 3591 Продовжую форматувати 41373 wikitext text/x-wiki Нижче викладено зміст кулінарної книги «'''Українські народні страви'''» (1990 року видання, колектив авторів (Денисенко Л.П.; [[Іван Сергійович Хименко|Хименко І.С.]]; Георгієвський М.І.; [[Борис Львович Гордін|Гордін Б.Л.]]; Кузьмичов Є.С.; Шемякінський О.С.; Вищепан О.Г.; Мельман М.Є.; Скробанський Г.Г.) та вказані рецепти, що були запозичені до Вікіпідручників саме з неї. * З історії розвитку української кухні... З * Їжа і здоров’я... 12 = ЗАКУСКИ І ХОЛОДНІ СТРАВИ = == Закуски і страви з овочів == === Закуски з помідорів === {| class="wikitable" |+ Закуски з помідорів |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Закуски з помідорів || 37 || |- | || Помідори з яблуками || 37 || |- | || Салат із помідорів з нутом або горохом || 38 || |- | || Помідори з яєчнею || 38 || |- | || Помідори з нутом або горохом || 38 || |- | || Помідори з яєчною начинкою || 39 || |- | || Помідори в підливі || 39 || |- | || Помідори з начинкою із сирої моркви || 39 || |- | || Кашка із зелених солоних помідорів || 39 || |- | || Помідори з начинкою з цибулі || 40 || |- | || Помідори з підсмаженим салом || 40 || |} === Закуски з баклажанів, перцю і кабачків === {| class="wikitable" |+ Закуски з баклажанів, перцю і кабачків |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Закуски з баклажанів, перцю і кабачків || 40 || |- | || Баклажани з помідорами || 41 || |- | || Салат з баклажанів і помідорів || 41 || |- | || Салат з баклажанів і квасолі || 41 || |- | || Кашка з баклажанів || 42 || |- | || Кашка з баклажанів з яблуками || 42 || |- | || Меживо з баклажанів || 42 || |- | || Меживо з перцю || 42 || |- | || Кашка з кабачків || 43 || |} === Закуски з буряків === {| class="wikitable" |+ Закуски з буряків |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Закуски з буряків || 43 || |- | || Салат буряковий з хріном || 44 || |- | || Мариновані буряки з хріном || 44 || |- | || Бурячки || 44 || |- | || Буряки з чорносливом і квасолею || 44 || |} === Салати з капусти, огірків, салату, цибулі та шпинату === {| class="wikitable" |+ Салати з капусти, огірків, салату, цибулі та шпинату |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Салати з капусти, огірків, салату цибулі та шпинату || 44 || |- | || Салат із свіжої білоголової капусти, помідорів і моркви || 45 || |- | || Салат із свіжої білоголової капусти, яблук та цибулі || 45 || |- | || Салат з цвітної капусти || 45 || |- | || Салат з квашеної капусти і грибів || 45 || |} === Закуски з огірків і салату === {| class="wikitable" |+ Закуски з огірків і салату |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Закуски з огірків і салату || 46 || |- | || Салат з огірків і овочів || 46 || |- | || Кашка овочева || 46 || |- | || Огірки в сметані || 46 || |- | || Салат зелений || 46 || |- | || Салат із шпинату || 47 || |- | || Салат із зеленої цибулі || 47 || |- | || Салат з огірками || 47 || |- | || Огірки малосольні || 47 || |} === Холодні страви з картоплі === {| class="wikitable" |+ Холодні страви з картоплі |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Холодні страви з картоплі || 47 || |- | || Картопля з начинкою з оселедця || 48 || |- | || Салат грибок || 48 || |- | || Товченка || 49 || |} === Закуски з грибів === {| class="wikitable" |+ Закуски з грибів |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Закуски з грибів || 49 || |- | || Гриби з олією || 49 || |- | || Мариновані білі гриби || 50 || |- | || Рижики в сметані || 50 || |- | || Кашка грибна || 50 || |} == Закуски і холодні страви з риби == {| class="wikitable" |+ Закуски і холодні страви з риби |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Мариновані оселедці || 51 || |- | || Оселедець з яблуками || 51 || |- | || Оселедець з підливою || 51 || |- | || Оселедець по-київському || 52 || |- | || Кашка з оселедця і цибулі || 52 || |- | || Щуча ікра || 52 || |- | || Ікра закусочна з свіжої риби || 52 || |- | || Закуска із риби з грибами || 53 || |- | || Короп з медом || 53 || |- | || Заливне з судака по-українському || 53 || |- | || Заливне з судака в цілому вигляді || 54 || |- | || Завиванець з риби || 54 || |- | || Камса маринована || 56 || |- | || Салат з камси і овочів || 56 || |- | || Камса з яйцями || 56 || |} == Закуски і холодні страви з м’яса == {| class="wikitable" |+ Закуски і холодні страви з м’яса |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Холодець з свинячих ніжок || 56 || |- | || Холодець з курки || 57 || |- | || Завиванець з поросяти || 58 || |- | || Телячий завиванець || 58 || |- | || Кендюх варений з начинкою || 59 || |- | || Заливне з тушкованого м’яса || 59 || |- | || Салат з м’яса і овочів || 60 || |- | || Закуски з шинки || 61 || |- | || Хрін з буряковим квасом || 61 || |} == Молочні і борошняні закуски == {| class="wikitable" |+ Молочні і борошняні закуски |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Ряжанка || 62 || |- | || Гуслянка || 62 || |- | || Мачанка || 62 || |- | || Потапці з помідорами || 62 || |- | || Потапці з салом || 63 || |} == Закусочні овочеві консерви == {| class="wikitable" |+ Закусочні овочеві консерви |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Фаршировані овочі || 63 || |- | || Консерви закусочні з нарізаних овочів (соте) || 63 || |- | || Овочева ікра || 64 || |- | || Овочеві маринади || 64 || |- | || Консервовані огірки || 65 || |- | || Огірки пастеризовані київські || 65 || |- | || Патисони консервовані || 66 || |} == Рибні консерви == {| class="wikitable" |+ Рибні консерви |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Консерви в томатному соусі || 66 || |- | || Консерви в олії || 66 || |- | || Консерви з рибних продуктів || 69 || |- | || Консерви з крабів || 70 || |- | || Презерви || 70 || |} == Сири == {| class="wikitable" |+ Сири |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Сичужні сири || 72 || |- | || Тверді сири || 72 || |- | || Напівтверді сири || 73 || |- | || М’які сири || 73 || |- | || Кисломолочні сири || 74 || |- | || Плавлені сири || 74 || |} == Ковбаси == === Ковбаси домашнього приготування === {| class="wikitable" |+ Ковбаси домашнього приготування |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Ковбаси домашнього приготування || 75 || |- | || Ковбаса «Домашня» || 76 || |- | || Ковбаса з печінки || 77 || |- | || Ковбаса з печінки і гречаної каші || 77 || |- | || Ковбаса з легенів || 78 || |- | || Кров’янка || 78 || |- | || Ковбаси з кашею || 79 || |- | || Ковбаса-задимлянка || 79 || |- | || Задимлянка гусяча || 79 || |} === Ковбасні вироби м’ясної промисловості === {| class="wikitable" |+ Ковбасні вироби м’ясної промисловості |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Ковбасні вироби м’ясної промисловості || 79 || |- | || Варені ковбаси || 80 || |- | || Сосиски і сердельки || 80 || |- | || Фаршировані ковбаси || 80 || |- | || Ліверні ковбаси || 81 || |- | || Кров’яні ковбаси || 81 || |- | || Зельці || 81 || |- | || М’ясні хлібці || 82 || |- | || Холодці || 82 || |- | || Заливне || 82 || |- | || Паштети || 82 || |- | || Напівкопчені ковбаси || 83 || |- | || Копчені ковбаси || 83 || |- | || М’ясокопченості || 83 || |- | || Смажені й печені ковбаси || 84 || |- | || Шпик || 84 || |} = ПЕРШІ СТРАВИ = == Борщі == {| class="wikitable" |+ Борщі |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Борщ український з м’ясом || 89 || |- | || Борщ полтавський || 90 || |- | || Борщ київський || 90 || |- | || Борщ київський без м’яса || 91 || |- | || Борщ волинський || 91 || |- | || Борщ чернігівський || 92 || |- | || Борщ галицький || 92 || |- | || Борщ львівський || 93 || |- | || Борщ з потрухами || 93 || |- | || Борщ буряковий з грибами || 94 || |- | || Борщ з квашеними яблуками || 94 || |- | || Борщ селянський || 95 || |- | || Борщ зелений український || 95 || |- | || Борщ з карасями || 96 || |- | || Борщ з м’ясними галушками || 97 || |- | || Борщ з грибами і чорносливом || 97 || |- | || Борщ з свинячою грудинкою і буряками || 97 || |- | || Борщ селянський холодний || 98 || |- | || Борщ холодний буряковий || 98 || |- | || Холодник наддніпрянський || 99 || |- | || Холодник з осетриною || 99 || |- | || Борщ зелений з консервованих шпинату та щавлю || 100 || |} == Капусняки == {| class="wikitable" |+ Капусняки |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Капусняк з грибами || 101 || |- | || Капусняк з кашею || 101 || |- | || Капусняк запорізький || 10 || |- | || Капусняк звичайний || 102 || |- | || Квас буряковий для борщу || 102 || |- | || Квас-сирівець з борошна для борщу || 103 || |- | || Квас-сирівець з сухарів || 103 || |} == Юшки == {| class="wikitable" |+ Юшки |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Юшка з квасолею і вермішеллю || 104 || |- | || Юшка домашня з нирками || 104 || |- | || Юшка з потрухів || 105 || |- | || Юшка мисливська || 105 || |- | || Юшка горохова з копченою грудинкою || 105 || |- | || Юшка з картопляними галушками || 106 || |- | || Юшка горохова з салом || 106 || |- | || Юшка з грибними вушками || 106 || |- | || Юшка з печерицями і горошком || 107 || |- | || Юшка грибна з галушками || 107 || |- | || Юшка перлова з грибами || 108 || |- | || Щучина || 108 || |- | || Юшка з риби || 109 || |- | || Щипанка || 109 || |- | || Затірка || 109 || |- | || Куліш з салом || 110 || |- | || Куліш на грибному відварі || 110 || |- | || Юшка київська || 110 || |- | || Кулешик гороховий || 111 || |} = ДРУГІ СТРАВИ = === Гарячі рибні страви === {| class="wikitable" |+ Гарячі рибні страви |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Осетрина відварна гаряча || 118 || |- | || Лящ з хріном і яблуками || 118 || |- | || Відварні бички || 119 || |- | || Судак з печерицями || 119 || |- | || Короп, тушкований з цибулею || 119 || |- | || Судак, тушкований у сметані || 120 || |- | || Щука з хріном тушкована || 120 || |- | || Лин з капустою || 121 || |- | || Короп у кислосолодкій підливі || 121 || |- | || Судак запечений з грибами і раками || 122 || |- | || Карасі в сметані || 122 || |- | || Бабка з судака або щуки || 123 || |- | || Баба-шарпанина з риби || 123 || |- | || Риба в млинчиках || 124 || |- | || В’юни з хріном || 125 || |- | || Крученики з щуки || 125 || |- | || Рибні крученики по-київському || 126 || |- | || Короп із начинкою з гречаної каші та грибів || 126 || |- | || Короп з начинкою із рису та грибів || 127 || |} == Гарячі м’ясні страви == === Страви з яловичини === {| class="wikitable" |+ Страви з яловичини |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Страви з яловичини || 132 || |- | || Відварна яловичина з овочами і квасолею || 133 || |- | || Відварна яловичина з грибами || 133 || |- | || Відварна яловичина з хріном || 134 || |- | || Відварна яловичина з овочами || 134 || |- | || Полядвиця || 134 || |- | || Душенина неспільна || 135 || |- | || Капуста, тушкована з різним м’ясом || 136 || |- | || Яловичина в сметані || 136 || |- | || Смаженина, запечена з цибулею || 137 || |- | || Крученики, тушковані з гречаною кашею і грибами || 137 || |- | || Крученики волинські || 138 || |- | || Смаженя з кислою капустою || 139 || |- | || Яловичина, тушкована з чорносливом || 139 || |- | || Душенина з нирками || 140 || |- | || Смаженина, тушкована з картоплею || 140 || |- | || Смаженя, тушкована з овочами || 140 || |- | || Смаженина, начинена гречаною кашею і тушкована в сметані || 141 || |- | || Яловичина шпигована, з буряками || 141 || |- | || Битки м’ясні по-селянському || 142 || |- | || Січеники || 142 || |- | || Січеники полтавські || 143 || |- | || Січеники тушковані, начинені хріном || 144 || |- | || Перець, начинений м’ясом і рисом || 144 || |- | || Баклажани, тушковані з м’ясом || 145 || |- | || Кабачки, начинені м’ясом || 146 || |- | || Помідори, начинені м’ясом || 146 || |- | || Помідори, начинені мозком || 147 || |- | || Голубці з м’ясом по-українському || 148 || |- | || Язик з ізюмом || 148 || |- | || Печінка, шпигована часником || 148 || |- | || Печінка, шпигована салом || 149 || |- | || Вим’я, тушковане з картоплею || 150 || |- | || Рубці по-українському || 150 || |} === Страви з свинини === {| class="wikitable" |+ Страви з свинини |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Страви з свинини || 150 || |- | || Свинина з чорносливом || 151 || |- | || Свинина з овочами || 151 || |- | || Свинина смажена, тушкована з картоплею || 152 || |- | || Свинина тушкована з капустою і картоплею || 153 || |- | || Свинина, тушкована з капустою і яблуками || 153 || |- | || Свиняча грудинка з капустою || 153 || |- | || Свиняча грудинка з картоплею і цибулею || 154 || |- | || Свиняча поребрина з рисом || 154 || |- | || Верещака || 155 || |- | || Буженина, шпигована часником і цибулею || 155 || |- | || Буженина з пивом || 156 || |- | || Свинячі битки по-українському || 156 || |- | || Свинячі битки, запечені з картоплею і капустою || 157 || |- | || Порося з хріном || 157 || |- | || Порося, смажене з начинкою || 157 || |- | || Кендюх, смажений з начинкою || 158 || |- | || Сальник з гречаною кашею || 158 || |- | || Свиняча голова з хріном || 159 || |} === Страви з баранини === {| class="wikitable" |+ Страви з баранини |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Страви з баранини || 159 || |- | || Смаженя з баранини || 159 || |- | || Смаженина степова з баранини || 160 || |- | || Душенина з баранини || 161 || |- | || Баранина з квасолею || 161 || |- | || Баранина з часником || 162 || |- | || Баранина з чорносливом || 162 || |- | || Бараняча грудинка з рисом || 162 || |- | || Бараняча грудинка з начинкою || 164 || |- | || Січеники з баранини || 164 || |} === Страви з телятини === {| class="wikitable" |+ Страви з телятини |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Страви з телятини || 164 || |- | || Телячі січеники || 165 || |- | || Телятина, запечена з локшиною || 165 || |- | || Грудинка теляча з помідорами і картоплею || 165 || |- | || Теляча грудинка з печерицями || 166 || |- | || Телячий смажений завиванець || 167 || |} === Страви з кролятини === {| class="wikitable" |+ Страви з кролятини |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Страви з кролятини || 168 || |- | || Відварна кролятина, обсмажена || 168 || |- | || Смаженя з кролика || 168 || |- | || Битки з кролятини || 169 || |- | || Бабка з кролика || 170 || |- | || Січеники з кролятини і пшона || 170 || |- | || Кролик, тушкований з овочами || 170 || |- | || Кролятина з рисом || 171 || |} === Страви з птиці === {| class="wikitable" |+ Страви з птиці |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Страви з птиці || 171 || |- | || Курка, тушкована з овочами || 172 || |- | || Курчата, начинені грибами і рисом || 172 || |- | || Курчата, начинені сухарями || 178 || |- | || Курчата в сметані || 173 || |- | || Качка, смажена з яблуками || 174 || |- | || Качка, начинена локшиною та грибами || 174 || |- | || Індичина з підливою || 175 || |- | || Індичина з рисовою начинкою || 175 || |- | || Гуска з яблуками || 176 || |} == Страви з картоплі і овочів == === Страви з картоплі === {| class="wikitable" |+ Страви з картоплі |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Страви з картоплі || 176 || |- | || Картопля з маком || 177 || |- | || Картопля з хріном || 177 || |- | || Картопля з салом || 177 || |- | || Картопля з морквою || 178 || |- | || Картопля, товчена з салом і цибулею || 178 || |- | || Картопля з чиною або квасолею || 178 || |- | || Картопля, фарширована грибами || 178 || |- | || Картопля тушкована з чорносливом || 179 || |- | || Картопля, запечена з яблуками і рисом || 179 || |- | || Бабка картопляна з сиром || 180 || |- | || Бабка картопляна з грибами || 180 || |- | || Картопляна запіканка з сиром || 181 || |- | || Картопляна запіканка з м’ясом || 182 || |- | || Картопля, запечена з сиром || 182 || |- | || Картопляні завиванці з різною начинкою || 183 || |- | || Картопля печена з маслом || 184 || |- | || Картопляні пальчики || 184 || |- | || Котлети з картоплі по-київському || 184 || |- | || Картопляники з киселем із чорносливу || 185 || |- | || Картопляники з грибами || 185 || |- | || Оладки картопляні із сметаною || 186 || |- | || Пиріжки з картоплі з грибами і рисом || 186 || |} === Страви з капусти === {| class="wikitable" |+ Страви з капусти |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Страви з капусти || 187 || |- | || Капуста з начинкою із м’яса і пшона || 187 || |- | || Капуста з начинкою із м’яса і рису || 188 || |- | || Тушкована квашена капуста з грибами || 188 || |- | || Капуста, тушкована з яблуками || 189 || |- | || Капуста, смажена з салом || 189 || |- | || Капуста запечена || 189 || |- | || Капуста, запечена з рисом і грибами || 189 || |- | || Завиванець із свіжої капусти і гречаної каші || 190 || |- | || Голубці з пшоном || 190 || |- | || Цінник з капусти || 191 || |- | || Цвітна капуста, смажена в сухарях || 191 || |- | || Цвітна капуста, смажена в тісті || 191 || |- | || Січеники з цвітної капусти || 192 || |} === Страви з моркви === {| class="wikitable" |+ Страви з моркви |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Страви з моркви || 192 || |- | || Бабка з моркви || 192 || |- | || Бабка з моркви і нуту або гороху || 193 || |- | || Цінник з моркви || 193 || |- | || Морква в молоці з потапцями || 194 || |- | || Морква з горошком || 194 || |} === Страви з помідорів === {| class="wikitable" |+ Страви з помідорів |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Страви з помідорів || 194 || |- | || Помідори з м’ясною начинкою || 194 || |- | || Помідори з начинкою із яєчні || 195 || |- | || Помідори з начинкою із ліверу і гречаної каші || 195 || |- | || Помідори з начинкою із м’яса і пшоняної каші || 196 || |- | || Помідори з начинкою із квасолі || 197 || |- | || Помідори з начинкою із зеленого горошку || 197 || |- | || Помідори, смажені і запечені в сметанній підливі || 198 || |} === Страви з баклажанів === {| class="wikitable" |+ Страви з баклажанів |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Страви з баклажанів || 198 || |- | || Баклажани, смажені з цибулею || 198 || |- | || Баклажани, смажені з помідоцами і сметаною || 199 || |- | || Баклажани з свіжими грибами й цибулею || 199 || |- | || Баклажани з начинкою із пшоняної каші і грибів || 200 || |- | || Баклажани з начинкою із ліверу і гречаної каші || 200 || |} === Страви з кабачків === {| class="wikitable" |+ Страви з кабачків |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Страви з кабачків || 201 || |- | || Запіканка з кабачків із сметаною || 201 || |- | || Кабачки, смажені в сухарях || 201 || |- | || Кабачки, смажені в тісті || 202 || |- | || Оладки з кабачків || 202 || |- | || Кабачки з начинкою із м’яса і рису || 202 || |- | || Кабачки з начинкою із ліверу і гречаної каші || 203 || |- | || Кабачки з начинкою із м’яса і пшоняної каші || 203 || |} === Страви з перцю === {| class="wikitable" |+ Страви з перцю |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Страви з перцю || 203 || |- | || Перець з начинкою із м’яса і рису || 204 || |- | || Перець з начинкою із гречаної каші і грибів || 204 || |- | || Перець з начинкою із м’яса і пшоняної каші || 204 || |} === Страви із спаржі === {| class="wikitable" |+ Страви із спаржі |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Страви із спаржі || 205 || |- | || Спаржа відварна з сухарною підливою || 205 || |- | || Спаржа, запечена із шинкою і сухарями || 206 || |- | || Спаржа, запечена в молочній підливі || 206 || |} === Страви з бобових зелених овочів === {| class="wikitable" |+ Страви з бобових зелених овочів |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Страви з бобових зелених овочів || 206 || |- | || Лопатки || 207 || |- | || Горошок зелений з морквою || 207 || |- | || Горошок зелений з цвітною капустою || 207 || |- | || Протертий горошок з потапцями || 208 || |} === Страви з шпинату === {| class="wikitable" |+ Страви з шпинату |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Страви з шпинату || 208 || |- | || Шпинат з потапцями || 209 || |- | || Січеники з шпинату || 209 || |- | || Бабка з шпинату || 210 || |} === Страви з гарбузів === {| class="wikitable" |+ Страви з гарбузів |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Страви з гарбузів || 210 || |- | || Гарбузова каша з маслом || 211 || |- | || Гарбуз відварений з маслом і сухарями || 211 || |- | || Гарбуз тушкований || 211 || |- | || Гарбуз, тушкований з яблуками || 211 || |- | || Гарбуз із сметаною || 212 || |} === Страви із свіжої кукурудзи === {| class="wikitable" |+ Страви із свіжої кукурудзи |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Страви із свіжої кукурудзи || 212 || |- | || Кукурудза з маслом || 212 || |- | || Кукурудза тушкована || 212 || |} == Овочеві консерви, що використовуються для приготування різних страв == {| class="wikitable" |+ Овочеві консерви, що використовуються для приготування різних страв |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Консерви з натуральних овочів || || |- | || Пюре з шпинату і щавлю || || |- | || Заморожені овочі || || |- | || Страви з консервованих овочів || || |- | || Горошок зелений з цвітною капустою || || |- | || Капуста цвітна із сухарним соусом || || |- | || Котлети з консервованого шпинату || || |- | || Кукурудза молода відварна || || |- | || Зелений горошок з морквою || || |- | || Зелений горошок у маслі || || |- | || Квасоля зелена відварна || || |- | || Спаржа в молочній підливі || || |- | || Запіканка з баклажанної ікри || || |- | || Ікра з баклажанів і квасолі || || |- | || Бабка з баклажанної ікри і картоплі || || |} == Страви з грибів == {| class="wikitable" |+ Страви з грибів |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Гриби смажені || 220 || |- | || Гриби, смажені в маслі, з картоплею || 220 || |- | || Гриби білі смажені || 220 || |- | || Гриби в сметані || 220 || |- | || Рижики з начинкою || 221 || |- | || Гриби, тушковані з цибулею || 222 || |- | || Гриби свіжі тушковані || 222 || |- | || Січеники грибні || 222 || |- | || Смажені солоні гриби з овочами || 223 || |- | || Гриби, запечені в сметані, з томатом і цибулею || 223 || |- | || Печериці смажені || 224 || |- | || Печериці, смажені в сметані || 224 || |- | || Печериці, запечені в сметані || 224 || |} === Страви з крупів === {| class="wikitable" |+ Страви з крупів |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Каша грибна чумацька || 226 || |- | || Польова каша || 226 || |- | || Рисова каша з грибами і маслом || 226 || |- | || Бабка пшоняна з яблуками || 227 || |- | || Палянички пшоняні || 227 || |- | || Пшоняна каша із сушеними сливами || 227 || |- | || Рисова каша з грибами || 228 || |- | || Бабка з рису і сиру || 228 || |- | || Бабка рисова з яблуками || 228 || |- | || Бабка з манних крупів || 229 || |- | || Сластьони з манних крупів || 229 || |- | || Оладки з манних крупів || 229 || |- | || Запіканка з манної каші || 230 || |- | || Протерта гречана каша || 231 || |- | || Биточки гречані з сметаною || 231 || |- | || Крупник з гречаної каші || 231 || |- | || Каша ячна, запечена із сметаною || 231 || |} == Страви з бобових == {| class="wikitable" |+ Страви з бобових |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Протерта квасоля || 232 || |- | || Січеники з квасолі || 233 || |- | || Оладки з квасолі || 233 || |- | || Бабка з квасолі || 233 || |- | || Горох або нут із салом || 233 || |- | || Протертий нут з морквою || 234 || |- | || Кульки з нуту з цибульною підливою || 234 || |- | || Січеники з гороху або нуту || 235 || |- | || Чина відварна з томатом і цибулею || 235 || |- | || Чина протерта з яблуками || 236 || |- | || Сочевиця відварна з цибулею || 236 || |- | || Протерта сочевиця з картоплею || 236 || |} == Страви з борошна == {| class="wikitable" |+ Страви з борошна |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Варениці з маслом || 237 || |- | || Варениці з цибулею || 237 || |- | || Варениці з сиром || 237 || |- | || Буцики з медом || 238 || |- | || Лемішка з салом || 238 || |- | || Локшина, запечена з м’ясом || 238 || |- | || Макарони з грибами || 239 || |- | || Макарони, запечені з сиром || 239 || |- | || Макарони в сметані || 239 || |- | || Сочники з сиром || 239 || |- | || Коржі з маком || 240 || |- | || Шулики з медом і маком || 240 || |- | || Сластьони || 240 || |- | || Сластьони на сметані || 241 || |- | || Гречана бабка з вершками || 241 || |- | || Гречана бабка з підливою || 242 || |- | || Гречані пампушки з часником || 242 || |- | || Пампушки пшеничні з часником || 242 || |- | || Гречаники || 243 || |- | || Присканці || 244 || |- | || Присканці з яблуками || 245 || |- | || Потапці з молоком і медом || 245 || |} === Вареники === {| class="wikitable" |+ Вареники |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Вареники || 245 || |- | || Вареники з сиром || 246 || |- | || Вареники з м’ясом || 247 || |- | || Вареники з печінкою і салом || 247 || |- | || Вареники з лівером || 247 || |- | || Вареники з картоплею || 248 || |- | || Вареники з картоплею і грибами || 248 || |- | || Вареники з капустою || 248 || |- | || Вареники з капустою і грибами || 248 || |- | || Вареники з квасолею і грибами || 249 || |- | || Вареники з грибами || 249 || |- | || Вареники з рибою || 249 || |- | || Вареники з полуницями || 250 || |- | || Вареники з вишнями або черешнями || 250 || |- | || Вареники з яблуками || 250 || |- | || Вареники із свіжих слив || 251 || |- | || Вареники з сушеними сливами || 251 || |- | || Вареники з маком || 251 || |- | || Вареники гречані з сиром || 251 || |- | || Вареники з гречаного і пшеничного борошна з сиром || 252 || |} === Галушки === {| class="wikitable" |+ Галушки |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Галушки || 252 || |- | || Галушки здобн || ••• || |- | || Галушки з шинкою || || |- | || Галушки гречані з салом || || |- | || Галушки гречані || || |- | || Галушки із сиру || || |- | || Галушки київські з печерицями || || |- | || Галушки з манних крупів || || |- | || Картопляні галушки || || |- | || Галушки із заварного тіста || || |- | || Галушки з хлібних сухарів || || |- | || Галушки з яблуками || || |- | || Галушки, запечені з сиром || || |} === Млинці і млинчики === {| class="wikitable" |+ Млинці і млинчики |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Млинці і млинчики || || |- | || Млинці гречані || || |- | || Млинці гречані швидкі || || |- | || Млинці гречано-пшеничні з яйцями || || |- | || Млинці любительські || || |- | || Млинці херсонські || || |- | || Млинці з гречаного і пшеничного борошна || || |- | || Млинці пшоняно-гречані || || |- | || Млинці червоні || || |- | || Млинці гречано-пшеничні || || |- | || Млинці манні || || |- | || Млинці пшеничні швидкі || || |- | || Млинці пшоняні || || |- | || Млинці без дріжджів || || |- | || Млинці з білого хліба || || |- | || Млинці з кукурудзяного борошна || || |- | || Млинці яблучні || || |- | || Млинці з яблуками || || |- | || Млинці з полуницями || || |- | || Млішці з вишнями || || |- | || Млинці апетитні || || |- | || Млинці молочні || || |- | || Млинчики звичайні || || |- | || Млинчики українські з повидлом || || |- | || Млинчики з сиром || || |- | || Млинчики з вишнями або сливами || || |- | || Млинчики з варенням || || |- | || Бабка з млинчиків з гречаною кашею і м’ясом || || |- | || Бабка з млинчиків і пшоняної каші || || |} == Страви з сиру і яєць == {| class="wikitable" |+ Страви з сиру і яєць |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Бабка з сиру і рису || || |- | || Пудинг із сиру || || |- | || Сирники варені || || |- | || Мочанка || || |- | || Сирники смажені || || |- | || Оладки із сиру || || |- | || Палянички із сиру || || |- | || Бабка із сиру і сметани || || |- | || Сирна бабка з яйцями || || |- | || Січеники з яєць по-українському || || |- | || Бабка з яєць || || |- | || Яєчня гуцульська || || |- | || Яєчня з ковбасою || || |- | || Яєчня з печерицями || || |- | || Яєчня з сухарями || || |- | || Яйця в сметані || || |- | || Яєчня з цибулею || || |- | || Яйця з підливою || || |- | || Яйця з хріном || || |- | || Яйця з начинкою || || |} = СОЛОДКІ СТРАВИ = == Солодкі страви == === Узвари і холодці === {| class="wikitable" |+ Узвари і холодці |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Узвари і холодці || 279 || |- | || Узвар || 279 || |- | || Узвар з яблук і журавлини || 279 || |- | || Узвар з чорниць || 280 || |- | || Узвар з яблук || 280 || |- | || Узвар із слив і ягід || 280 || |- | || Холодець з вишень || 280 || |- | || Холодець з малини або полуниць || 281 || |} === Киселі і страви з протертих фруктів === {| class="wikitable" |+ Киселі і страви з протертих фруктів |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Киселі і страви з протертих фруктів || 281 || |- | || Кисіль молочний || 281 || |- | || Кисіль молочний на жовтках || 281 || |- | || Киселиця || 282 || |- | || Черешнянка || 28 || |- | || Ябчанка || 282 || |- | || Ябчанка сметанна || 283 || |- | || Каїна з яблук з медом || 283 || |- | || Повидлянка || 283 || |} === Пінники === {| class="wikitable" |+ Пінники |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Пінники || 283 || |- | || Пінник з абрикосів || 283 || |- | || Пінник з ягід || 284 || |- | || Пінник із сметани || 284 || |- | || Пінник шоколадний || 285 || |- | || Пінник із сметани та збитих вершків || 285 || |- | || Журавлинник || 285 || |} === Бабки === {| class="wikitable" |+ Бабки |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Бабки || 286 || |- | || Бабка з маку || 286 || |- | || Бабка з яблук || 286 || |- | || Бабка з вишень || 287 || |- | || Бабка з горіхів || 287 || |- | || Бабка сирна запечена || 287 || |- | || Бабка сирна з мигдалем || 288 || |- | || Бабка з житніх сухарів || 288 || |- | || Бабка гречана з вершками || 288 || |} === Драглі === {| class="wikitable" |+ Драглі |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Драглі || 289 || |- | || Вершкові драглі || 289 || |- | || Вершково-шоколадні драглі || 289 || |- | || Кофейно-вершкові драглі || 289 || |- | || Драглі молочні || 289 || |- | || Драглі із збитих вершків || 290 || |- | || Драглі з ягід || 291 || |- | || Драглі з віЛіа || 291 || |- | || Сніжки || 291 || |} === Різні солодкі страви === {| class="wikitable" |+ Різні солодкі страви |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Різні солодкі страви || 292 || |- | || Пшенична каша з маком і горіхами || 292 || |- | || Ягоди в тісті || 292 || |- | || Яблука смажені || 293 || |- | || Тістечка з сиру || 293 || |- | || Вершківка || 294 || |- | || Кофейна вершківка || 294 || |- | || Шум вершковий || 295 || |- | || Рис із збитими вершками || 295 || |- | || Сир із сметаною і ягідним пюре || 295 || |- | || Сир солодкий з вареними жовтками || 295 || |- | || Сир ягідний || 295 || |- | || Сир солодкий || 296 || |} == Фруктово-ягідні консерви та заморожені плоди і ягоди, що використовуються як солодкі страви == {| class="wikitable" |+ Фруктово-ягідні консерви та заморожені плоди і ягоди, що використовуються як солодкі страви |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Натуральні фруктові консерви || 296 || |- | || Фруктові пюре || 296 || |- | || Фруктово-ягідні соки, сиропи і екстракти || 297 || |- | || Фруктово-ягідні соки || 297 || |- | || Сиропи || 297 || |- | || Екстракти || 298 || |- | || Заморожені плоди і ягоди || 298 || |} == Солодке тісто == {| class="wikitable" |+ Солодке тісто |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Вироби з дріжджового тіста || 300 || |- | || Баба українська || 302 || |- | || Баба звичайна || 302 || |- | || Баба мереживна || 304 || |- | || Папушник подільський || 304 || |- | || Папушник звичайний || 305 || |- | || Папушник ізюмовий || 305 || |- | || Папушник святковий || 306 || |- | || Папушник швидкий || 307 || |- | || Папушник південний || 308 || |- | || Папушник столітній || 308 || |- | || Пухкеники з кислого тіста || 309 || |- | || Плетеники кминні || 309 || |- | || Плетеники з маком || 310 || |- | || Яблучний пиріг (з кислого тіста) || 311 || |- | || Мандрики з вишнями || 311 || |- | || Мандрики з капустою || 312 || |- | || Пиріг волинський || 312 || |- | || Пиріг чернігівський || 313 || |- | || Сухарики || 314 || |- | || Сухарі полтавські || 315 || |- | || Рогалі || 315 || |- | || Обаринки || 316 || |- | || Плетуни || 317 || |- | || Сирник || 317 || |- | || Горішки || 318 || |} === Вироби із здобного і пісочного тіста === {| class="wikitable" |+ Вироби із здобного і пісочного тіста |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Вироби із здобного і пісочного тіста || 319 || |- | || Печиво до чаю || 321 || |- | || Печиво для дітей || 322 || |- | || Мантульки київські || 322 || |- | || Медовик || 323 || |- | || Медовик міський || 323 || |- | || Медовик з лимоном || 324 || |- | || Медові пряники || 324 || |- | || Медовики вільшанські || 324 || |- | || Медовик пухкий || 325 || |- | || Медовики житні || 325 || |- | || Пундики столітні || 326 || |- | || Пундики до кофе || 326 || |- | || Коржики солодкі || 326 || |- | || Коржики мигдальні || 327 || |- | || Коржики батуринські || 327 || |- | || Коржики солоні || 328 || |- | || Коржики з кмином || 328 || |- | || Коржики розсипчасті || 328 || |- | || Коржики із шкварок || 328 || |- | || Солоні пальчики || 329 || |- | || Вергуни || 329 || |- | || Вергуни київські || 330 || |- | || Вергуни волинські || 330 || |- | || Вергуни суботівські || 330 || |- | || Вергуни конотопські || 331 || |- | || Вергуни львівські || 331 || |- | || Троянда українська || 332 || |- | || Мандрики з сиром || 332 || |- | || Мандрики з варенням || 333 || |- | || Мандрики із сливами || 333 || |- | || Мандрики з полуницями або малиною || 334 || |- | || Пундики з вершками || 334 || |- | || Плетеники || 335 || |- | || Плетеники львівські || 335 || |- | || Київський пиріг з вишнями || 335 || |- | || Пиріг з повидлом || 336 || |- | || Пиріг швидкий || 336 || |- | || Пиріг з яблуками || 337 || |- | || Пиріг із сливами || 337 || |- | || Пиріг з вишнями і сметаною || 337 || |- | || Трубки з сметаною || 337 || |- | || Соложеники || 338 || |- | || Соложеники полтавські || 339 || |- | || Соложеники вишневі || 339 || |- | || Соложеники сирні || 340 || |- | || Соложеники з маком || 340 || |- | || Перекладанець || 341 || |- | || Вертуни з яблуками || 342 || |- | || Капама з повидлом || 342 || |- | || Капама з горіхами і медом || 343 || |- | || Капама з яблуками та іншими фруктами || 344 || |- | || Капама з маком і медом || 344 || |- | || Крихкі баки із збитою сметаною || 345 || |- | || Бабка з сиру || 345 || |- | || Бабка з черешнями або вишнями || 346 || |- | || Тістечка з тертої булки || 346 || |- | || Тістечка з сухих слив || 346 || |- | || Тістечко ізюмне || 347 || |- | || Тістечка розсипчасті з джемом || 347 || |- | || Тістечка пісочні глазуровані || 347 || |- | || Тістечка пісочні з кільцем || 349 || |- | || Тістечка розсипчасті || 349 || |- | || Тістечка макові || 349 || |- | || Торт яблучний || 349 || |- | || Торт вишневий || 351 || |- | || Торт з полуницями || 351 || |- | || Торт з сиру || 351 || |- | || Торт ромовий || 352 || |- | || Торт пісочний || 352 || |} === Вироби з бісквітного тіста === {| class="wikitable" |+ Вироби з бісквітного тіста |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Вироби з бісквітного тіста || 352 || |- | || Торт бісквітний || 354 || |- | || Баба з житнього хліба || 355 || |- | || Торт хлібний || 355 || |- | || Тортик ізюмний || 356 || |- | || Тортики жовтоводські || 357 || |- | || Тортики житні || 357 || |- | || Папушник білосніжний || 357 || |- | || Тортик горіховий || 358 || |- | || Папушник з житніх сухарів || 358 || |- | || Тістечка із збитих білків з горіхами || 358 || |- | || Торт картопляний || 358 || |- | || Торт з чорного хліба || 359 || |- | || Соложеники мигдальні || 359 || |- | || Соложеники з житнього хліба || 359 || |- | || Соложеннк сметанний || 359 || |} === Вироби з заварного тіста === {| class="wikitable" |+ Вироби з заварного тіста |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Вироби з заварного тіста || 360 || |- | || Бублики свистуни || 360 || |- | || Макорженики || 360 || |- | || Пряники пісні || 361 || |- | || Бабка заварна || 361 || |- | || Сухарі глазуровані || 361 || |- | || Сухарі з горіхами || 362 || |- | || Пухкеники || 362 || |- | || Пухкеники з варенням || 362 || |} = НАПОЇ = == Напої домашнього приготування == {| class="wikitable" |+ Напої домашнього приготування |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Варенуха || 366 || |- | || Узварець || 366 || |- | || Гаряче вино з імбиром || 366 || |- | || Спотикач || 366 || |- | || Запіканка || 366 || |- | || Па лейка || 367 || |- | || Мокруха || 367 || |- | || Контабас || 367 || |- | || Спотикач з анісу || 367 || |- | || Слив’янка || 368 || |- | || Морелівка || 368 || |- | || Тернівка || 368 || |- | || Малинівка || 368 || |- | || Вишнівка || 369 || |- | || Вишнівка старосвітська || 369 || |- | || Вишнівка київська || 369 || |- | || Вишняк || 370 || |- | || Мочена || 370 || |- | || Тертуха || 370 || |- | || Тертуха київська || 370 || |- | || Цитринівка || 370 || |- | || Спотикач з лимона || 371 || |- | || Агрусівка || 371 || |- | || Полуничник || 371 || |- | || Спотикач з ягід || 371 || |- | || Спотикач з кофе || 372 || |- | || Спотикач з горіхів || 372 || |- | || Муеелець || 372 || |- | || Літній напій || 372 || |- | || Апельсиновий напій || 373 || |- | || Яблучний напій || 373 || |- | || Горобинівка || 373 || |- | || Мед домашній || 37 || |- | || Мед межигірський || 373 || |- | || Мед старосвітський || 374 || |- | || Мед київський || 374 || |- | || Пиво запорізьке || 375 || |- | || Пиво мошногореьке || 375 || |- | || Квас хлібний || 375 || |- | || Квас броварський || 375 || |- | || Квас журавлинний || 376 || |- | || Квас лимонний || 376 || |- | || Квас малиновий || 376 || |- | || Квас запорізький || 376 || |- | || Квас козацький || 377 || |- | || Ягодянка || 377 || |- | || Яблучник || 377 || |- | || Льодок яблучний || 377 || |- | || Шипучка || 378 || |} === Виноградні вина === {| class="wikitable" |+ Виноградні вина |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Столові вина || 380 || |- | || Кріплені вииа || 381 || |- | || Кріплені міцні вина || 381 || |- | || Кріплені напівсолодкі вина || 382 || |- | || Кріплені солодкі вина || 382 || |- | || Кріплені лікерні вина || 383 || |- | || Ароматизовані вииа || 384 || |- | || Плодоягідні вииа || 384 || |- | || Сидр || 385 || |- | || Радянське шампанське || 385 || |- | || Коньяки || 3«6 || |- | || Настойки, наливки, лікери || 386 || |- | || Настойки || 387 || |- | || Наливки || 387 || |- | || Лікери || 387 || |- | || Пиво || || |} = СЕРВІРУВАННЯ СТОЛА = == Сервірування стола і порядок подавання страв та напоїв == {| class="wikitable" |+ Сервірування стола і порядок подавання страв та напоїв |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Подавання на стіл вина || 398 || |- | || Сервірування чайного стола || 399 || |} = ДОМАШНІ ЗАГОТІВЛІ = {| class="wikitable" |+ Домашнні заготівлі |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Квашення капусти || 405 || |- | || Засолювання огірків || 407 || |- | || Засолювання помідорів || 409 || |- | || Квашення буряків || 410 || |- | || Засолювання пряної зелені || 410 || |- | || Засолювання солодкого стручкового перцю || 411 || |- | || Засолювання і квашення кавунів || 412 || |- | || Квашення яблук || 413 || |- | || Маринування фруктів || 414 || |- | || Маринування овочів || 416 || |- | || Приготування томату-пюре || 417 || |- | || Приготування повидла || 419 || |- | || Приготування варення || 420 || |- | || Суничне, полуничне та малинове варення || 421 || |- | || Вишневе варення || 422 || |- | || Чорносмородинове вареиия || 422 || |- | || Яблучне варення || 423 || |- | || Грушове варення || 423 || |- | || Айвове варення || 423 || |- | || Варення з райських і китайських яблук || 423 || |- | || Сливове варення || 424 || |- | || Абрикосове варення || 424 || |- | || Персикове варення || 424 || |- | || Агрусове варення || 424 || |- | || Кизилове варення || 425 || |- | || Журавлинне варення || 425 || |- | || Сушіння плодів || 425 || |- | || Сушіння окремих видів плодів || 426 || |- | || Консервування грибів || 427 || |- | || Сушіння грибів || 427 || |- | || Маринування грибів || 427 || |- | || Соління грибів || 428 || |} = ЗБЕРІГАННЯ ПРОДУКТІВ = {| class="wikitable" |+ Зберігання продуктів |- ! № п/п !! Оригінальна назва !! №№ стр. !! Стаття у Вікіпідручниках |- | || Зберігання продуктів, що швидко псуються || 431 || |- | || Зберігання овочів, картоплі і фруктів || 436 || |- | || Зберігання інших продуктів || 439 || |} == Посилання == * [https://archive.org/details/stravy1960/page/n503/mode/2up Книга «Українські страви» на сайті archive.org]{{ref-uk}} [[Категорія:Кулінарна книга]] 94uanyaj69q1005666tlo32jklplm2i