package com.example.test
import java.lang.Thread.UncaughtExceptionHandler
class TestAppUncaughtExceptionHandler : UncaughtExceptionHandler {
override fun uncaughtException(thread: Thread, ex: Throwable) {
val message = "Thread name: ${thread.name}, Exception: ${ex.fillInStackTrace()}"
// На строке ниже ставь точку останова (breakpoint) и смотри, что написано в исключении.
println(message)
}
}
package com.example.test
import android.app.Application
// Указывается в манифесте, чтобы работал
class TestApplication : Application() {
override fun onCreate() {
super.onCreate()
Thread.setDefaultUncaughtExceptionHandler(TestAppUncaughtExceptionHandler())
}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.example.test"
xmlns:android="http://schemas.android.com/apk/res/android">
<application
android:name=".TestApplication">
<activity
...
</activity>
</application>
</manifest>
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
kotlin("jvm") version "1.7.0"
}
group = "org.example"
version = "1.0-SNAPSHOT"
repositories {
maven {
url = uri("https://jitpack.io")
}
mavenCentral()
}
dependencies {
implementation("io.github.kotlin-telegram-bot.kotlin-telegram-bot:telegram:6.0.7")
testImplementation(kotlin("test"))
}
tasks.test {
useJUnitPlatform()
}
tasks.withType<KotlinCompile> {
kotlinOptions.jvmTarget = "1.8"
}
plugins {
id 'org.jetbrains.kotlin.jvm' version '1.7.0'
}
group = 'org.example'
version = '1.0-SNAPSHOT'
repositories {
maven { url "https://jitpack.io" }
mavenCentral()
}
dependencies {
implementation 'io.github.kotlin-telegram-bot.kotlin-telegram-bot:telegram:6.0.7'
testImplementation 'org.jetbrains.kotlin:kotlin-test'
}
test {
useJUnitPlatform()
}
compileKotlin {
kotlinOptions.jvmTarget = '1.8'
}
compileTestKotlin {
kotlinOptions.jvmTarget = '1.8'
}
val newLine: String = System.lineSeparator()
val menu: List<String> = listOf("Пиво", "Пахлёбка ", "Супец")
fun main(args: Array<String>) {
val hearth: Int = 5
val projectName: String = "Мечи Средиземья"
val defaultSteed: String = "- Скакуна нет "
val traktirName: String = "Рог Единорога"
val buyManName: String = "Эдгар"
val moneySum: Int = 23
val hasSteed: String = defaultSteed
val heroName: String = "Дионис"
println(projectName)
println(hasSteed)
println("Здоровье: $hearth")
println("Монет: $moneySum")
println("Главный герой прибыл в трактир $traktirName ${newLine}Вас приветствует владелец трактира $buyManName")
try {
val message = "Выберите действие:${newLine}Открыть Меню - 1${newLine}Посмотреть в зеркало - 2"
when (requestUserInputAsInt(message, IntRange(1, 2))) {
1 -> println("Меню: $menu")
2 -> println("В зеркале герой увидел свое имя $heroName")
}
} catch (ex: Throwable) {
ex.printStackTrace()
println(ex)
}
}
/**
* Запросить ввод пользователем целого числа. В случае неправильного ввода запрос будет осуществлён повторно.
* @param message Сообщение, которое будет выведено на консоль, при первом и повторных запросах ввода.
* @param range диапазон чисел, в которые должен попасть пользовательский ввод.
* */
fun requestUserInputAsInt(message: String? = null, range: IntRange? = null): Int {
range?.let {
if (it.first > it.last) throw IllegalArgumentException("first > last: (${it.first} > ${it.last})")
}
val result: Int
while (true) {
message?.let { println(it) }
val line = readlnOrNull()
if (!line.isNullOrBlank()) {
val resultTemp: Int? = line.toIntOrNull()
if (resultTemp != null) {
if (range != null) {
if (resultTemp >= range.first &&
resultTemp <= range.last
) {
result = resultTemp
break
}
} else {
result = resultTemp
break
}
}
}
}
return result
}
index: 0: value: 1
index: 1: value: 2
index: 2: value: 3
index: 3: value: 4
index: 4: value: 5
fun main(args: Array<String>) {
val numbers = intArrayOf(1, 2, 3, 4, 5)
// Исходный пример
for (index in numbers.indices - 2) {
println("index: $index: value: ${numbers[index]}")
}
println("------")
// Пример-объяснение. Были взяты оригинальные методы расширения
// и вынесены сюда для удобства отладки и наглядности.
for (index in minus(numbers.indices, 2)) {
println("index: $index: value: ${numbers[index]}")
}
}
fun <T> minus(iterable: Iterable<T>, element: T): List<T> {
val arraySize = collectionSizeOrDefault(iterable, 10)
val result = ArrayList<T>(arraySize)
var removed = false
return filterTo(iterable, result) {
if (!removed && it == element) {
removed = true; false
} else true
}
}
fun <T> collectionSizeOrDefault(iterable: Iterable<T>, default: Int): Int =
if (iterable is Collection<*>) iterable.size else default
fun <T, C : MutableCollection<in T>> filterTo(iterable: Iterable<T>, destination: C, predicate: (T) -> Boolean): C {
for (element in iterable) if (predicate(element)) destination.add(element)
return destination
}
val result: List<Int> = minus(numbers.indices, 2)
for (index in result) {
println("index: $index: value: ${numbers[index]}")
}
index: 0: value: 1
index: 1: value: 2
index: 3: value: 4
index: 4: value: 5
------
index: 0: value: 1
index: 1: value: 2
index: 3: value: 4
index: 4: value: 5