Исключение нулевого указателя.Не могу понять, как исправить - PullRequest
1 голос
/ 09 марта 2012

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

Вот мой код активности, за которым следует вывод logcat.

package com.michaelpeerman.probability;


import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import com.michaelpeerman.probability.R;
public class MainActivity extends BaseActivity
{
  View.OnClickListener buttonhandler = new View.OnClickListener()
  {
    public void onClick(View v)
    {
      Intent localIntent;
      switch (v.getId())
      {
      case R.id.cointoss:

        localIntent = new Intent(MainActivity.this, CoinActivity.class);
        MainActivity.this.startActivity(localIntent);
        break;

      }
    }
  };

  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    tracker.trackPageView("/ApplicationHomeScreen");
    setContentView(R.layout.main);
    Button localButton1 = (Button)findViewById(R.id.cointoss);
    //Button localButton2 = (Button)findViewById(R.id.doctor10);
    //Button localButton3 = (Button)findViewById(R.id.doctor11);
    localButton1.setOnClickListener(this.buttonhandler);
    //localButton2.setOnClickListener(this.buttonhandler);
    //localButton3.setOnClickListener(this.buttonhandler);
  }





}

Вот мой вывод LogCat.

03-08 18:29:12.664: E/AndroidRuntime(6467): FATAL EXCEPTION: main
03-08 18:29:12.664: E/AndroidRuntime(6467): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.michaelpeerman.probability/com.michaelpeerman.probability.MainActivity}: java.lang.NullPointerException
03-08 18:29:12.664: E/AndroidRuntime(6467):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
03-08 18:29:12.664: E/AndroidRuntime(6467):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
03-08 18:29:12.664: E/AndroidRuntime(6467):     at android.app.ActivityThread.access$600(ActivityThread.java:123)
03-08 18:29:12.664: E/AndroidRuntime(6467):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
03-08 18:29:12.664: E/AndroidRuntime(6467):     at android.os.Handler.dispatchMessage(Handler.java:99)
03-08 18:29:12.664: E/AndroidRuntime(6467):     at android.os.Looper.loop(Looper.java:137)
03-08 18:29:12.664: E/AndroidRuntime(6467):     at android.app.ActivityThread.main(ActivityThread.java:4424)
03-08 18:29:12.664: E/AndroidRuntime(6467):     at java.lang.reflect.Method.invokeNative(Native Method)
03-08 18:29:12.664: E/AndroidRuntime(6467):     at java.lang.reflect.Method.invoke(Method.java:511)
03-08 18:29:12.664: E/AndroidRuntime(6467):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
03-08 18:29:12.664: E/AndroidRuntime(6467):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
03-08 18:29:12.664: E/AndroidRuntime(6467):     at dalvik.system.NativeStart.main(Native Method)
03-08 18:29:12.664: E/AndroidRuntime(6467): Caused by: java.lang.NullPointerException
03-08 18:29:12.664: E/AndroidRuntime(6467):     at com.michaelpeerman.probability.MainActivity.onCreate(MainActivity.java:36)
03-08 18:29:12.664: E/AndroidRuntime(6467):     at android.app.Activity.performCreate(Activity.java:4465)
03-08 18:29:12.664: E/AndroidRuntime(6467):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
03-08 18:29:12.664: E/AndroidRuntime(6467):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
03-08 18:29:12.664: E/AndroidRuntime(6467):     ... 11 more

Вот базовая активность

package com.michaelpeerman.probability;


import com.google.android.apps.analytics.GoogleAnalyticsTracker;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;

public class BaseActivity extends Activity {
private String donate_link = "market://details?id=com.michaelpeerman.donate";
private String rate_link = "market://details?id=com.michaelpeerman.probability";
private String more_apps = "market://search?q=pub:Michael Peerman";
private String sharetext = "Check out this amazing Probability app." + "\n"
        + "\n" + "http://goo.gl/yU3jy";
GoogleAnalyticsTracker tracker;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    tracker = GoogleAnalyticsTracker.getInstance();
    tracker.startNewSession("REMOVED", 60, this);
    }
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.donate:
        tracker.trackEvent("Menu_Item", "donate", "clicked", 0);
        startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(donate_link)));
        break;
    case R.id.rate:
        tracker.trackEvent("Menu_Item", "rate", "clicked", 0);
        startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(rate_link)));
        break;
    case R.id.moreapps:
        tracker.trackEvent("Menu_Item", "more_apps", "clicked", 0);
        startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(more_apps)));
        break;
    case R.id.share:
        tracker.trackEvent("Menu_Item", "share", "clicked", 0);
        Intent sharingIntent = new Intent(Intent.ACTION_SEND);
        sharingIntent.setType("text/plain");
        sharingIntent
                .putExtra(android.content.Intent.EXTRA_TEXT, sharetext);
        startActivity(Intent.createChooser(sharingIntent, "Share using"));
        break;
    }
    return true;
}
@Override
public void onPause() {
     super.onPause();
     tracker.dispatch();


 }
@Override
 public void onDestroy() {
     super.onDestroy();
     tracker.dispatch();
     tracker.stopSession();

 }
}

А вот и Main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <TableRow 
        android:background="@drawable/coin_toss_banner"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"></TableRow>
   <Button android:id="@+id/cointoss"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:text="Coin Toss" />
    </LinearLayout>

Ответы [ 2 ]

2 голосов
/ 09 марта 2012

РЕДАКТИРОВАТЬ: Это не имеет ничего общего с main.xml или Button. Следующая строка выбрасывает нулевой указатель:

tracker.trackPageView("/ApplicationHomeScreen");

Глядя на BaseActivity, для tracker не указан модификатор доступа, поэтому он использует модификатор доступа по умолчанию, который, по-видимому, не разрешает доступ к наследуемым классам, , даже если они находятся в одном пакете . Глядя на ваш код, оба класса, похоже, находятся в одном пакете. В любом случае, явное определение tracker как protected позволит получить к нему доступ из наследующих классов независимо от пакета.

Я все еще немного озадачен этим. Насколько я понимаю, это не должно было компилироваться. Каким-то образом переменная tracker доступна, но ее создание не ... какие-нибудь эксперты Java, скрывающиеся, чтобы пролить свет?

1 голос
/ 09 марта 2012

Что бы ни было tracker, оно не было инициализировано. Я вижу, у вас есть базовый класс, который вы расширяете, поэтому убедитесь, что tracker правильно настроен в суперклассе. Это означает либо в конструкторе, либо super.onCreate().

...