空指针从其他活动定义方法时的异常

时间:2015-05-30 13:24:17

标签: android android-activity

我想调用一个从一个活动到另一个活动的方法,但是我给了空指针异常。

SidebarClass.java

public class SidebarClass extends Activity {

private DrawerLayout mDrawerLayout;
private ListView mDrawerList;

public void Sidebar(final Context c) {

    MyAdapter adapter = new MyAdapter(c, generateData());
    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerList = (ListView) findViewById(R.id.listview);
    mDrawerList.setAdapter(adapter);
    mDrawerList
            .setOnItemClickListener(new   AdapterView.OnItemClickListener() {

                @Override
                public void onItemClick(AdapterView<?> parent,
                        android.view.View view, int position, long id) {

                    switch (position) {

                    case 1:
                        Intent i1 = new Intent(c, Map.class);
                        startActivity(i1);
                        break;
                    case 2:
                        Intent i2 = new Intent(c,
                                Basket.class);
                        startActivity(i2);
                        break;
                    }
                }
            });
}

private ArrayList<Model> generateData() {
    ArrayList<Model> models = new ArrayList<Model>();
    models.add(new Model("TimiT "));

    models.add(new Model(R.drawable.home, "home", 1));
    models.add(new Model(R.drawable.basket, "basket", 2));

    return models;
}

}

MainActivity.java

公共类MainActivity扩展了Activity实现OnClickListener {

@Override
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


    setContentView(R.layout.activity_main);
    SidebarClass side = new SidebarClass();
    side.Sidebar(getBaseContext());

  }
}

logcat的

    05-30 13:30:29.897: E/AndroidRuntime(6850): FATAL EXCEPTION: main
    05-30 13:30:29.897: E/AndroidRuntime(6850): java.lang.RuntimeException: 
    Unable to start activity 
    ComponentInfo{com.example.timittest/com.example.timittest.MainActivity}: 
    java.lang.NullPointerException

    05-30 13:30:29.897: E/AndroidRuntime(6850):     at  
   android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
    05-30 13:30:29.897: E/AndroidRuntime(6850):     at 
    android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)

    05-30 13:30:29.897: E/AndroidRuntime(6850):     at 
    android.app.ActivityThread.access$600(ActivityThread.java:141)

    05-30 13:30:29.897: E/AndroidRuntime(6850):     at 
    android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
    05-30 13:30:29.897: E/AndroidRuntime(6850):     at 
    android.os.Handler.dispatchMessage(Handler.java:99)

    05-30 13:30:29.897: E/AndroidRuntime(6850):     at
    android.os.Looper.loop(Looper.java:137)

    05-30 13:30:29.897: E/AndroidRuntime(6850):     at 
    android.app.ActivityThread.main(ActivityThread.java:5041)

    05-30 13:30:29.897: E/AndroidRuntime(6850):     at
    java.lang.reflect.Method.invokeNative(Native Method)

    05-30 13:30:29.897: E/AndroidRuntime(6850):     at
    java.lang.reflect.Method.invoke(Method.java:511)

    05-30 13:30:29.897: E/AndroidRuntime(6850):     at
   com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:79
3)
05-30 13:30:29.897: E/AndroidRuntime(6850):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
05-30 13:30:29.897: E/AndroidRuntime(6850):     at dalvik.system.NativeStart.main(Native Method)
05-30 13:30:29.897: E/AndroidRuntime(6850): Caused by: java.lang.NullPointerException

    05-30 13:30:29.897: E/AndroidRuntime(6850):     at 
    android.app.Activity.findViewById(Activity.java:1839)

   05-30 13:30:29.897: E/AndroidRuntime(6850):  at
   com.example.tools.SidebarClass.Sidebar(SidebarClass.java:29)

  05-30 13:30:29.897: E/AndroidRuntime(6850):   at

  com.example.timittest.MainActivity.onCreate(MainActivity.java:42)

  05-30 13:30:29.897: E/AndroidRuntime(6850):   at

  android.app.Activity.performCreate(Activity.java:5104)

  05-30 13:30:29.897: E/AndroidRuntime(6850):   at
  android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
  05-30 13:30:29.897: E/AndroidRuntime(6850):   at
   android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)

2 个答案:

答案 0 :(得分:1)

SidebarClass side = new SidebarClass();
side.Sidebar(getBaseContext());

这是一个非常糟糕的主意。你永远不应该手动实例化一个活动。您的设计似乎存在一些问题。最有可能的是,您的SidebarClass 延伸Activity。只需删除此部分。我还建议您进行一些研究,以找到创建DrawerLayout的建议做法。

话虽如此,潜在的问题可能仍然存在于您的代码中。请注意logcat中的以下行:

at

com.example.tools.Sid​​ebarClass.Sid​​ebar(SidebarClass.java:29)

这表示错误发生在第29行的SidebarClass.java文件中。您需要查看此行并找出导致NPE的原因。

答案 1 :(得分:1)

在获取DrawerLayout和ListView的句柄之前。您必须使用放置这些控件的View句柄。

View view = inflater.inflate(R.layout.YOUR_LAYOUT, null, false);
mDrawerLayout = (DrawerLayout) view.findViewById(R.id.drawer_layout);
    mDrawerList = (ListView) view.findViewById(R.id.listview);

希望这会对你有所帮助。