Проблема
Я использую Java Reflection API для создания нового экземпляра класса Data
:
val targetObject = Class.forName(sourceObject.javaClass.name).getConstructor().newInstance()
Копилер никогда не жалуется на newInstance()
исключение. Но при создании нового экземпляра класса Data
он, естественно, создает исключение NoSuchMethodException: <init> []
, поскольку класс Data
не имеет неявного конструктора с нулевым аргументом, если только не присвоены начальные значения или не добавлен конструктор с нулевым аргументом.
Эта реализация является частью библиотеки, и я хочу сообщить разработчику, что происходит не так, и что нужно сделать, чтобы решить проблему, «переопределив» NoSuchMethodException
с помощью собственного тела, иначе разработчик не поймет, как решить проблему. Например, уведомление разработчика о том, что класс Data
должен иметь либо конструктор с нулевым аргументом, либо значения по умолчанию.
Решение
В настоящее время я передаю объект sourceObject
в метод и возвращаем новый экземпляр или ноль, затем с помощью оператора Элвиса я «переопределяю» исходное исключение:
val targetObject = newIntanceOrNull(sourceObject) ?: throw NoSuchMethodException("Custom message")
// Rest of the code
fun newIntanceOrNull(sourceObject: Any): Any? = try {
Class.forName(sourceObject.javaClass.name).getConstructor().newInstance()
} catch (e: NoSuchMethodException) {
null
}
Что я ищу
A встроенный оператор (или функция), аналогичный оператору Элвиса, но для исключений. Скажем, с левой стороны оператора происходит сбой из-за исключения, тогда должна выполняться правая сторона.