以下是贷款模式的一个常见示例:
def using[A <: {def close() : Unit}, B](param: A)(f: A => B): B =
try {
f(param)
} finally {
param.close()
}
我需要照顾NPE并添加支票吗?
def using[A <: {def close() : Unit}, B](param: A)(f: A => B): B =
try {
f(param)
} finally {
if (param != null) param.close()
}
答案 0 :(得分:0)
如果将资源归零是合法使用API,请检查null
。不要检查它只是因为技术上可能引用类型包含null,或者你将检查每隔一行代码为null。
答案 1 :(得分:-1)
这是单元测试(甚至可能是TDD)有用的地方。您应该测试每个可能的场景,并确保您的功能表现得如此。
在回答你的问题时 - 如果你认为他们可能被击中,那么对于边缘案件进行会计处理并没有错。但是,我认为如果null
会在您的函数中引发异常,则应将其放在catch
括号中,例如:
def using[A <: {def close() : Unit}, B](param: A)(f: A => B): B = {
try {
f(param)
param.close()
} catch {
case e: RuntimeException => ???
case e: NullPointerException => ???
case e: Exception => ??? // do something with the exceptions
}
}
这样,您可以根据需要处理异常。当然,您也可以随时添加finally
括号,或者如果符合您的需要,将param.close()
移回finally
。