代码之家  ›  专栏  ›  技术社区  ›  Yar

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

  •  1
  • Yar  · 技术社区  · 6 年前

    假设我有这段代码:

    val cmd: CommandLine
    try {
        cmd = parser.parse(options, args)
    } catch (ex: ParseException) {
        // do stuff
    }
    
    // error: cmd is not initialized
    val inputArg = cmd.getOptionValue("someArg")
    

    我得到错误是因为命令没有初始化,这是预期的,通常我会用 null Java中的值,但如果类型是 non-null 我不想把所有的逻辑转移到 try 封锁?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Aro    6 年前

    你有几个选择。

    1)您可以使用var

    第一种选择是 cmd var 并指定一个默认值或空值。当然,如果您使 命令 可以为空。(我建议使用某种默认值,可能是 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")
    }