获取NullpointerException

时间:2013-09-12 07:57:56

标签: android

伙计们,你可以检查一下为什么我在这一行中得到一个空指针异常,

cl = Class.forName(myClass);

以下是代码:

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); // <--- this is where i am getting a null pointer exception
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
        }
            Intent myIntent = new Intent(mContext, cl);
            startActivity(myIntent);
        }
    });

我应该如何解决这个问题? 或者我需要更换一些东西?

3 个答案:

答案 0 :(得分:0)

Java Docs说什么是Class.forName();如果找不到类,将返回ClassNotFoundException,所以我会说它永远不会返回null。

查看您的日志。 可能是java无法从名称中找到类

String myClass = values_array[0];

答案 1 :(得分:0)

    public void onClick(View v) {
        Class<?> cl = null;
        try {
            Log.e("onClick", "myClass="+myClass);
        cl = Class.forName(myClass); // <--- this is where i am getting a null pointer exception
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
    }

确保“myClass”不为空;

答案 2 :(得分:0)

发布我的评论作为答案,OP请求清除它&gt;

真的不应该使用单个String[]来保存语义上不同类型的数据!

第一个元素是 classname ,第二个元素是标签语义:你应该拥有这个方法的签名,让它们分开!单个阵列是不可读的,非结构化的,通常是不可维护的!

(我还在这里添加了一个在classNAme中检查null的条件......我假设className为null是一个致命的错误。)

private void addBookmark(String labelText, String className) {      
      //check className not to be null
      if(className==null) {
          //handle error somehow, log error, etc
          ...
          //no point in doing anything the listener, it would not do any good, just return
          return;
      }

    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(labelValue); // variable "labelValue"

    final String myClass = className; //variable className
      //checking for null

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

当然,当您调用此方法时,您还应该更改以下代码:

addBookmark(anArrayOfStrings);

addBookmark(myLabelValueString, myClassNameString);

其中myLabelValueString,myClassNameString是包含相应值的String变量。