【问题标题】:NullpointExcepction error in Bookmark Activity书签活动中的 NullpointException 错误
【发布时间】:2014-09-23 19:22:15
【问题描述】:

我在执行我的应用程序时遇到了该错误。目的是将一个活动添加到列表中,并通过按下列表中的按钮访问该活动。

我从教程中获取代码,活动代码中没有错误。我可以将我的活动添加到“收藏夹”中,该活动列在另一个活动中。但是当我尝试通过按钮进入该活动时,它会抛出 NullPointException 错误。

活动代码如下:

public class BookmarksActivity extends Activity {

private TextView mEmptyText;
private LinearLayout mBookmarkLayout;

private Context mContext;

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.bookmarks);

    mContext = getApplicationContext();

    mEmptyText = (TextView) findViewById(R.id.empty_textview);
    mBookmarkLayout = (LinearLayout) findViewById(R.id.bookmark_insert_point);

    getAllKeys();
}

private void getAllKeys()
{
    SharedPreferences sp = this.getSharedPreferences("bookmarks", MODE_PRIVATE);
    Map<String,?> keys = sp.getAll();

    int count = 0;
    for(Map.Entry<String,?> entry : keys.entrySet())
    {
        String value = entry.getValue().toString();
        System.out.println("!!!!!!!!!!!!!!!!!value = "+value);
        String delimiter = ",";
        String[] values_array = value.split(delimiter);
        addBookmark(values_array);
        count++; //keep track of the number of bookmarks
    }

    //if there are no bookmarks, display a text view saying so.  Otherwise, make the text view go away
    if (count == 0)
    {
        mEmptyText.setVisibility(View.VISIBLE);
        mEmptyText.setText(getString(R.string.no_bookmarks));
    }
    else
        mEmptyText.setVisibility(View.GONE);

}

private void addBookmark(String[] values_array)
{       
    LayoutInflater vi = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View v = vi.inflate(R.layout.single_bookmark, null);

    TextView text = (TextView) v.findViewById(R.id.bookmark_text);
    Button button = (Button) v.findViewById(R.id.bookmark_button);

    text.setText(values_array[1]);

    final String myClass = values_array[0];
    button.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            Class<?> cl = null;
            try {
                cl = Class.forName(myClass);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            Intent myIntent = new Intent(mContext, cl);
            startActivity(myIntent);
        }
    });

    // insert into main view
    mBookmarkLayout.addView(v, 0, new      LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,  LinearLayout.LayoutParams.FILL_PARENT));
    System.out.println("!!!!!!!!!!!!!!!!!!!!Just added a view");
}
}

我在以下位置收到错误:Intent myIntent = new Intent(mContext, cl);

也许 myClass 是空的,但我不知道很容易找到。

谢谢!

编辑:添加了 LogCat

09-23 20:04:53.367: E/AndroidRuntime(629): FATAL EXCEPTION: main
09-23 20:04:53.367: E/AndroidRuntime(629): java.lang.NullPointerException
09-23 20:04:53.367: E/AndroidRuntime(629):  at android.content.ComponentName.<init>(ComponentName.java:76)
09-23 20:04:53.367: E/AndroidRuntime(629):  at android.content.Intent.<init>(Intent.java:3301)
09-23 20:04:53.367: E/AndroidRuntime(629):  at com.and.mememe.FavouritesActivity$1.onClick(FavouritesActivity.java:101)
09-23 20:04:53.367: E/AndroidRuntime(629):  at android.view.View.performClick(View.java:4084)
09-23 20:04:53.367: E/AndroidRuntime(629):  at android.view.View$PerformClick.run(View.java:16966)
09-23 20:04:53.367: E/AndroidRuntime(629):  at android.os.Handler.handleCallback(Handler.java:615)
09-23 20:04:53.367: E/AndroidRuntime(629):  at android.os.Handler.dispatchMessage(Handler.java:92)
09-23 20:04:53.367: E/AndroidRuntime(629):  at android.os.Looper.loop(Looper.java:137)
09-23 20:04:53.367: E/AndroidRuntime(629):  at android.app.ActivityThread.main(ActivityThread.java:4745)
09-23 20:04:53.367: E/AndroidRuntime(629):  at java.lang.reflect.Method.invokeNative(Native Method)
09-23 20:04:53.367: E/AndroidRuntime(629):  at java.lang.reflect.Method.invoke(Method.java:511)
09-23 20:04:53.367: E/AndroidRuntime(629):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
09-23 20:04:53.367: E/AndroidRuntime(629):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
09-23 20:04:53.367: E/AndroidRuntime(629):  at dalvik.system.NativeStart.main(Native Method)

编辑 2

button.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            Class<?> cl = null;
            try {
                cl = Class.forName(myClass);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            Intent myIntent = new Intent(mContext, cl);
            startActivity(myIntent);
        }
    });

【问题讨论】:

  • 首先你没有得到NPE...发布你的完整日志。其次,你不需要Application ContextActivity Context 可以工作。所以这个mContext = getApplicationContext(); 可能是mContext = this;,但也没有必要。只需使用v.getContext()
  • @codeMagic 谢谢你的回答。我已经替换它并使用了 v.getContext() 但错误仍然存​​在。
  • 您的问题位于onClick()FavouritesActivity.java 的第101 行。这就是您需要发布的代码。
  • @codeMagic 哎呀,你是对的!我说的是第 102 行。编辑 2 中添加的 onClick 代码。谢谢
  • 那么究竟哪一行是 101?那onClick() 来自FavouritesActivity.java 而不是你原来的BookmarksActivity.java

标签: android android-intent android-activity sharedpreferences


【解决方案1】:

这里的问题归根结底是myClass 没有返回有效的类名。所以实际上没有Activity 可以开始。

这里是代码

try {
            cl = Class.forName(myClass);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

正在捕获ClassNotFoundException,但代码继续尝试启动无效的Activity。要解决此问题,请将 Intent 代码放入 try 块中。这样,当它捕获到异常时,可以用它来做一些事情,例如记录、打印消息等……但是,最重要的是,它不会尝试启动无效的 Activity。需要检查myClass 变量的有效性。路径错误或拼写错误。

try {
        cl = Class.forName(myClass);
        Intent myIntent = new Intent(mContext, cl);
        startActivity(myIntent);
     } catch (ClassNotFoundException e) {
        e.printStackTrace();
     }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-09
    • 2012-08-24
    • 2017-12-18
    相关资源
    最近更新 更多