-3

我有两个类,例如:

public class Game extends Activity

public class CoreGame extends Game

CoreGame课程中,我有:

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

CoreGame类行的执行返回NullPointerExceptionlayout = (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 intent = new Intent(getBaseContext(), CoreGame.class);
startActivity(intent);

这将运行 Activity,Android 将调用CoreGame.onCreate(). 您不需要调用构造函数等。您在构造函数中所做的任何事情都应该在onCreate()oronStart()方法中完成。

现在到你的第二个问题

2. 修复 Intent 位后,你最终会得到一个 NPE

我不确定发布onCreate()的是哪个类,所以我将把它分成两个场景:

场景一:发布的 onCreate() 属于游戏

在这种情况下,当您将new CoreGame行替换为Intent启动方法时,您仍然会NullPointerException在尝试使用findViewById(). 这是因为您只调用setContentView()GameActivity,现在您将尝试Views从不同的Activity. 要解决此问题,您还必须致电setContentView()CoreGame

场景2:发布onCreate()属于CoreGame

在这种情况下,您可以完全删除这两行:

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

相反,只需调用runCoreGame()就足够了

于 2012-10-10T16:49:24.477 回答
0

使用这个,这是初始化和创建对象的正确方法。

 RelativeLayout layout = (RelativeLayout) findViewById(R.id.rlayout);
于 2012-10-10T15:59:50.397 回答
-2

如果我错了,请纠正我,但看起来你正在尝试

  1. 声明一个变量,但你有 () 围绕类型。这应该在编译时给你一个错误消息。

  2. 使用强制转换来获取变量的属性,它可能没有。layout实际上是RelativeLayout对象吗?

我的钱是第二种选择。如果对象不属于正确的类,您将得到一个异常,这就是强制转换听起来正确的原因。这是我在学习 Java 和 Objective-C 时的一个简单想法:“如果它不是正确的类型,我可以强制转换正确的类型”。简单地说,没有。您似乎在这里做的是尝试从没有该属性的东西中获取/设置属性,因此该函数返回nilor null。在 Java 中,如果我没记错的话,将不惜一切代价避免这些。

您可以通过如下声明来解决此layout问题:

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

这使它成为正确的类型,因此它可以正确接收任何和所有信息。现在,我是 Java 和 Android SDK 的新手,但我仍然有一个建议:在尝试使用 Java 构建真正的应用程序之前,先尝试学习 Java 并熟悉它。不幸的是,您显然并不完全熟悉该语言及其特性。如果我错了,那可能是因为我很困惑。您确实应该发布显示声明的代码,layout以便我们可以在那里看到任何潜在的问题。

编辑:正如 AedonEtLIRA 在对您的评论中所说,无论如何您都应该在其他地方这样做。除非你真的很清楚自己在什么,否则将这种代码放入构造函数中是非常危险的。即使应用程序之后看起来很好,这种事情也会导致它运行得更慢并且更不稳定。其他代码可能会导致它无缘无故地崩溃。这是因为它可以在应用程序中创建僵尸和“死内存”,当其他活动需要内存时,这可能会导致问题。

于 2012-10-10T16:10:23.600 回答