java - 在 try/catch 之前初始化非空类型变量

标签 java kotlin try-catch

假设我有这段代码:

val cmd: CommandLine
try {
    cmd = parser.parse(options, args)
} catch (ex: ParseException) {
    // do stuff
}

// error: cmd is not initialized
val inputArg = cmd.getOptionValue("someArg")

我收到错误是因为 cmd 未初始化,这是预期的,通常我会用 Java 中的 null 值初始化它,但是如果类型是 non-null 并且我不想将我所有的逻辑移动到 try block ?

最佳答案

您有几个选择。

1) 你可以使用 var

第一个选项是使 cmd 成为 var 并为其分配默认值或 null。当然,如果您使 cmd 可以为 null,则需要在 try-catch 之后检查 null。 (我推荐某种默认值,可能是某种 EmptyCommandLine)。

2) 更好的是,使用 try-catch 作为表达式

第二种选择是像这样使用 try-catch 作为表达式:

val cmd: CommandLine = try {
        parser.parse("options", "args")
    } catch (ex: Exception) {
        // Must:
        // 1) Throw, or error in some other way so as to return Nothing.
        // 2) Return a default/failed value for cmd. Maybe something like EmptyCommandLine or FailedCommandLine(ex)
        // 3) Make cmd nullable and return null.

        CommandLine() // or, error("Unable to parse options!")
    }

    val inputArg = cmd.getOptionValue("someArg")
}

关于java - 在 try/catch 之前初始化非空类型变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50918924/

相关文章:

kotlin - Kotlin 有原始类型吗?

java - 如何解决我的 try-catch 异常处理?

java - gu 没有这样的文件或目录

java - RecyclerView不显示数据

android - 在调试设备上测试时显示 UPDATE_NOT_AVAILABLE 的应用内更新 API

Android自定义 View : How to update custom enum attribute via LiveData & data binding

java - 我无法删除 mysql 表中的所有行

java - 尝试/最终阻止问题

java - 将透明圆圈添加到背景图像

java - 在java Android中解析JSON代码