【问题标题】:java.lang.NullPointerException:Attempt to invoke virtual method 'java.lang.String com.data.model.Address.getShortAddress()' on null object reference [duplicate]java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.lang.String com.data.model.Address.getShortAddress()”[重复]
【发布时间】:2021-08-22 12:05:14
【问题描述】:

我是 android 新手,正在尝试创建一个简单的应用程序。但是,我收到 nullpointerexception 错误并且对此了解不多。

我得到的错误:

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.lang.String com.jstechnologies.helpinghands.data.model.Address.getShortAddress()”

   at com.jstechnologies.helpinghands.ui.views.dashBoard.DashBoardActivity$5.onChanged(DashBoardActivity.java:113)
    at com.jstechnologies.helpinghands.ui.views.dashBoard.DashBoardActivity$5.onChanged(DashBoardActivity.java:110)

DashBoardActivity.java

package com.jstechnologies.helpinghands.ui.views.dashBoard;



public class DashBoardActivity extends BaseActivity<DashBoardViewModel> {

    LinearLayout tagsView;
    TextView dealers_viewall,location;
    ExtendedFloatingActionButton fab;
    ShimmerFrameLayout shimmerFrameLayout;
    RecyclerView dealersRecyclerView;
    ServiceAdapter serviceAdapter;
    Toolbar toolbar;
    int h=0;

    private static int RC_ADD_SERVICE=101;
    private static int RC_SERVICE_DISPLAY=102;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dashboard);
        registerViewComponents();
        setSupportActionBar(toolbar);
        viewmodel.fetchAddress(this);
        viewmodel.fetchData();
    }

    @NonNull
    @Override
    protected DashBoardViewModel createViewModel() {
        DashBoardViewModelFactory viewModelFactory= new DashBoardViewModelFactory(ServiceRepository.getInstance());
        return new ViewModelProvider(this,viewModelFactory).get(DashBoardViewModel.class);
    }

    @Override
    protected void onMessage(String message) {
        Toast.makeText(this,message,Toast.LENGTH_SHORT).show();
    }

    @Override
    protected void observe() {

        viewmodel.getIsLoadingLiveData().observe(this, new Observer<Boolean>() {
            @Override
            public void onChanged(Boolean aBoolean) {
                if(aBoolean)
                    serviceAdapter.setModels(new ArrayList<>());
                shimmerFrameLayout.setVisibility(aBoolean?View.VISIBLE:View.GONE);
            }
        });

        viewmodel.getMessageLiveData().observe(this, new Observer<String>() {
            @Override
            public void onChanged(String s) {
               onMessage(s);
            }
        });
        viewmodel.getRepositoryMessage().observe(this, new Observer<String>() {
            @Override
            public void onChanged(String s) {
                onMessage(s);
            }
        });
        viewmodel.getServicesListLiveData().observe(this, new Observer<List<ServiceModel>>() {
            @Override
            public void onChanged(List<ServiceModel> serviceModels) {
                serviceAdapter.setModels(serviceModels);
            }
        });
        viewmodel.getAddressLiveData().observe(this, new Observer<Address>() {
            @Override
            public void onChanged(Address address) {
                location.setText(address.getShortAddress());
            }
        });
    }

    void registerViewComponents() {
        location=findViewById(R.id.location);
        dealers_viewall = findViewById(R.id.dealers_viewall);
        tagsView = findViewById(R.id.tagView);
        shimmerFrameLayout = findViewById(R.id.shimmer_view_container);
        fab = findViewById(R.id.fab);
        dealersRecyclerView = findViewById(R.id.recycler_dealers);
        serviceAdapter= new ServiceAdapter();
        dealersRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        dealersRecyclerView.setAdapter(serviceAdapter);
        fab.shrink();
        toolbar=findViewById(R.id.toolbar);
        dealers_viewall.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(DashBoardActivity.this, SearchableActivity.class));
            }
        });
        serviceAdapter.setOnItemClickListener(new ServiceAdapter.OnItemClickListener() {
            @Override
            public void OnItemClick(ServiceModel dealer, int index) {
                startActivityForResult(getSelectedIntentFor(dealer),RC_SERVICE_DISPLAY);
            }
        });

    }

    public void onMenuClick(View view) {
    }

    public void onfabClick(View view) {
        startActivityForResult(getAddServiceIntent(),RC_ADD_SERVICE);
    }

    private Intent getAddServiceIntent()
    {
        return new Intent(this, AddServiceActivity.class);
    }
    private Intent getSelectedIntentFor(ServiceModel model)
    {
        Intent intent= new Intent(this,ServiceDisplayActivity.class);
        intent.putExtra("service_data",new Gson().toJson(model));
        return intent;
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(resultCode==RESULT_OK)
            viewmodel.fetchData();
    }


    public void onRefreshClick(View view) {
        viewmodel.fetchData();
    }

【问题讨论】:

标签: java android android-studio nullpointerexception


【解决方案1】:

当您的活动观察实时数据时,address.getShortAddress() 值为 null。这就是您得到 NullPointerException 的原因。所以在观察者内部进行 null 检查。

viewmodel.getAddressLiveData().observe(this, new Observer<Address>() {
            @Override
            public void onChanged(Address address) {
                if(address!=null && address.getShortAddress()!=null)
                location.setText(address.getShortAddress());
            }
        });

【讨论】:

    【解决方案2】:

    这是典型的 NPE 错误。您使用的是空变量。

    viewmodel.getAddressLiveData().observe(this, new Observer<Address>() {
                @Override
                public void onChanged(Address address) {
                    location.setText(address.getShortAddress());
                }
            });
    

    您尝试访问address 变量,但它为空。

    您的ViewModel 给了您一个空对象,您必须检查您的ViewModel 中发生的原因。

    下次使用Java时,在使用变量之前检查空值:

    viewmodel.getAddressLiveData().observe(this, new Observer<Address>() {
                    @Override
                    public void onChanged(Address address) {
                        if(address != null){
                             location.setText(address.getShortAddress());
                         }
                        
                    }
                });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-30
      • 2015-02-09
      • 2015-07-16
      相关资源
      最近更新 更多