Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 扩展子类中的findViewById()_Java_Android_Class_Android View - Fatal编程技术网

Java 扩展子类中的findViewById()

Java 扩展子类中的findViewById(),java,android,class,android-view,Java,Android,Class,Android View,我有两门课,比如: public class Game extends Activity public class CoreGame extends Game 在CoreGame课程中,我有: public void init(){ layout = (RelativeLayout)findViewById(R.id.rlayout); } layout=RelativeLayoutfindViewByIdR.id.rlayout处的执行返回NullPointerException

我有两门课,比如:

public class Game extends Activity

public class CoreGame extends Game
在CoreGame课程中,我有:

public void init(){
    layout = (RelativeLayout)findViewById(R.id.rlayout);
}
layout=RelativeLayoutfindViewByIdR.id.rlayout处的执行返回NullPointerException;CoreGame类产品线

为什么?

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.runcore游戏:

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)

使用此选项,这是初始化和创建对象的正确方法

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

如果我错了,请纠正我,但看起来你正试图这样做

声明一个变量,但您对该类型没有定义。这将在编译时给您一条错误消息

使用强制转换获取变量的属性,该属性可能不具有。布局实际上是相对对象吗

我的钱在第二种选择上。如果对象不是正确的类,则会出现异常,这就是为什么强制转换听起来可能是正确的。这是我在学习Java和Objective-C时的一个简单思路:如果它不是正确的类型,我可以将其转换为正确的类型。简单地说,不是。您似乎正在尝试从没有该属性的对象获取/设置属性,因此函数返回nil或null。在Java中,如果我没有弄错的话,无论如何都要避免这些

您可以通过如下方式声明布局来修复此问题:

RelativeLayout layout = (RelativeLayout) findViewById(R.id.rlayout);
这使它成为正确的类型,因此它可以正确地接收任何和所有信息。现在,我对Java和Android SDK还不熟悉,但我仍然有一个建议:在尝试使用Java构建真正的应用程序之前,先尝试学习Java并熟悉它。很显然,不幸的是,你并不完全熟悉这种语言,这是一种特殊的语言。如果我错了,可能是因为我糊涂了。您真的应该发布显示布局声明的代码,这样我们就可以看到任何潜在的问题


编辑:正如艾德内特拉在给你的评论中所说的,你无论如何都应该在其他地方这样做。除非您确实知道自己在做什么,否则将此类代码放入构造函数是非常危险的。即使应用程序在运行之后看起来很好,这种情况也会导致它运行得更慢、更不稳定。其他代码可能会导致它在没有明显原因的情况下崩溃。这是因为它可以在应用程序中创建僵尸和死内存,这可能会在其他活动需要内存时导致问题。

好的。。。这段代码中有不止一个问题,所以我将逐点解决

一,。您没有以正确的方式启动活动

要启动CoreGame,您需要使用以下命令:

Intent intent = new Intent(getBaseContext(), CoreGame.class);
startActivity(intent);
这将运行活动,Android将调用CoreGame.onCreate。您不需要调用构造函数等。在构造函数中执行的任何操作都应该在onCreate或onStart方法中完成

现在谈谈你的第二个问题

二,。在你修复了意图位之后,你会得到一个NPE

我不确定posted onCreate在哪个类中,因此我将把它分为两个场景:

场景1:Posted onCreate属于游戏

在这种情况下,当您使用Intent启动方法替换新的CoreGame代码行时,当您尝试使用findViewById时,仍然会得到NullPointerException。这是因为您仅在游戏活动中调用了setContentView,现在您将尝试从其他活动访问这些视图。要解决这个问题,您还必须在CoreGame中调用setContentView

场景2:Posted onCreate属于CoreGame

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

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

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

从哪里调用init?发布堆栈跟踪日志这里的信息很少,因此几乎不可能提供帮助。你能给我们看一下其余的代码吗?这样我们就能知道出了什么问题。此外,使用评论作为回应。如果你编辑你的帖子以获得回复,我们将永远看不到它们。你是从构造函数调用init吗?如果是这样,您需要将其移动到onCreate。虽然正确,但它不会处理NPE。为什么要投反对票?我搞砸了什么?如果布局不是RelativeLayout,或者不是从中派生的类,那么异常将是ClassCastException。引用的行与获取属性无关。看起来你是在猜测代表的分数,这可能是投票失败的原因。@Simon我只是想澄清一下,我是在猜测,但不是在猜测代表。猜测是基于这样一个事实,即我不知道Android SDK,但我确实知道Java的一两件事,我自己也犯过类似的错误。然而,你对ClassCastExecption的看法是正确的,我承认我错了。不管怎样,我希望我的一些观点是正确和有用的。哇。。。谢谢你的回复!我试试这个,等一下: