【问题标题】:Java.lang.NullPointerException at getapplicationContext() Androidjava.lang.NullPointerException at getapplicationContext() Android
【发布时间】:2015-02-10 00:13:41
【问题描述】:

当我尝试实例化一个类时,我得到了 NPE,我已经尝试过使用 NameOftheClass.this、getApplicationContext()、getApplication()。这些都不起作用,这是日志:

java.lang.NullPointerException
at br.com.FragmentClientes.<init>(FragmentClientes.java:87) 

第 87 行是:mRepositorio = new Repositorio(FragmentClientes.this);

这里是sn-p:

public class FragmentClientes extends ActionBarActivity {


    private boolean searchCheck;
    private List<ClienteModel> clientes = new ArrayList<ClienteModel>();
    private ProgressBar progressBar;
    private ListView lv;
    private ClientViewAdapter ad;
    private ClientViewAdapter ads;
    private SearchView searchView;
    private LinearLayout footerLinearLayout;
    private boolean shouldExecuteOnResume;
    private Repositorio mRepositorio;

    @Override
    public void onCreate(Bundle savedInstanceState) {


        super.onCreate(savedInstanceState);
        // TODO Auto-generated method stub
        setContentView(R.layout.fragment_cliente);

        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setHomeButtonEnabled(true);

        SecurePreferences mSessao = new SecurePreferences(FragmentClientes.this, "sessao");
        mSessao.put("menuAtual", "Clientes");

        lv = (ListView) findViewById(R.id.listaClientes);

    }


    public FragmentClientes(Integer idViagem)  {

        clientes = new ArrayList<ClienteModel>();


        try {

            mRepositorio = new Repositorio(FragmentClientes.this);

            List lista = mRepositorio.getClientesViagem(idViagem);

            clientes = lista;


            ad = new ClientViewAdapter(FragmentClientes.this, this, clientes);



            lv.setVerticalFadingEdgeEnabled(true);
            lv.setVerticalScrollBarEnabled(true);


            lv.setAdapter(ad);



        } catch (Exception e) {
            e.printStackTrace();
        }


    }
}

【问题讨论】:

  • 使用 SecurePreferences mSessao = new SecurePreferences(FragmentClientes.this, "sessao");
  • @AmrutBidri 试过了,还是一样的错误
  • @Stacktwo 您将在下面的答案中找到完整的解决方案。

标签: java android android-activity nullpointerexception android-context


【解决方案1】:

不要在其构造函数中使用活动上下文,它现在可以工作。请将构造函数中的所有代码放入一个方法中,并在 `onCreate 方法中调用它,如下所示:

@Override
public void onCreate(Bundle savedInstanceState) {


    super.onCreate(savedInstanceState);
    // TODO Auto-generated method stub
    setContentView(R.layout.fragment_cliente);

    getActionBar().setDisplayHomeAsUpEnabled(true);
    getActionBar().setHomeButtonEnabled(true);

    SecurePreferences mSessao = new SecurePreferences(FragmentClientes.this, "sessao");
    mSessao.put("menuAtual", "Clientes");

    Integer idViagem = getIntent().getIntExtra(TAG, -1);

    init(idViagem);



}


public void init(Integer mId)  {

    clientes = new ArrayList<ClienteModel>();


    try {

        mRepositorio = new Repositorio(FragmentClientes.this);

        List lista = mRepositorio.getClientesViagem(mId);

        clientes = lista;


        ad = new ClientViewAdapter(FragmentClientes.this, this, clientes);



        lv.setVerticalFadingEdgeEnabled(true);
        lv.setVerticalScrollBarEnabled(true);


        lv.setAdapter(ad);



    } catch (Exception e) {
        e.printStackTrace();
    }


}

此外,您还需要找到另一种传递整数参数的方法。

为此,在启动活动的意图上使用Intent.putExtra(TAG, idViagem),然后使用getIntent().getIntExtra(TAG, -1)检索构造函数中的值

例如,如果您从另一个活动开始 FragmentClientes 活动:

Intent intent = new Intent(this, FragmentClientes.class);
intent.putExtra("idViagem", int_value_of_id_that_you_passed_through_constructor);
startActivity(intent);

【讨论】:

    【解决方案2】:

    不要创建带参数的Activity构造函数

    只需在 Activity 中初始化您的数据即可回调方法,例如 onCreate(),onResume()

    使用Intent 开始您的Activity

    更多阅读活动文档Activity Documnetation

    【讨论】:

      【解决方案3】:

      FragmentClientes 是一个 Activity。您不应该定义自定义的构造函数,因为方法onCreate 的行为类似于构造函数,并且会被系统自动调用。

      所以把你的代码放到onCreate 方法中。

      重要提示:你不应该,我的意思是真的永远不要打电话 new FragmentClientes(1);

      【讨论】:

      • 我需要在 FragmentClientes 类中传递一个 Id 参数,如何在不创建构造函数的情况下做到这一点?
      • 请看我的回答。
      • @Stacktwo 我看到了你的问题。您应该使用 Intent extras 在活动之间传递参数:stackoverflow.com/questions/2091465/…
      • Activity之间数据传递的另一种方式是使用LocalBroadcast。
      【解决方案4】:

      可能是因为你的 ListView 没有正确实例化

      private ListView lv;
      

      您从不(在您提供的代码中)为该对象分配任何实例化。

      【讨论】:

      • 我已经更新了问题,仍然遇到同样的错误
      • 但是你的 Line (87) 不应该抛出 NullPointerException。你确定是这条线而不是下面的一条吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多