UUID返回空指针异常

时间:2014-12-05 15:33:01

标签: java android nullpointerexception

我正在研究大书呆子牧场指南的Android编程的第二部分。出于某种原因,当我尝试运行应用程序时,它会在启动时崩溃,而log cat则会在行上抛出空指针异常:

UUID crimeID = (UUID)getArguments().getSerializable(EXTRA_CRIME_ID);

为什么EXTRA_CRIME_ID返回空值?

这是我的犯罪清单碎片,其中抛出了异常:

package com.bignerdranch.android.criminalintent;

import java.util.UUID;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.text.Editable;
import android.text.TextWatcher;
import android.text.format.DateFormat;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.EditText;

public class CrimeFragment extends Fragment {
    public static final String EXTRA_CRIME_ID =
           "com.bignerdranch.android.criminalintent.crime_id";

    private Crime mCrime;
    private EditText mTitleField;
    private Button mDateButton;
    private CheckBox mSolvedCheckBox;

    @Override 
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        **UUID crimeID = (UUID)getArguments().getSerializable(EXTRA_CRIME_ID);**  
        mCrime = CrimeLab.get(getActivity()).getCrime(crimeID);   

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState){
        View v =inflater.inflate(R.layout.fragment_crime, parent, false);
        mTitleField = (EditText)v.findViewById(R.id.crime_title);
        mTitleField.setText(mCrime.getTitle());
        mTitleField.addTextChangedListener(new TextWatcher() {
            public void onTextChanged(CharSequence c, int start, int before, int count){
            mCrime.setTitle(c.toString());
        }

        public void beforeTextChanged(CharSequence c, int start, int count, int after){
            //left  blank
        }

        public void afterTextChanged(Editable c){
            //this one to
        }
    });

    mDateButton = (Button)v.findViewById(R.id.crime_date);
    mDateButton.setText(DateFormat.format("hh:mm:ss", mCrime.getDate()));
    mDateButton.setEnabled(false);

    mSolvedCheckBox = (CheckBox)v.findViewById(R.id.crime_solved);
    mSolvedCheckBox.setChecked(mCrime.isSolved());
    mSolvedCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            //set the crimes solved property
            mCrime.setSolved(isChecked);
        }
    });

        return v;
    }

}

3 个答案:

答案 0 :(得分:0)

我还没有定义任何参数,所以我的getArguments()返回null。我应该用

UUID crimeId = (UUID)getActivity().getIntent().getSerializableExtra(EXTRA_CRIME_ID);

代替。

---- 2014年12月16日更新----

正如njzk2所指出的,我将片段链接到活动,阻止它在另一个活动中使用。 BigNerdRanch书籍将其与前面章节中的活动联系起来,原因很简单,然后读者会对其进行更改并添加方法:

public static CrimeFragment newInstance(UUID crimeId){

    Bundle args = new Bundle();
    args.putSerializable(EXTRA_CRIME_ID, crimeId);

    CrimeFragment fragment = new CrimeFragment();
    fragment.setArguments(args);

    //pass UUID from extra
    return fragment;
}

并更改UUID crimeId =(UUID)getActivity()。getIntent()。getSerializableExtra(EXTRA_CRIME_ID);到

 UUID crimeId = (UUID)getArguments().getSerializable(EXTRA_CRIME_ID);

答案 1 :(得分:0)

在阅读您提到的书时,我遇到了这个具体问题。只需从您的CrimeActivity中删除代码即可。当您从活动中删除多余的代码时,该代码应如下所示。

public class CrimeListActivity extends SingleFragmentActivity {
    private ArrayList<Crime> mCrimes;

    @Override
    protected Fragment createFragment() {
        return new CrimeListFragment();
    }}

我想您在过去五年中确实解决了这个问题,但是仍然有人可能遇到类似的问题。我也推荐这本书,它展示了一些可靠的例子,非常简单。

答案 2 :(得分:-2)

找到CrimeActivity.java文件,然后删除onCreate()功能。