两个活动之间的java.lang.NullPointerException

时间:2015-08-11 19:34:51

标签: java android

我有2个活动,我使用第二个活动从第一个访问此功能,这给了我错误。错误来自第3行。

for(i = 0; i < linii; i++)
    {
            siruri[i] = new TableRow(this); //this line causes the error
        TableLayout.LayoutParams detalii = new TableLayout.LayoutParams(
                TableLayout.LayoutParams.MATCH_PARENT,
                TableLayout.LayoutParams.MATCH_PARENT
        );
    }

这是完整的日志:

java.lang.NullPointerException
        at android.content.ContextWrapper.getResources(ContextWrapper.java:94)
        at android.view.ContextThemeWrapper.getResources(ContextThemeWrapper.java:78)
        at android.view.View.<init>(View.java:3568)
        at android.view.ViewGroup.<init>(ViewGroup.java:469)
        at android.widget.LinearLayout.<init>(LinearLayout.java:168)
        at android.widget.TableRow.<init>(TableRow.java:61)
        at com.example.cool.appname.MainActivity.creeare(MainActivity.java:65)
        at com.example.cool.appname.MainActivity.redim(MainActivity.java:254)
        at com.example.cool.appname.Matrice2Activity.Egal(Matrice2Activity.java:225)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at android.view.View$1.onClick(View.java:3964)
        at android.view.View.performClick(View.java:4633)
        at android.view.View$PerformClick.run(View.java:19330)
        at android.os.Handler.handleCallback(Handler.java:733)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:157)
        at android.app.ActivityThread.main(ActivityThread.java:5356)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
        at dalvik.system.NativeStart.main(Native Method)

如果它是相关的,那么这就是我打算从第二个开始使用MainActivity的意图:

Intent incercare = new Intent(Matrice2Activity.this, MainActivity.class);
    incercare.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    startActivity(incercare);

有什么问题?

2 个答案:

答案 0 :(得分:0)

因此,您的Matrice2Activity正在投放,这意味着您的MainActivity已暂停甚至停止。并且您正在使用暂停或已停止的活动创建TableRow作为参数。我怀疑通过引用未运行的活动来创建任何View对象是不合法的。

并且确定从另一个活动调用一个活动的方法是不正确的。因为Android负责创建和销毁它们,没有任何东西可以保证你的其他活动就在那里。 (想象一下,您处于Matrice2Activity活动中,您的应用程序到达后台,然后由于缺少资源而完全停止,然后用户想要切换回来,应用程序重新启动并重新创建Matrice2Activity,但是当时程序中甚至不存在MainActivity的实例!)你必须已经做了一些hackish才能在MainActivity内获得Matrice2Activity实例的引用。

将某些信息从活动返回到上一个活动的正确方法是使用startActivityForResult启动活动,然后使用setResult返回结果。这样,您就可以通过两种方式转发Bundle任何数据。

PS:以这种方式转发数据是乏味的,看起来效果不佳。有时最好在一个活动中包含更多功能,然后只是改变视图。

答案 1 :(得分:-2)

试试这个:

在Activity2中为函数编写一个Activity1参数,然后将其添加到产生NullPointerException的行中。就像:

public function activity2Function(Activity1 activity1) {
    siruri[i] = new TableRow(activity1);
}