2016-01-23 103 views
1

我正在学习使用远程sql进行注册。我只要求用户输入电子邮件地址和密码,然后按“注册”按钮。注册信息将被存储在远程数据库中。该应用程序构建成功。但是,当我输入电子邮件地址和密码时,应用程序停在句子处。使用JSON,mysql和php的用户注册问题:EXC_BAD_INSTRUCTION(code = EXC_I386_INVOP,subcode = 0x0)

let json = try! NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as? NSDictionary 

说,它有

EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0). 

错误我也看看输出

"fatal error: 'try!' expression unexpectedly raised an error: 
Error Domain=NSCocoaErrorDomain Code=3840 "No value." UserInfo= 
{NSDebugDescription=No value.}: file 
/Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang- 
700.1.101.15/src/swift/stdlib/public/core/ErrorType.swift, line 50 (lldb) ". 

我不知道该如何处理它。请帮忙。谢谢。

+0

什么样的数据?如果它无效,你会得到这个错误json – dan

+0

谢谢丹。考虑零和错误情况总是很好的。 – swiftlearne

+0

'“没有值。”'意味着'data'是空的,而不是'nil'。如果'data'为'nil',你会得到['致命错误:意外地发现零,而解包可选值'](http://stackoverflow.com/questions/32170456/what-does-fatal-error-unexpectedly -found-NIL-而-解包-AN-可选-VALU)。相关:http://stackoverflow.com/questions/36462298/error-domain-nscocoaerrordomain-code-3840-no-value-userinfo-nsdebugdescripti – ma11hew28

回答

1

当您使用带有惊叹号的try时,您告诉编译器您不关心错误,并且既然您已经这样做了,那么当您尝试强制转换您的数据时,会发生错误而不是进入catch块来告诉你错误是什么。要做到这一点安全,并找出潜在的错误,你应该这样做,而不是:

do { 
    let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments) 
} catch (_) { 
    //here you can get access to all of the errors that occurred when trying to serialize 
} 

做任何的这虽然之前,你应该做一个简单的检查,看看if data != nil { /**try to serialize here*/ }

+0

感谢pbush25,你是对的。在我改为do/catch模式之后。现在它可以工作。所以尝试使用do/catch总是很好的,不只是懒得使用try! – swiftlearne

+0

是的,这就是为什么苹果将它添加到语言!如果你发现我的答案适合你,请投票并接受:) – pbush25

+0

谢谢pubsh25。我已经投了票。 – swiftlearne

相关问题