在try / catch之前初始化非null类型变量

时间:2018-06-18 23:58:50

标签: 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并且我没有&#39 ; t想要将我的所有逻辑移到try阻止?

1 个答案:

答案 0 :(得分:3)

您有几个选择。

1)你可以使用var

第一个选项是将cmd设为var并为其指定默认值或null。当然,如果你使cmd可以为空,你需要在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")
}