我正在为“main”类编写构造函数。它做的第一件事是调用一个方法来使用commons-cli来解析命令行。如果parseOptions
方法返回false,则发生错误,构造函数应退出。
我尝试编写以下代码
if (!parseOptions(args)) return
但是编译器抱怨我有一个“在方法定义之外的返回语句”。
没有调用System.exit(1)
或反转布尔值(并将我的所有其余逻辑放在if
语句中,有没有办法从构造函数返回“早期”?
我想我可以让parseOptions
方法抛出IllegalArgumentException
并在我的Main
对象中捕获它。
感谢。
答案 0 :(得分:12)
不要尝试早期/早期返回,这会使您的代码更加复杂,因为返回的副作用很难理解。而是使用异常来表示出现问题。
您可以在构造函数中使用require。这不会回来。但似乎抛出异常实际上更符合他的情况。
如:
class MyTest(
private var myValue: Int ){
require(myValue > 0) // Connected to constructor
}
defined class MyTest
scala> val x = new MyTest(10)
x: MyTest = MyTest@49ff4282
scala> val y = new MyTest(-10)
java.lang.IllegalArgumentException: requirement failed
at scala.Predef$.require(Predef.scala:133)
答案 1 :(得分:11)
有没有办法从构造函数
返回“早期”
没有。但是在你的情况下,无论如何它听起来都是糟糕的设计。
如果parseOptions方法返回false,则发生错误
在这种情况下,构造函数应抛出异常,而不是正常返回。
答案 2 :(得分:4)
构造函数应始终完全完成或中止(抛出异常)。任何其他东西都会使你的物体“半结构化”,因而无法推理。
如果在您的情况下,即使parseOptions失败,该对象也有效,那么您可以更改条件并继续:
if (parseOptions(args)) {
// rest of constructor
}