如何在Kotlin中抛出自定义异常?我没从医生那里了解到多少...在文档中,它描述了每个异常需要什么,但我到底如何实现它?
ut6juiuv1#
有一点要记住:如果你使用的是IntelliJ IDE,只需简单地复制/粘贴Java代码就可以将其转换为Kotlin。回到你的问题,现在。如果你想创建一个自定义的Exception,只需要扩展Exception类,比如:
class TestException(message:String): Exception(message)
字符串然后像这样扔出去
throw TestException("Hey, I am testing it")
型
mzsu5hc02#
这些答案中的大多数都忽略了Exception有4个构造函数的事实。如果你想在所有正常异常工作的情况下都能使用它,可以:
class CustomException : Exception { constructor() : super() constructor(message: String) : super(message) constructor(message: String, cause: Throwable) : super(message, cause) constructor(cause: Throwable) : super(cause) }
字符串这将覆盖所有4个构造函数,并沿着传递参数。编辑:请向下滚动到R. Agnese答案,它设法做到这一点,而不覆盖4个容易出错的构造函数。
R. Agnese
4ngedf3f3#
我知道这是旧的,但我想详细说明@DownloadPizza的答案:https://stackoverflow.com/a/64818325/9699180你实际上并不需要四个构造函数。你只需要两个就可以匹配基础Exception类的四个:
class CustomException(message: String? = null, cause: Throwable? = null) : Exception(message, cause) { constructor(cause: Throwable) : this(null, cause) }
字符串Exception基类来自Java标准库,Java没有默认参数,因此Java类必须为每个可接受的输入组合提供四个构造函数。此外,message和cause在Exception中都被允许是null,所以如果我们试图与Exception 100%兼容,我们的也应该是。我们甚至需要第二个构造函数的唯一原因是为了避免在Kotlin代码中使用命名参数语法:CustomException(cause = fooThrowable)与Exception(fooThrowable)。
message
cause
null
CustomException(cause = fooThrowable)
Exception(fooThrowable)
vc9ivgsu4#
就像这样:
class CustomException(message: String) : Exception(message)
字符串
fun main(args: Array<String>) { throw CustomException("Error!") // >>> Exception in thread "main" } // >>> CustomException: Error!
cngwdvgl5#
假设你想在计算器中抛出一个自定义的Exception。日志记录是可选的,您可以删除init块
class CalculationException constructor(message: String= "ERROR: Invalid Input", cause: Throwable): Exception(message, cause) { init { Log.e("CalculationException", message, cause) } }
用法:
没有留言
throw(CalculationException())
输出:默认消息
原因:CalculationException:错误:无效输入或只有消息没有原因
throw(CalculationException("Some Weird Exception")) enter code here
输出:自定义消息
工艺:PID:23345 java.lang.RuntimeException:无法启动活动ComponentInfo{CalculationException:一些奇怪的例外或信息和原因
throw(CalculationException("Divide ByZero", ArithmeticException()))
型2021-08-12 19:36:55.705 17411-17411/ E/计算异常:除零java.lang.ArithmeticException
yftpprvb6#
最简单/最短的解决方案,如果你不需要别的东西,是这样的
class CustomException : Exception()
6条答案
按热度按时间ut6juiuv1#
有一点要记住:如果你使用的是IntelliJ IDE,只需简单地复制/粘贴Java代码就可以将其转换为Kotlin。
回到你的问题,现在。如果你想创建一个自定义的Exception,只需要扩展Exception类,比如:
字符串
然后像这样扔出去
型
mzsu5hc02#
这些答案中的大多数都忽略了Exception有4个构造函数的事实。如果你想在所有正常异常工作的情况下都能使用它,可以:
字符串
这将覆盖所有4个构造函数,并沿着传递参数。
编辑:请向下滚动到
R. Agnese
答案,它设法做到这一点,而不覆盖4个容易出错的构造函数。4ngedf3f3#
我知道这是旧的,但我想详细说明@DownloadPizza的答案:https://stackoverflow.com/a/64818325/9699180
你实际上并不需要四个构造函数。你只需要两个就可以匹配基础Exception类的四个:
字符串
Exception基类来自Java标准库,Java没有默认参数,因此Java类必须为每个可接受的输入组合提供四个构造函数。此外,
message
和cause
在Exception中都被允许是null
,所以如果我们试图与Exception 100%兼容,我们的也应该是。我们甚至需要第二个构造函数的唯一原因是为了避免在Kotlin代码中使用命名参数语法:
CustomException(cause = fooThrowable)
与Exception(fooThrowable)
。vc9ivgsu4#
就像这样:
实施
字符串
用法
型
cngwdvgl5#
为什么不合并两个答案
假设你想在计算器中抛出一个自定义的Exception。日志记录是可选的,您可以删除init块
字符串
用法:
没有留言
型
输出:默认消息
原因:CalculationException:错误:无效输入
或
只有消息没有原因
型
输出:自定义消息
工艺:PID:23345 java.lang.RuntimeException:无法启动活动ComponentInfo{CalculationException:一些奇怪的例外
或
信息和原因
型
2021-08-12 19:36:55.705 17411-17411/ E/计算异常:除零java.lang.ArithmeticException
yftpprvb6#
最简单/最短的解决方案,如果你不需要别的东西,是这样的
字符串