В течение многих лет я был Java разработчиком, в основном разрабатывая MVC веб-приложения с использованием Spring. Я изучаю Kotlin и Android как проект саморазвития, и в основном мне это нравится. Обычно я просто все выясняю, но мне кажется, что мне здесь чего-то не хватает (поскольку мне нравится писать код, который легко поддерживать и который не подвержен исключениям). Я понимаю взаимодействие с Java, я просто запутался в том, как мой код Kotlin компилируется и не дает мне никаких предупреждений о том, что вызов метода Java вызывает исключение.
Здесь Это очень простой пример из Android Tutorials о том, как написать файл, демонстрирующий эту проблему (Из Camera Intent Tutorial). File.createTempFile () генерирует IO Exception в Java, но Kotlin позволяет мне просто вызывать этот метод, как будто ничто не генерирует никаких исключений вообще. Если я удаляю аннотацию @Throws для метода, я не получаю предупреждения о том, что я вызываю метод, который потенциально может вызвать исключение.
@Throws(IOException::class)
private fun createImageFile(): File {
// Create an image file name
val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date())
val storageDir: File = getExternalFilesDir(Environment.DIRECTORY_PICTURES)
return File.createTempFile(
"JPEG_${timeStamp}_", /* prefix */
".jpg", /* suffix */
storageDir /* directory */
).apply {
// Save a file: path for use with ACTION_VIEW intents
currentPhotoPath = absolutePath
}
}
Я просто запутался в том, как я должен это делать Следите за Java методами, которые генерируют исключения. Я знаю много исключений, и в этом примере есть исключение, но я никоим образом не знаю (или не могу знать) каждое возможное исключение для каждого вызова метода в библиотеках Java и / или Java. Должен ли я go просматривать исходный код каждого метода, который я вызываю, чтобы убедиться, что я не пропустил исключение? Это кажется очень утомительным и довольно трудоемким в крупномасштабной кодовой базе.
Это называется прекрасно из моего кода без аннотации @Throws, даже если в Java выдается исключение ввода-вывода. Как я узнаю, что метод Java создает исключение, которое мне нужно учитывать при кодировании (не глядя на исходный код)?
private fun createImageFile(): File {
// Create an image file name
val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date())
val storageDir: File = getExternalFilesDir(Environment.DIRECTORY_PICTURES)
return File.createTempFile(
"JPEG_${timeStamp}_", /* prefix */
".jpg", /* suffix */
storageDir /* directory */
).apply {
// Save a file: path for use with ACTION_VIEW intents
currentPhotoPath = absolutePath
}
}
Я прочитал документы об исключениях и на Java совместимости, мне просто интересно, есть ли более простой способ определить, если метод Java выдает исключение, а затем посмотреть на исходный код (может быть, я что-то пропустил)?
https://kotlinlang.org/docs/reference/java-interop.html https://kotlinlang.org/docs/reference/exceptions.html
//Checked Exceptions
//In Kotlin, all exceptions are unchecked, meaning that the compiler does not force you to catch any
//of
// them. So, when you call a Java method that declares a checked exception, Kotlin does not force you
//to
//do anything:
fun render(list: List<*>, to: Appendable) {
for (item in list) {
to.append(item.toString()) // Java would require us to catch IOException here
}
}