Недавно я столкнулся с исключением при написании программы, и мне потребовалось много времени на отладку просто потому, что компилятор выдал мне неправильное исключение.
Вот мой код активности:
private var mCheatMap = HashMap<Int, Boolean>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_quiz)
mCheatMap = savedInstanceState?.getSerializable(KEY_CHEATER) as HashMap<Int, Boolean> ?: HashMap<Int, Boolean>()
}
Во время выполнения мое приложение разбилось, и когда я заглянул в журналы, в нем было сказано ActivityNotFound
исключение, а в предложении было сказано, что, возможно, я не объявил активность в моем AndroidManifest.xml
С моей стороны все казалось безошибочным, как вдруг я случайно сделал приведение своей переменной mCheapMap
к безопасному приведению, и все стало работать отлично. например.:
private var mCheatMap = HashMap<Int, Boolean>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_quiz)
mCheatMap = savedInstanceState?.getSerializable(KEY_CHEATER) as? HashMap<Int, Boolean> ?: HashMap<Int, Boolean>()
}
Теперь у меня есть некоторые неясности:
Почему компилятор выдал мне исключение
ActivityNotFound
, когда у меня была проблема с кастингом?Почему использование оператора безопасного приведения решило проблему, потому что даже без оператора безопасного приведения мое приведение было правильным?
ActivityNotFound
можно объяснить тем фактом, чтоClassCastException
выбрасывается в ActivityonCreate
, поэтому создание не удается, и Activity не может быть найдено средой выполнения. Но это только мое предположение, могу ошибаться - person user2340612   schedule 14.03.2018?.
) и оператором elvis значенияnull
обрабатываются безопасно (если только NPE не произойдет где-то еще). - person user2340612   schedule 14.03.2018