Подтвердить что ты не робот

What is Error "Thread 1: EXC_BAD_INSTRUCTION (code = EXC_I386_INVOP, subcode = 0x0)" означает?

Я получил эту ошибку:

Тема 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)"
}
4b9b3361

Ответ 1

Эта строка

secondNumber = Screen.text!.toInt()!

означает: получить объект Screen, получить свойство text и, пожалуйста, сбой, если он не существует, а затем преобразовать текст в целое число и, пожалуйста, сбой, если он не существует.

Вот что! означает: "Я уверен, что эта вещь существует, поэтому, пожалуйста, проваливайте, если это не так". И что он сделал.

Ответ 2

Как правило, EXC_BAD_INSTRUCTION означает, что в вашем коде произошел сбой утверждения. Дикая догадка, ваш Screen.text не является целым числом. Дважды проверьте его тип.

Ответ 3

Моя была около

dispatch_group_leave (группа)

находился внутри, если закрыт в блоке. Я просто вытащил его из закрытия.

Ответ 4

Я получил эту ошибку, когда пытался записать переменную одновременно из другого потока. Создание частной очереди и проверка того, что один поток за раз может писать в эту переменную одновременно. Это был словарь в моем случае.

Ответ 5

В моем случае это было вызвано целочисленным переполнением. У меня был UInt16, и я удваивал ценность, которую нужно было внести в Int. Неисправный код был

let result = Int(myUInt16 * 2)

Однако это умножается как UInt16, а затем преобразуется в Int. Поэтому, если myUInt16 содержит значение более 32767, происходит переполнение.

Все было хорошо, как только я исправил код

let result = Int(myUint16) * 2

Ответ 6

мой был DispatchQueue.main.sync внутри, ближе я сделал его DispatchQueue.main.async, и он работал.

Ответ 7

Согласно моей работе, это выглядит как исключение null-указателя в java. Просто проверьте свой код для объектов, не инициализированных, которые используются позже в вашем коде.