Исключение IllegalStateException, вызванное намерением?

#android #kotlin #illegalstateexception

#Android #kotlin #исключение illegalstateexception

Вопрос:

Иногда я находил java.lang.Исключение IllegalStateException в моем приложении:

 java.lang.RuntimeException: 
  at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2825)
  at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2886)
  at android.app.ActivityThread.-wrap12 (ActivityThread.java)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1623)
  at android.os.Handler.dispatchMessage (Handler.java:102)
  at android.os.Looper.loop (Looper.java:186)
  at android.app.ActivityThread.main (ActivityThread.java:6509)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:914)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:804)

Caused by: java.lang.IllegalStateException: 
  at com.****.onCreate (***.kt:35) <-- here is the Intent.getStringExtra(..)
  at android.app.Activity.performCreate (Activity.java:6992)
  at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1119)
  at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2778)
  

После того, как я изучил это, эта проблема вызвана Intent.getStringExtra() со следующим кодом:

 private lateinit var mArticle : ArticleModel
private lateinit var mArticleImg : String

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_article_detail)

    val intent : Intent = this.intent;
    mArticleImg = intent.getStringExtra( "articleImg" ) <-- here is where it crashed
    mArticle = intent.getParcelableExtra("data")
}
  

Протестировал это на многих тестовых устройствах и не смог воспроизвести эту проблему сбоя, за исключением случаев, когда я заглянул в отчет о сбоях Google. Что именно такое исключение IllegalStateException и происходит ли это из-за возвращаемого значения intent?

Комментарии:

1. Поле mArticleImg не принимает нулевые значения. Использовать строку? введите, чтобы разрешить или добавить?: «нулевое значение» после вызова getStringExtra для предоставления резервного значения

2. изучим это. Сам mArticleImg не должен быть нулевым.

3. поделитесь своим кодом startActivity

Ответ №1:

Вы можете обработать возможное нулевое значение с помощью оператора elvis ?:

 val intent : Intent = this.intent
mArticleImg = intent.getStringExtra("articleImg") ?: "null-value-fallback"
mArticle = intent.getParcelableExtra("data") ?: "null-value-fallback"
  

или установите значение, только если оно не равно null, например, с помощью if или .let{..} :

 val intent : Intent = this.intent
intent.getStringExtra("articleImg")?.let { mArticleImg = it }
intent.getParcelableExtra("data")?.let { mArticle = it }
  

Комментарии:

1. Если это так, то почему он получает исключение IllegalStateException?

2. Трудно сказать, без текста сообщения исключения

Ответ №2:

Используйте эти проверки, чтобы убедиться, что ключ доступен

 if (intent.hasExtra("articleImg")) {    
    mArticleImg = intent.getStringExtra( "articleImg" ) 
}

if (intent.hasExtra("data")) {
    mArticle = intent.getParcelableExtra("data")
}
  

Ответ №3:

 Step 1: In the Button Click and Putting String Through Intent... as below

ll_Admin_Milk.setOnClickListener(View.OnClickListener {
            val intent = Intent(this, EggAndMilkActivity::class.java)
            intent.putExtra("Eggs","Eggs")
            intent.putExtra("Milk","Milk")
            startActivity(intent)
        })

Step 2: In the EggAndMilkActivity.Class i am Getting the intent value as below....

       val intent : Intent = this.intent
        intent.getStringExtra("Eggs")?.let { Eggs = it }
        intent.getStringExtra("Milk")?.let { Milk= it }

Step 3: Do not Forget to add this line of Code **?.let { Eggs = it }** other wise you will get illegalArgumentException..


-Happy Coding @Ambilpura