Новое в разработке для Android: приложение работает на моем MacBook Pro, но не работает с исключением Kotlin Typecast на iMac - PullRequest
0 голосов
/ 23 сентября 2018

Это самая странная вещь ... Несколько недель назад я столкнулся с этой проблемой и нашел решение - обновить Gradle Runtime, что я и сделал на обоих компьютерах.Я решил, что хочу сесть за стол с моим iMac и работать прошлой ночью, но не смог заставить приложение работать с исключением Kotlin Typecast Exception.Я переключился на удаленную ветку, которую я вытянул на своем MacBook, но получил эту ошибку:

09-23 12:28:29.112 4141-4141/com.example.pmarl.peedeehealthadvisor E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.pmarl.peedeehealthadvisor, PID: 4141
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.pmarl.peedeehealthadvisor/com.example.pmarl.peedeehealthadvisor.MainActivity}: kotlin.TypeCastException: null cannot be cast to non-null type android.widget.Button
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
        at android.app.ActivityThread.access$800(ActivityThread.java:151)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5254)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
     Caused by: kotlin.TypeCastException: null cannot be cast to non-null type android.widget.Button
        at com.example.pmarl.peedeehealthadvisor.MainActivity.onCreate(MainActivity.kt:31)
        at android.app.Activity.performCreate(Activity.java:5990)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
        at android.app.ActivityThread.access$800(ActivityThread.java:151) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:135) 
        at android.app.ActivityThread.main(ActivityThread.java:5254) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at java.lang.reflect.Method.invoke(Method.java:372) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

Я запаниковал и снова протестировал MacBook, но он работал нормально.

`

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity
{
    private Button MyHealthData;
    private Button  MyHealthResources;
    private boolean firstStart;

    @Override
    protected void  onCreate(Bundle saveInstanceState)
    {
        super.onCreate(saveInstanceState);
        setContentView(R.layout.activity_main);

        /*First time open code*/
        SharedPreferences app_preferences = getApplicationContext()
                .getSharedPreferences("MyPref",0);
        SharedPreferences.Editor editor = app_preferences.edit();

        firstStart = app_preferences.getBoolean("first_time_start",true);

        /*If statement to see if the app has been open before or not*/
        if(firstStart)
        {

            /*If the app hasn't been opened before, it runs the following code
            * and sets firstStart to false*/
            editor.putBoolean("first_time_start",false);
            editor.commit();

            //do your one time code here
            launchFirstTimeLogIn();
            //Toast.makeText(this,"This is first app run!", Toast.LENGTH_LONG).show();

        }
        else
        {
            //app open directly
            Toast.makeText(this, "Welcome!!!", Toast.LENGTH_LONG).show();
        }




        this.MyHealthData = (Button) findViewById(R.id.MyHealthData);

        this.MyHealthData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                launchMyHealthData();
            }
        });

        this.MyHealthResources = (Button) findViewById(R.id.HealthResources);



        this.MyHealthResources.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                launchSearchServiceActivity();
            }
        });

    }


    private void launchMyHealthData()
    {
        Intent intent = new Intent (this, MyHealthDataActivity.class);
        intent.setFlags(intent.FLAG_ACTIVITY_NEW_TASK | intent.FLAG_ACTIVITY_CLEAR_TASK);
        startActivity(intent);
        finish();

    }

    private void launchSearchServiceActivity()
    {
        Intent intent = new Intent (this, SearchServiceActivity.class);
        intent.setFlags(intent.FLAG_ACTIVITY_NEW_TASK | intent.FLAG_ACTIVITY_CLEAR_TASK);
        startActivity(intent);
        finish();

    }

    private void launchFirstTimeLogIn()
    {
        Intent intent = new Intent(this, FirstTimeLogin.class);
        intent.setFlags(intent.FLAG_ACTIVITY_NEW_TASK | intent.FLAG_ACTIVITY_CLEAR_TASK);
        startActivity(intent);
        finish();
    }
}

`

Обе являются одинаковыми версиями Gradle и одной и той же версией Android Studio.Я не уверен, чем это может быть вызвано? Моя логика говорит, что если это проблема с кнопкой, как, например, в сообщениях, которые я обнаружил, она не будет работать на моем MacBook.

Спасибо запомощь всем!

1 Ответ

0 голосов
/ 23 сентября 2018

Нуль не может быть приведен к ненулевому типу android.widget.Button

Я предполагаю, что вы объявили Button как это: ( например )

mineBtn = findViewById(R.id.yourbtnid) as Button

Добавьте "?" после as:

mineBtn = findViewById(R.id.yourbtnid) as? Button

Тогда ошибка должна исчезнуть.


Редактировать: Удалить this. перед объявлением виджетов.И объявите виджет следующим образом:

MyHealthData = (Button) findViewById(R.id.MyHealthData);

Обратите внимание, что лучше изменить R.id.MyHealthData с макета XML, чтобы быть уверенным, что в будущем это не вызовет других проблем.

...