如何在Swift中捕获空指针异常?

时间:2016-04-12 15:39:25

标签: ios swift

我有这段代码:

var graphPoints:[Int] = DBController().dosmth()

这会调用一个应该返回Int数组的方法。但是,如果传递的值不是Int,我该如何处理这种情况呢?目前它只是抛出这个

fatal error: unexpectedly found nil while unwrapping an Optional value

我想这样抓住:

do{
    var graphPoints:[Int] = DBController().dosmth()
}
catch{ }

但这会引发错误。如果有人能够指出我做错了什么,将不胜感激。

3 个答案:

答案 0 :(得分:4)

首先,你无法理解这一点。这是一个编程错误。编程错误表明系统处于未知状态且无法恢复。如果发生这种情况,您就会遇到错误,并且必须修复该错误。

这不是"空指针异常。" Swift中没有这样的东西。此错误表示您几乎肯定在某个您不应该使用的地方使用!!表示"我绝对知道这会起作用,如果我错了,就会导致程序崩溃。"你错了,它破坏了程序。这不是例外。

查看代码并找到您错误地使用!的地方。 "错误"意味着你无法证明的任何地方,只要通过查看你面前的代码,它就永远不会失败(无论如何,你想要崩溃)。如果你的意思是" 应该永远不会失败,"那么你的意思是使用?,而不是!。更好的是,尽可能地重新编写代码,以便实际上可以永远不会失败。这通常比任何类型的可选项更好(无论是显式还是隐式展开)。

答案 1 :(得分:3)

方法dosmth()应该返回[Int]?,这意味着它可以返回nil,然后当使用graphPoints时,如果让我们解开像

那么
if let graphPoints = graphPoints {
    use_graphPoints
}

或可选的nil合并,例如

grpahPoints?.count ?? 0

或者,您可以通过

func dosmth()设置为throws
func dosmth() throws {

}

然后在调用它时

do {
    graphPoints:[Int] = try DBController().dosmth() 
} catch {
    print(error)
}

更多信息可以在这里找到:

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ErrorHandling.html

答案 2 :(得分:0)

您可以包装可选值以使代码安全。

var graphPoints = [Int]()
if let array = DBController().dosmth() {
    graphPoints = array
}