java - Android NullPointerException 错误消息

标签 java android nullpointerexception navigation-drawer

我正在尝试在 Android 中创建一个抽屉导航。这是我设置抽屉导航的代码:

public class NavigationDrawer extends Activity  {
Context context;
private String[] drawerListViewItems;
private DrawerLayout drawerLayout;
private ListView drawerListView;
private ActionBarDrawerToggle actionBarDrawerToggle;

protected DrawerLayout fullLayout;
protected FrameLayout actContent;

@Override
public void setContentView(final int layoutResID) {

    fullLayout = (DrawerLayout) getLayoutInflater().inflate(
            R.layout.navigation_drawer, null); // Your base layout here
    actContent = (FrameLayout) fullLayout.findViewById(R.id.act_content);
    getLayoutInflater().inflate(layoutResID, actContent, true);
    super.setContentView(fullLayout);

    // get list items from strings.xml
    drawerListViewItems = getResources().getStringArray(R.array.items);
    // get ListView defined in navigation_drawer.xml
    drawerListView = (ListView) findViewById(R.id.left_drawer);

    // Set the adapter for the list view
    drawerListView.setAdapter(new ArrayAdapter<String>(this,
            R.layout.drawer_listview_item, drawerListViewItems));

    // App Icon
    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

    actionBarDrawerToggle = new ActionBarDrawerToggle(this, /* host Activity */
    drawerLayout, /* DrawerLayout object */
    R.drawable.ic_drawer, /* nav drawer icon to replace 'Up' caret */
    R.string.drawer_open, /* "open drawer" description */
    R.string.drawer_close /* "close drawer" description */
    );

    // Set actionBarDrawerToggle as the DrawerListener
    drawerLayout.setDrawerListener(actionBarDrawerToggle);

    getActionBar().setDisplayHomeAsUpEnabled(true);

    // just styling option add shadow the right edge of the drawer
    drawerLayout.setDrawerShadow(R.drawable.drawer_shadow,
            GravityCompat.START);

    drawerListView.bringToFront();
    //drawerListView.requestLayout();

    drawerListView.setOnItemClickListener(new DrawerItemClickListener());
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    actionBarDrawerToggle.onConfigurationChanged(newConfig);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    // call ActionBarDrawerToggle.onOptionsItemSelected(), if it returns
    // true
    // then it has handled the app icon touch event
    if (actionBarDrawerToggle.onOptionsItemSelected(item)) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    // Sync the toggle state after onRestoreInstanceState has occurred.
    actionBarDrawerToggle.syncState();
}

private class DrawerItemClickListener implements ListView.OnItemClickListener {
    @Override
    public void onItemClick(AdapterView parent, View view, int position,
            long id) {
        switch (position) {
        //Dashboard
        case 0:
            Intent dashboardIntent = new Intent(context, Dashboard.class);
            startActivity(dashboardIntent);
            break;
        //Account
        case 1:
            break;
        //Setting
        case 2:
            break;
        //Logout
        case 3:
            Toast.makeText(NavigationDrawer.this, "You have logged out!", Toast.LENGTH_SHORT)
            .show();
            System.exit(0);
            break;
        }
        drawerLayout.closeDrawer(drawerListView);
    }
}
}

但是,当我单击抽屉导航中的第一项时,我收到 LogCat 形式的 NullPointerException 错误消息:

8-27 11:10:55.932: E/AndroidRuntime(7088): FATAL EXCEPTION: main
08-27 11:10:55.932: E/AndroidRuntime(7088): java.lang.NullPointerException
08-27 11:10:55.932: E/AndroidRuntime(7088):     at android.content.ComponentName.<init>(ComponentName.java:75)
08-27 11:10:55.932: E/AndroidRuntime(7088):     at android.content.Intent.<init>(Intent.java:3201)
08-27 11:10:55.932: E/AndroidRuntime(7088):     at com.example.mymoney.NavigationDrawer$DrawerItemClickListener.onItemClick(NavigationDrawer.java:105)
08-27 11:10:55.932: E/AndroidRuntime(7088):     at android.widget.AdapterView.performItemClick(AdapterView.java:292)
08-27 11:10:55.932: E/AndroidRuntime(7088):     at android.widget.AbsListView.performItemClick(AbsListView.java:1185)
08-27 11:10:55.932: E/AndroidRuntime(7088):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:2713)
08-27 11:10:55.932: E/AndroidRuntime(7088):     at android.widget.AbsListView$1.run(AbsListView.java:3468)
08-27 11:10:55.932: E/AndroidRuntime(7088):     at android.os.Handler.handleCallback(Handler.java:605)
08-27 11:10:55.932: E/AndroidRuntime(7088):     at android.os.Handler.dispatchMessage(Handler.java:92)
08-27 11:10:55.932: E/AndroidRuntime(7088):     at android.os.Looper.loop(Looper.java:137)
08-27 11:10:55.932: E/AndroidRuntime(7088):     at android.app.ActivityThread.main(ActivityThread.java:4512)
08-27 11:10:55.932: E/AndroidRuntime(7088):     at java.lang.reflect.Method.invokeNative(Native Method)
08-27 11:10:55.932: E/AndroidRuntime(7088):     at java.lang.reflect.Method.invoke(Method.java:511)
08-27 11:10:55.932: E/AndroidRuntime(7088):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:982)
08-27 11:10:55.932: E/AndroidRuntime(7088):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:749)
08-27 11:10:55.932: E/AndroidRuntime(7088):     at dalvik.system.NativeStart.main(Native Method)
08-27 11:11:23.643: I/Process(7088): Sending signal. PID: 7088 SIG: 9

此外,当我尝试使用 Toast.makeText(NavigationDrawer.this,position, Toast.LENGTH_SHORT).show(); 时,它向我显示了相同的 nullPointerException 错误消息。我想知道为什么会这样。

提前致谢。

编辑

按照建议更改代码后,我收到以下错误消息:

08-27 11:24:52.127: E/AndroidRuntime(10207): FATAL EXCEPTION: main
08-27 11:24:52.127: E/AndroidRuntime(10207): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mymoney/com.example.mymoney.Dashboard}: java.lang.NullPointerException
08-27 11:24:52.127: E/AndroidRuntime(10207):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1970)
08-27 11:24:52.127: E/AndroidRuntime(10207):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1995)
08-27 11:24:52.127: E/AndroidRuntime(10207):    at android.app.ActivityThread.access$600(ActivityThread.java:127)
08-27 11:24:52.127: E/AndroidRuntime(10207):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1161)
08-27 11:24:52.127: E/AndroidRuntime(10207):    at android.os.Handler.dispatchMessage(Handler.java:99)
08-27 11:24:52.127: E/AndroidRuntime(10207):    at android.os.Looper.loop(Looper.java:137)
08-27 11:24:52.127: E/AndroidRuntime(10207):    at android.app.ActivityThread.main(ActivityThread.java:4512)
08-27 11:24:52.127: E/AndroidRuntime(10207):    at java.lang.reflect.Method.invokeNative(Native Method)
08-27 11:24:52.127: E/AndroidRuntime(10207):    at java.lang.reflect.Method.invoke(Method.java:511)
08-27 11:24:52.127: E/AndroidRuntime(10207):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:982)
08-27 11:24:52.127: E/AndroidRuntime(10207):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:749)
08-27 11:24:52.127: E/AndroidRuntime(10207):    at dalvik.system.NativeStart.main(Native Method)
08-27 11:24:52.127: E/AndroidRuntime(10207): Caused by: java.lang.NullPointerException
08-27 11:24:52.127: E/AndroidRuntime(10207):    at com.example.mymoney.Dashboard.onCreate(Dashboard.java:12)
08-27 11:24:52.127: E/AndroidRuntime(10207):    at android.app.Activity.performCreate(Activity.java:4465)
08-27 11:24:52.127: E/AndroidRuntime(10207):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1052)
08-27 11:24:52.127: E/AndroidRuntime(10207):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1934)
08-27 11:24:52.127: E/AndroidRuntime(10207):    ... 11 more

我的仪表板类是这样的:

public class Dashboard extends NavigationDrawer{
    int id;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dashboard);
        id = getIntent().getExtras().getInt("userID");
    }
}

我从登录类的这一部分获取 ID:

public void onLogInClicked(View view) {
    // TODO Auto-generated method stub
    DatabaseAdapter mDbHelper = new DatabaseAdapter(this);
    mDbHelper.createDatabase();
    mDbHelper.open();
    UserController uc = new UserController(mDbHelper.open());
    ArrayList<UserModel> ulogin = uc.getLogin();
    boolean login = false;
    for (int i = 0; i < ulogin.size(); i++) {
        if (txtUserName.getText().toString()
                .equals(ulogin.get(i).getUserName().toString())
                && txtPwd.getText().toString()
                        .equals(ulogin.get(i).getPassword().toString())) {
            Toast.makeText(MainActivity.this, "Login Successfully!",
                    Toast.LENGTH_SHORT).show();
            loginintent = new Intent(context, Dashboard.class);
            loginintent.putExtra("userName", ulogin.get(i)
                    .getUserName().toString());
            startActivity(loginintent);
            login = true;
            break;
        }
    }
}

所以基本上我想做的是用户登录后,他们将被重定向到仪表板。然后,用户还可以使用抽屉进行导航。我错过了什么吗?

最佳答案

问题:

new Intent(context, Dashboard.class);

上下文永远不会实例化,因此给你NPE

解决方案:

 new Intent(NavigationDrawer.this, Dashboard.class);

NavigationDrawer.this 将直接从您的 Activity 类获取 context 的引用。

关于java - Android NullPointerException 错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25518395/

相关文章:

java - 包装不可编辑的单例类

java - 奇怪的 TableView.itemsProperty 行为?

java - JList 项中的自动换行

c# - 为什么我会收到错误 "NullReferenceException was unhandled"?

java - 如果我不在表中输入任何值或将任何行留空,则会出现 NullPointerException

java - 为什么即使声明为最终数组列表也可以用新项目扩展

android - 谁负责在 Android 中触发应用程序无响应对话框?

安卓 : Compare two ArrayList of objects and find unmatching ids from the second ArrayList

java - 向某个pc应用的所有android客户端发送消息

java - 使用带有 ResultSet 的 ArrayList 的空指针异常