-6

Android アプリのコンパイルに成功し、apk を作成しました。また、キーストアを使用して .apk ファイルに署名しました。しかし、USB デバッグ モードで実行すると、何らかの理由で NullPointerException が発生します。

例外は次のとおりです。

06-16 15:23:11.639  30531-30531/com.adi.play E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.adi.play/com.adi.play.PlayActivity}: java.lang.NullPointerException
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2277)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2403)
            at android.app.ActivityThread.access$600(ActivityThread.java:165)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1373)
            at android.os.Handler.dispatchMessage(Handler.java:107)
            at android.os.Looper.loop(Looper.java:194)
            at android.app.ActivityThread.main(ActivityThread.java:5391)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.NullPointerException
            at android.content.ContextWrapper.getResources(ContextWrapper.java:89)
            at android.view.ContextThemeWrapper.getResources(ContextThemeWrapper.java:78)
            at com.adi.play.PlayActivity.<init>(PlayActivity.java:12)
            at java.lang.Class.newInstanceImpl(Native Method)
            at java.lang.Class.newInstance(Class.java:1319)
            at android.app.Instrumentation.newActivity(Instrumentation.java:1123)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2268)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2403)
            at android.app.ActivityThread.access$600(ActivityThread.java:165)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1373)
            at android.os.Handler.dispatchMessage(Handler.java:107)
            at android.os.Looper.loop(Looper.java:194)
            at android.app.ActivityThread.main(ActivityThread.java:5391)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
            at dalvik.system.NativeStart.main(Native Method)

私の AndroidManifest.xml ファイル:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.adi.play"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:label="@string/app_name" 
    	android:icon="@drawable/me">
        <activity android:name="PlayActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

私のcom.adi.play.PlayActivity.java ファイル:

package com.adi.play;

import android.os.Bundle;
import android.app.Activity;
import android.widget.Button;
import android.widget.TextView;
import android.view.View;
import android.view.View.OnClickListener;

public class PlayActivity extends Activity {

	public final String RESULT = getResources().getString(R.string.result);
	
	private int total = 0;
	private TextView displayResult;
	private Button incrementButton;
	private Button decrementButton;

	@Override
	public void onCreate(Bundle bundle) {
	
		super.onCreate(bundle);
		setContentView(R.layout.activity_play);
		
		displayResult = (TextView)findViewById(R.id.display_result);
		incrementButton = (Button)findViewById(R.id.increment_button);
		decrementButton = (Button)findViewById(R.id.decrement_button);
		
		displayResult.setText(RESULT+total);
		incrementButton.setOnClickListener(new View.OnClickListener() {
		
			@Override
			public void onClick(View view) {
			
				total++;
				displayResult.setText(RESULT+total);
			}
		});
		
		decrementButton.setOnClickListener(new View.OnClickListener() {
		
			@Override
			public void onClick(View view) {
			
				total--;
				displayResult.setText(RESULT+total);
			}
		});
	}
}

助けてください。このことは私を悩ませています。

4

3 に答える 3

4

この行が原因でした

public final String RESULT = getResources().getString(R.string.result);

getResources()メソッドは呼び出し中に利用可能である必要がありcontextますが、実行時に利用可能なコンテキストはありません。

解決:

代わりに onCreate で初期化RESULTします。

public class PlayActivity extends Activity {

private String result; //this line

private int total = 0;
private TextView displayResult;
private Button incrementButton;
private Button decrementButton;

@Override
public void onCreate(Bundle bundle) {

    super.onCreate(bundle);
    setContentView(R.layout.activity_play);

    result = getResources().getString(R.string.result); //this line
于 2015-06-16T10:08:25.323 に答える
3

これはあなたの問題です。あなたのIDEが同じことについて文句を言わない方法がわかりません:

public final String RESULT = getResources().getString(R.string.result);

RESULTonCreate(); で値を代入してみてください。

ここでは、Android でのリソースの使用方法とリソースへのアクセス方法に関する公式ドキュメントを見つけることができます。

于 2015-06-16T10:08:21.527 に答える