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)"
}
Ответы
Ответ 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.
Просто проверьте свой код для объектов, не инициализированных, которые используются позже в вашем коде.