我被这样的情况咬了很多遍:
INSERT INTO [dbo].[TEP_ReceiptID] ([ReceiptID]) Values (UCase(Left(Application.username, 1) & Right(Application.username, 1)) & cast(cast(rand()*99 as int) as varchar(2)))
在此示例中,所有内容都进行了编译,但最后一行在运行时引发了NullPointerException,(我认为)是因为trait MyTrait {
val implementMe: String
val upper = implementMe.toUpperCase
}
class MyClass(s: String) extends MyTrait {
override val implementMe: String = s
}
val c = new MyClass("Hello, World")
println(c.upper)
是在实际定义upper
之前计算出来的。
我知道我可以通过将implementMe
更改为upper
或def
来解决它,但是似乎应该在编译时而不是运行时捕获它。我做错了什么/在编译时是否可以检测到此类问题?编译器允许这样做吗?
答案 0 :(得分:0)
问题是初始化,正如您所说。据我所知,没有办法在编译时检测到这一点。有一个技巧叫早期初始化,它使您可以避免def
或lazy val
(如果这是您的目标)的同时解决此问题:
class MyClass(s: String) extends { override val implementMe: String = s } with MyTrait