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

Ios 如何在Swift中捕获空指针异常?,ios,swift,Ios,Swift,我有一段代码: var graphPoints:[Int] = DBController().dosmth() 这将调用一个方法,该方法应该返回一个Int数组。但是,当传递的值不是Int时,我如何处理这种情况呢?目前它只是抛出了这个 致命错误:在展开可选值时意外发现nil 我想这样捕捉: do{ var graphPoints:[Int] = DBController().dosmth() } catch{ } 但这会带来错误。如果有人能指出我做错了什么,我将不胜感激。您可以包装一个

我有一段代码:

var graphPoints:[Int] = DBController().dosmth()
这将调用一个方法,该方法应该返回一个
Int
数组。但是,当传递的值不是
Int
时,我如何处理这种情况呢?目前它只是抛出了这个

致命错误:在展开可选值时意外发现nil

我想这样捕捉:

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

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

您可以包装一个可选值以确保代码安全

var graphPoints = [Int]()
if let array = DBController().dosmth() {
    graphPoints = array
}
方法
dosmth()
应该返回
[Int]?
意味着它可以返回
nil
,然后在使用
图形点时,如果让我们像

if let graphPoints = graphPoints {
    use_graphPoints
}
或可选的零合并,例如

grpahPoints?.count ?? 0
或者,您可以将
func dosmth()
设置为
通过

func dosmth() throws {

}
那叫它什么时候

do {
    graphPoints:[Int] = try DBController().dosmth() 
} catch {
    print(error)
}
更多信息可在此处找到:


首先,你不能抓住这个。这是一个编程错误。编程错误表明系统处于未知状态,无法恢复。如果发生这种情况,您就有一个bug,您必须修复这个bug

这不是“空指针异常”。Swift中没有这种情况。此错误表明您几乎肯定正在使用
不应该在的地方<代码>
的意思是“我绝对知道这会起作用,如果我错了,就让程序崩溃。”你错了,程序就崩溃了。这也不例外


查看代码并找到您正在使用的位置
错误。“不正确”是指任何你不能证明它永远不会失败的地方,只要看看你面前的代码就可以了(如果它真的失败了,你就想崩溃)。如果您的意思是“它永远不会失败”,那么您的意思是使用
,而不是
。更好的是,只要有可能,重新编写代码,使其实际上永远不会失败。这通常比任何可选的(无论是显式的还是隐式的)都要好。

请下载iBook商店的Swift书籍。这是Swift语言的基本功能,您绝对需要了解这一点,而且不会出现空指针异常。你得到的可选值为零,如果你打开它,你的应用程序将崩溃。这是故意的。使用if…let(检查Swift账簿)仔细访问数据。抱歉,不是。您应该能够捕获此类异常。任何现代语言(.NET,Java)都可以而且有充分的理由。当异常被处理时,程序的状态将变为已知状态,这样参数就没有意义了。例如,如果您正在构建一个booking-catch异常,那么一切都失败了,因此最终的对象为null。然后可以传回null,没有任何东西必须或应该崩溃。您描述的行为在Swift中完全可用,有几种机制(
if-let
guard-let
map
flatMap
??
switch
,所有这些都得到了高度支持和鼓励,通常都带有语法糖分,使它们成为一流的产品)。使用
意味着您明确不希望出现这种行为,并且在出现
的情况下请求崩溃。这不是一个例外。这是一个故意的致命错误,将崩溃,因为
正是要求这样做的。如果您不希望在此处崩溃,则不要请求崩溃。
不是意外选择的。它来自于unix的传统,发音为“bang”如果let等与.NET或Java中的异常处理完全不同。您可以有效地捕获NSException或NullException,然后执行其他操作,如果您尝试捕获它,那么异常与致命错误完全相同。毕竟,有人真的希望程序崩溃吗?没有人请求崩溃…Swift should拥有一流的处理能力来实际捕获这些消息。说“Swift做得不对,因为它在其他语言中的工作方式不同”有点短。选项在Swift中是一流的公民,有很多机制围绕着它们构建。如果程序员定义了一个可选选项,则不能确保它是初始化的(Swift network interaction始终支持异常处理,即JSON解码错误或视频流),然后明确表示“无论如何运行此操作”,您可能会遇到崩溃。在上面的示例中,您可以如上所述在其周围设置一个防护装置,以解包或调用“DBController()?.dosmth()”。