-3

次のような2つのクラスがあります。

public class Game extends Activity

public class CoreGame extends Game

CoreGameクラスには次のものがあります

public void init(){
    layout = (RelativeLayout)findViewById(R.id.rlayout);
}

CoreGameクラスの行NullPointerExceptionで実行が戻ります。layout = (RelativeLayout)findViewById(R.id.rlayout);

なんで?

OnCreate :

   @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

        setContentView(R.layout.game);

        core = new CoreGame(this);
        core.runCoreGame();

    }

Core.runCoreGame():

public void runCoreGame(){
    init();
}

public void init(){
    layout = (RelativeLayout)findViewById(R.id.rlayout);
}

スタックトレース:

FATAL EXCEPTION: main
    java.lang.RuntimeException: Unable to start activity ComponentInfo{gianbalex.mgs_revenge/gianbalex.mgs_revenge.Game}: java.lang.NullPointerException
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
        at android.app.ActivityThread.access$2300(ActivityThread.java:125)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:123)
        at android.app.ActivityThread.main(ActivityThread.java:4627)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:521)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
        at dalvik.system.NativeStart.main(Native Method)
    Caused by: java.lang.NullPointerException
        at android.app.Activity.findViewById(Activity.java:1637)
        at gianbalex.mgs_revenge.CoreGame.initVariables(CoreGame.java:118)
        at gianbalex.mgs_revenge.CoreGame.runCoreGame(CoreGame.java:84)
        at gianbalex.mgs_revenge.Game.onCreate(Game.java:28)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
4

3 に答える 3

2

わかりました...このコードには複数の問題があるので、ポイントごとに取り組みます。

1. アクティビティを正しい方法で起動していない

を開始するには、次の行に沿ってインテントCoreGameを使用する必要があります。

Intent intent = new Intent(getBaseContext(), CoreGame.class);
startActivity(intent);

これによりアクティビティが実行され、Android が を呼び出しますCoreGame.onCreate()。コンストラクターなどを呼び出す必要はありません。コンストラクターで行うことはすべて、onCreate()またはonStart()メソッドで行う必要があります。

次に、2番目の問題に進みます

2. インテント ビットを修正すると、NPE が発生する

投稿がどのクラスに属しているのかわからないのでonCreate()、これを 2 つのシナリオに分割します。

シナリオ 1: 投稿された onCreate() はゲームに属します

この場合、new CoreGame行をIntent起動方法に置き換えるNullPointerExceptionと、使用しようとするとfindViewById(). これはsetContentView()、アクティビティを呼び出しただけで、別Gameの から にアクセスしようとしているためです。これを修正するには、電話をかける必要があります。ViewsActivitysetContentView()CoreGame

シナリオ 2: 投稿された onCreate() は CoreGame に属します

この場合、次の 2 行を完全に削除できます。

core = new CoreGame(this);
core.runCoreGame();

代わりに、単に呼び出すだけrunCoreGame()で十分です

于 2012-10-10T16:49:24.477 に答える
-2

私が間違っている場合は修正してください。ただし、どちらかを試みているようです

  1. 変数を宣言しますが、型の周りに () があります。コンパイル時にエラーメッセージが表示されるはずです。

  2. キャストを使用して変数のプロパティを取得しますが、それは持っていない可能性があります。layout実際にRelativeLayoutオブジェクトですか?

私のお金は2番目のオプションです。オブジェクトが正しいクラスではない場合、例外が発生します。これが、キャストが正しく聞こえる理由です。これは、私がまだ Java と Objective-C を学んでいたときの単純な考え方です。「正しい型でない場合は、キャストして正しい型にすることができます」。簡単に言えば、いいえ。ここで行っているように見えるのは、そのプロパティを持たないものからプロパティを取得/設定しようとしているため、関数はnilorを返しますnull。Java では、私が間違っていなければ、これらは何としてでも避けるべきです。

layout次のように宣言することで、これを修正できます。

RelativeLayout layout = (RelativeLayout) findViewById(R.id.rlayout);

これにより、正しい型になり、ありとあらゆる情報を適切に受け取ることができます。現在、私は Java と Android SDK を初めて使用しますが、まだ推奨事項があります。実際のアプリケーションを構築する前に、Java を学び、それに慣れることです。残念ながら、あなたは言語に完全に精通しているわけではなく、その特異性は明らかです。私が間違っているとすれば、それはおそらく私が混乱しているからです。layout潜在的な問題を確認できるように、宣言を示すコードを投稿する必要があります。

編集:AedonEtLIRAがコメントで言ったように、とにかくこれを他の場所で行う必要があります。自分が何をしているのかを本当に正確に理解していない限り、そのようなコードをコンストラクターに入れることは非常に危険です。後でアプリケーションが問題ないように見えても、そのようなことが原因で実行が遅くなり、不安定になる可能性があります。他のコードにより、明らかな理由もなくクラッシュする可能性があります。これは、アプリケーションでゾンビや「デッド メモリ」が作成される可能性があり、他のアクティビティにメモリが必要な場合に問題が発生する可能性があるためです。

于 2012-10-10T16:10:23.600 に答える