错误“线程 1:EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)”是啥意思?

Posted

技术标签:

【中文标题】错误“线程 1:EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)”是啥意思?【英文标题】:what does Error "Thread 1:EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)" mean?错误“线程 1:EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)”是什么意思? 【发布时间】:2015-05-02 12:02:23 【问题描述】:

我收到了这个错误:

线程 1:EXC_BAD_INSTRUCTION(代码=EXC_I386_INVOP,子代码=0x0)

我该如何解决这个问题?代码正常工作,但是在计算器中,当我单击唯一的相等按钮时,它会给出错误。

@IBAction func equals(sender: AnyObject) 

    secondNumber = Screen.text!.toInt()!  // here it shows an error which is "Thread 1:EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)"

    if operation == "+"
        result = firstNumber + secondNumber
    
    else if operation == "-" 
        result = firstNumber - secondNumber
    
    else if operation == "x" 
        result = firstNumber * secondNumber
    
    else 
        result = firstNumber / secondNumber
    
    Screen.text = "\(result)"

【问题讨论】:

在这一行中result = firstNumber / secondNumbersecondNumber 等于0 时会发生什么? 是的,我知道它是未定义的,那么我该如何解决呢? “将一个数字除以零 (i / 0),或尝试用零计算余数 (i % 0),会导致错误。” - The Swift Programming Language - Advanced Operators 【参考方案1】:

通常,EXC_BAD_INSTRUCTION 表示您的代码中存在断言失败。一个疯狂的猜测,你的Screen.text 不是整数。仔细检查它的类型。

【讨论】:

【参考方案2】:

这一行

secondNumber = Screen.text!.toInt()!

意思是:获取Screen对象,获取text属性不存在则crash,然后将text转化为整数,不存在则crash。

这就是! 的意思:“我确定这个东西存在,所以如果它不存在,请崩溃”。崩溃就是它所做的。

【讨论】:

我读过的关于力解包真正含义的最佳解释。 @samurai_jane 同意【参考方案3】:

我是关于

dispatch_group_leave(组)

如果在块中关闭,则在里面。我刚刚把它移开了。

【讨论】:

我想我有同样的问题,我知道这是在 17 年。这是我的代码。如果你能帮我弄清楚你到底做了什么,那就太好了: if(aGroup == nil) block(); else dispatch_async(serialQueue, ^ dispatch_group_enter(aGroup); block(); dispatch_group_leave(aGroup); ); 通过闭包=,你的意思是块吗?所以我只是把它放在 );对吗?【参考方案4】:

在我的情况下,这是由整数溢出引起的。我有一个 UInt16,并且将值加倍以放入 Int。错误代码是

let result = Int(myUInt16 * 2)

但是,这乘以 UInt16,然后转换为 Int。因此,如果 myUInt16 包含超过 32767 的值,则会发生溢出。

我将代码更正后一切都很好

let result = Int(myUint16) * 2

【讨论】:

非常感谢!这节省了我很多时间!我试图计算 UInt8 值列表的平均值。当我计算总和时,我得到了溢出!【参考方案5】:

当我尝试从不同的线程同时写入一个变量时,我收到了这个错误。创建一个私有队列并确保一次一个线程可以同时写入该变量。就我而言,这是一本字典。

【讨论】:

【参考方案6】:

我的是 DispatchQueue.main.sync 在更近的地方,我把它做成 DispatchQueue.main.async 并且它起作用了。

【讨论】:

我遇到了同样的错误。为什么你认为sync 会抛出错误? async 不是吗? @J.beenie 导致死锁【参考方案7】:

如果其他人收到了类似的错误消息,您可能构建了带有优化(生产)标志的应用程序,这就是错误消息不具有交流性的原因。您在开发中遇到错误的另一种可能性(从 i386 我知道您使用的是模拟器)。如果是这种情况,请将构建环境更改为开发环境并尝试重现该情况以获得更具体的错误消息。

【讨论】:

【参考方案8】:

您的 secondNumber 似乎是一个 ivar,因此您必须使用本地 var 来解开可选项。并且小心。您不测试 secondNumber 是否为 0,这可能导致除以零。从技术上讲,您需要另一个案例来处理不可能的操作。例如检查数字是否为 0 并且在这种情况下不执行任何操作至少不会崩溃。

@IBAction func equals(sender: AnyObject) 

    guard let number = Screen.text?.toInt(), number > 0 else 
        return
    

    secondNumber = number

    if operation == "+"
        result = firstNumber + secondNumber
    
    else if operation == "-" 
        result = firstNumber - secondNumber
    
    else if operation == "x" 
        result = firstNumber * secondNumber
    
    else 
        result = firstNumber / secondNumber
    
    Screen.text = "\(result)"

【讨论】:

【参考方案9】:

在我的情况下,它发生在通过传递 Core Data 托管对象的属性的参数来调用函数时。调用时该对象已不存在,导致此错误。

我通过在调用函数之前检查托管对象是否存在解决了这个问题。

【讨论】:

【参考方案10】:

我在 WatchOS Sim 上得到了这个。即使在以下情况下问题仍然存在:

删除应用程序 重启 Xcode 删除派生数据

...最终通过模拟器中的“擦除所有内容和设置”修复。

【讨论】:

【参考方案11】:

尝试清除工作区。

rm -rf ' ~/Library/Application\ Support/"your programm name" '

【讨论】:

以上是关于错误“线程 1:EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

Pig 安装错误:错误 pig.Main:错误 2998:未处理的内部错误

Informix 错误:发生了语法错误。错误代码:-201

我收到一个错误:“MetaMask - RPC 错误:错误:错误:[ethjs-rpc] rpc 错误与有效负载”

错误精灵错误跟踪器错误

网页打开显示错误500是啥意思

PHP错误处理