2

外部ストレージのデータ ファイルを取得してメールで送信する小さなアプリを構築しようとしています。logcat ですぐに「null ポインター例外」が発生し続け、アプリが停止します。例外が見つからないようで、これを引き起こしているコード行を特定する方法があるかどうか疑問に思っています。MainActivity クラスと SendData というクラスがあります。コードは以下のとおりです。私はこれが初めてなので、どんな助けでも大歓迎です-ありがとう。

    private static final String TAG = "MainActivity_ErrorLog";

@Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) 
{
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}

// Create the getData intent
    Intent intentgetData = new Intent(MainActivity.this, SendData.class); 

    public void onStart()
    {
        {       
        try 
        {
        File sd = Environment.getExternalStorageDirectory();
        File data = Environment.getDataDirectory();

            if (sd.canWrite()) 
            {
        // verify the paths
                String currentDBPath = "TLC_COMMON/database.db";
                String backupDBPath = "database.db"; 
                File currentDB = new File(data, currentDBPath);
                File backupDB = new File(sd, backupDBPath);

                if (currentDB.exists()) 
                {
                    FileChannel src = new FileInputStream(currentDB).getChannel();
                    FileChannel dst = new FileOutputStream(backupDB).getChannel();
                    dst.transferFrom(src, 0, src.size());
                    src.close();
                    dst.close();                    
                }
            }
        }

        catch (Exception e)     
        {   
            // change the V below to E when complete
            Log.v(TAG,"ERROR: Database file not created"); 
        }
        startActivity(intentgetData);
        }

    }

  } 

-- 新しいクラス

public class SendData extends Activity { private static final String TAG = "MainActivity";

/* Checks if external storage is available to read */   
public boolean isExternalStorageReadable() 
    {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state) ||
        Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) 
        {
        return true;
        }
        return false;
    }

/** Called when the user clicks the Send My Data button */
public SendData(View view) 
    {

    // Send data by email
        {
            File root = Environment.getExternalStorageDirectory(); 
    // verify it is saving as this file name; also path in previous class
            String fileName = "database.db"; 
            if (root.canWrite()) 
                { 
                File attachment = new File(root, fileName); 
                Intent email = new Intent(Intent.ACTION_SENDTO);                
                email.putExtra(android.content.Intent.EXTRA_SUBJECT, "Exercise data");
                email.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{"test@gmail.com"});
                // is the Uri necessary?
                email.putExtra(android.content.Intent.EXTRA_TEXT, Uri.fromFile(attachment));
                // look at this VVV
                startActivity(Intent.createChooser(email, "Send the data via Email"));} 
            else 
                {
                // Change the V below to E when complete
                Log.v(TAG, "Email send failed");
                }
            }
        }
public void finish() 
{   
}

}

11-13 13:29:37.343: W/dalvikvm(3319): threadid=1: thread exiting with uncaught exception (group=0x418e3300)
11-13 13:29:37.343: E/AndroidRuntime(3319): FATAL EXCEPTION: main
11-13 13:29:37.343: E/AndroidRuntime(3319): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.va.datasender/com.example.va.datasender.MainActivity}: java.lang.NullPointerException
11-13 13:29:37.343: E/AndroidRuntime(3319):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1983)
11-13 13:29:37.343: E/AndroidRuntime(3319):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
11-13 13:29:37.343: E/AndroidRuntime(3319):     at android.app.ActivityThread.access$600(ActivityThread.java:130)
11-13 13:29:37.343: E/AndroidRuntime(3319):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
11-13 13:29:37.343: E/AndroidRuntime(3319):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-13 13:29:37.343: E/AndroidRuntime(3319):     at android.os.Looper.loop(Looper.java:137)
11-13 13:29:37.343: E/AndroidRuntime(3319):     at android.app.ActivityThread.main(ActivityThread.java:4745)
11-13 13:29:37.343: E/AndroidRuntime(3319):     at java.lang.reflect.Method.invokeNative(Native Method)
11-13 13:29:37.343: E/AndroidRuntime(3319):     at java.lang.reflect.Method.invoke(Method.java:511)
11-13 13:29:37.343: E/AndroidRuntime(3319):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
11-13 13:29:37.343: E/AndroidRuntime(3319):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
11-13 13:29:37.343: E/AndroidRuntime(3319):     at dalvik.system.NativeStart.main(Native Method)
11-13 13:29:37.343: E/AndroidRuntime(3319): Caused by: java.lang.NullPointerException
11-13 13:29:37.343: E/AndroidRuntime(3319):     at android.content.ContextWrapper.getPackageName(ContextWrapper.java:127)
11-13 13:29:37.343: E/AndroidRuntime(3319):     at android.content.ComponentName.<init>(ComponentName.java:75)
11-13 13:29:37.343: E/AndroidRuntime(3319):     at android.content.Intent.<init>(Intent.java:3301)
11-13 13:29:37.343: E/AndroidRuntime(3319):     at com.example.va.datasender.MainActivity.<init>(MainActivity.java:36)
11-13 13:29:37.343: E/AndroidRuntime(3319):     at java.lang.Class.newInstanceImpl(Native Method)
11-13 13:29:37.343: E/AndroidRuntime(3319):     at java.lang.Class.newInstance(Class.java:1319)
11-13 13:29:37.343: E/AndroidRuntime(3319):     at android.app.Instrumentation.newActivity(Instrumentation.java:1053)
11-13 13:29:37.343: E/AndroidRuntime(3319):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1974)
11-13 13:29:37.343: E/AndroidRuntime(3319):     ... 11 more

4

4 に答える 4

5

最下位の「Caused by」を見つけて、コードの行に到達するまで下に進みます。

Caused by: java.lang.NullPointerException
     at android.content.ContextWrapper.getPackageName(ContextWrapper.java:127)
     at android.content.ComponentName.<init>(ComponentName.java:75)
     at android.content.Intent.<init>(Intent.java:3301)
     at com.example.va.datasender.MainActivity.<init>(MainActivity.java:36)

<init>アクティビティが有効なコンテキストを持つ前に、クラス変数として、またはコンストラクター内で何かをしていることを意味します...しかし、特定の問題は36行目にあります。

でインテントを作成しようとしていると思いますthisonCreate()代わりにインテントを内部で初期化してください。


それを見つけた。これを変える:

// Create the getData intent
Intent intentgetData = new Intent(MainActivity.this, SendData.class); 

に:

Intent intentgetData;

そして内部onCreate()(またはonStart()呼び出す直前startActivity())に追加:

intentgetData = new Intent(MainActivity.this, SendData.class);
于 2012-11-13T20:16:32.077 に答える
0

あなたの問題は、MainActivity の 36 行目から発生します。そこに問題がないか確認してください。

11-13 13:29:37.343: E/AndroidRuntime(3319):     at com.example.va.datasender.MainActivity.<init>(MainActivity.java:36)
于 2012-11-13T20:16:57.493 に答える
0

行番号 36 からの例外: at com.example.va.datasender.MainActivity.<init>(MainActivity.java:36).

于 2012-11-13T20:17:10.860 に答える
0

android.content.Intent.<init>の後にエラー ログも表示さMainActivity.java:36れるため、インスタンス化するときに、次の行の最初のパラメーターの値を確認しますintentgetData

Intent intentgetData = new Intent(MainActivity.this, SendData.class); 

そこでインスタンス化を行う代わりに、 をonStart()呼び出す直前にメソッドで実行してみてくださいstartActivity(intentgetData);:

Intent intentgetData = new Intent(MainActivity.this, SendData.class); 
startActivity(intentgetData);
于 2012-11-13T20:25:46.437 に答える