QA@IT

Android Unfortunately, hoge has stopped.

5801 PV

こんにちは、Androidアプリ制作初心者です。
LogCatで以下のようなエラーが出て、エミュレータでは「Unfortunately, hoge has stopped.」とポップアップされて強制終了してしまいます。
eclipseのソースエディターではエラーは出ていません。
解決するにはどのようにすればよいでしょうか。
よろしくお願い致します。

LogCat

・・・
E/AndroidRuntime(914): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.hoge/com.hoge.MainActivity}: java.lang.NullPointerException
・・・
E/AndroidRuntime(914): Caused by: java.lang.NullPointerException
E/AndroidRuntime(914):  at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:167)
E/AndroidRuntime(914):  at com.hoge.MainActivity.<init>(MainActivity.java:15)
・・・

MainActivity.java

package com.hoge;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener {
    /** Called when the activity is first created. */
    //プリファレンスの準備
    SharedPreferences first_frag = getSharedPreferences("first_frag", MODE_PRIVATE);
    Editor editor = first_frag.edit();
    Button addButton;
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (first_frag.getBoolean("Launched", false)==false) {
        //初回起動時の処理
        setContentView(R.layout.activity_firstpage);
        //buttonを取得
        addButton = (Button)findViewById(R.id.firstpage_go_to_settings_button);
        addButton.setOnClickListener(this);
    } else {
        //二回目以降の処理
        setContentView(R.layout.activity_main);
        //buttonを取得
        addButton = (Button)findViewById(R.id.main_go_to_mypage_button);
        addButton.setOnClickListener(this);
    }
    }

    //インターフェイスを実装 implements OnClickListener
    @Override
    public void onClick(View v) {
        Intent intent = new Intent();
        switch(v.getId()){
            case R.id.main_go_to_mypage_button:
                intent.setClassName(this,"com.hoge.MypageActivity");
                break;
            case R.id.firstpage_go_to_settings_button:
                intent.setClassName(this,"com.hoge.MypageActivity");
                //プリファレンスの書き変え
                editor.putBoolean("Launched", true);
                editor.commit();
                break;
        }
        startActivity(intent);
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >
            <Button
                android:id="@+id/main_go_to_mypage_button"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:background="@color/green"
                android:textSize="15sp"
                android:text="マイページ" />
</LinearLayout>

activity_firstpage.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:orientation="vertical" >
            <Button
                android:id="@+id/firstpage_go_to_settings_button"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:background="@color/green"
                android:textSize="15sp"
                android:text="初期設定" />
</LinearLayout>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.hoge"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".MypageActivity"
            android:label="@string/app_name" >
        </activity>
        <activity
            android:name=".FirstpageActivity"
            android:label="@string/app_name" >
        </activity>
    </application>

</manifest>

回答

とりあえずの原因は getSharedPreferences の呼び出し位置ですね。
getSharedPreferencesはonCreateの後でしか呼び出せません。
以下の様にすれば親クラスのonCreateが呼び出された後ですので呼び出し可能です。
(自分でgetSharedPreferencesを上書きしている場合は話が変わってくるかもしれませんが、現状では以下で問題ないでしょう。)

    //プリファレンスの準備
    // SharedPreferences first_frag = getSharedPreferences("first_frag", MODE_PRIVATE);
    // Editor editor = first_frag.edit();
    Button addButton;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 以下1行追加
        SharedPreferences first_frag = getSharedPreferences("first_frag", MODE_PRIVATE);
        if (first_frag.getBoolean("Launched", false)==false) {
    //インターフェイスを実装 implements OnClickListener
    @Override
    public void onClick(View v) {
        // 以下2行追加
        SharedPreferences first_frag = getSharedPreferences("first_frag", MODE_PRIVATE);
        Editor editor = first_frag.edit();
        Intent intent = new Intent();
編集 履歴 (1)
  • flied_onionさん
    ご回答ありがとうございました!早速試してみたところ、解決致しました。ありがとうございました!
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。