Android.os.Bundle上的NullPointerException

3

我在代码中遇到了一些问题,当我需要从一个 Activity 传输数据到另一个 Activity 时。第一个 Activity (ViewCashflow),我想要从 ViewCashflow 传输一些数据到第二个 Activity (NewTransaction)。这里它能够正常工作,没有错误,数据成功传输。但是,当我直接运行第二个 Activity(不像之前从第一个 Activity 传输数据那样),我在用于从第一个 Activity 接收数据的方法上得到了空指针异常。

我已经尝试研究所有这些问题,但仍未解决。在其他的 Activity (ViewCategoryAddCategory) 中,我正在做同样的事情(从 ViewCategory 传输数据到 AddCategory),它能够正常工作,当我直接运行 AddCategory 时没有错误,但代码和我遇到错误的两个 Activity 的模式完全相同。

请大师帮忙解决。 谢谢。

错误报告如下:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.os.Bundle.getBoolean(java.lang.String)' on a null object reference at com.example.ever_ncn.cashflow.NewTransaction.onCreate(NewTransaction.java:68)

注意:这是我第一个 Activity (ViewCashflow) 的代码:

public class ViewCashflow extends ActionBarActivity {
private SQLiteDatabase db;
private static Button BtnIAddCateg;
private static Button BtnICancelCateg;
private static final String TAG = CategorySetting.class.getSimpleName();
DatabaseHelper dBHelper = new DatabaseHelper (this);
private ListView list;

private ArrayList<String> arrTransId = new ArrayList<String>();
private ArrayList<String> arrTransName = new ArrayList<String>();
private ArrayList<String> arrTransAmount = new ArrayList<String>();
private ArrayList<String> arrTransType= new ArrayList<String>();
private ArrayList<String> arrTransDate= new ArrayList<String>();
private ArrayList<String> arrCategId= new ArrayList<String>();
private AlertDialog.Builder build;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_view_cashflow);
    displayData();
}

//udah beres udah bisa show, tinggal action click udh bisa tp value blm pindah,,
//penggunaan Radio Button belum nanti di NewTrans
private void displayData() {
    db = dBHelper.getReadableDatabase();
    Cursor mCursor = db.rawQuery("SELECT * FROM " + dBHelper.TABLE_Trans_NAME, null);
    list = (ListView)findViewById(android.R.id.list);
    arrTransId.clear();
    arrTransName.clear();
    arrTransAmount.clear();
    arrTransType.clear();
    arrTransDate.clear();
    arrCategId.clear();
    if (mCursor.moveToFirst()) {
        do {
            arrTransId.add(mCursor.getString(mCursor.getColumnIndex(dBHelper.TOL1)));
            arrTransName.add(mCursor.getString(mCursor.getColumnIndex(dBHelper.TOL2)));
            arrTransAmount.add(mCursor.getString(mCursor.getColumnIndex(dBHelper.TOL3)));
            arrTransType.add(mCursor.getString(mCursor.getColumnIndex(dBHelper.TOL4)));
            arrTransDate.add(mCursor.getString(mCursor.getColumnIndex(dBHelper.TOL5)));
            arrCategId.add(mCursor.getString(mCursor.getColumnIndex(dBHelper.TOL6)));

        } while (mCursor.moveToNext());
    }
    DisplayAdapterTrans disadptr = new DisplayAdapterTrans(ViewCashflow.this, arrTransId, arrTransName,
                                arrTransAmount, arrTransType, arrTransDate, arrCategId);
    list.setAdapter(disadptr);
    mCursor.close();

    list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
            //click to update data
            // namanya blom diubah coeg
            Intent i = new Intent(getApplicationContext(), NewTransaction.class);
            i.putExtra("TransId", arrTransId.get(arg2));
            i.putExtra("TransName", arrTransName.get(arg2));
            i.putExtra("TransAmount", arrTransAmount.get(arg2));
            i.putExtra("TransType", arrTransType.get(arg2));
            i.putExtra("TransDate", arrTransDate.get(arg2));
            i.putExtra("TransCategId", arrCategId.get(arg2));
            i.putExtra("update", true);
            startActivity(i);
        }
    });
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_view_cashflow, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}
}

这个是针对第二个ActivityNewTransaction)的。

public class NewTransaction extends ActionBarActivity {
Button btnIDate;
Button btnIAdd;
Button btnICancel;
RadioButton RdIncome;
RadioButton RdOutcome;
EditText txtAmount, txtCashflow, txtType;
DatabaseHelper dbHelper = new DatabaseHelper(this);
SQLiteDatabase db;
MainActivity mainAct = new MainActivity();
int year_x, month_x, day_x;
static final int DIALOG_ID=0;
public static long dateSelected;
public static Integer intAmount = null;
private boolean isUpdate;
private String id, transname, transamount, transtype, transdate, transcategid;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_new_transaction);
    txtAmount = (EditText)findViewById(R.id.txtAmount);
    txtCashflow = (EditText)findViewById(R.id.txtCashflow);
    txtType = (EditText)findViewById(R.id.txtType);
    RdIncome = (RadioButton)findViewById(R.id.RdBtnIncome);
    RdOutcome = (RadioButton)findViewById(R.id.RdBtnOutcome);

    final Calendar cal = Calendar.getInstance();
    year_x = cal.get(Calendar.YEAR);
    month_x = cal.get(Calendar.MONTH);
    day_x = cal.get(Calendar.DAY_OF_MONTH);
    TextView lblIDate = (TextView)findViewById(R.id.lblDate);

    lblIDate.setText("Date selected : " + year_x + "-" + month_x + "-" + day_x);
    //EditText lbltxt = (EditText)findViewById(R.id.txtType);
    dateSelected = (year_x+month_x+day_x);
    String catSelected = mainAct.getCatSelected();

    //kena null object dsni entah knapa

    showDialogOnClick();
    isUpdate=getIntent().getExtras().getBoolean("update");
    if(isUpdate)
    {
        id=getIntent().getExtras().getString("TransId");
        transname=getIntent().getExtras().getString("TransName");
        transamount=getIntent().getExtras().getString("TransAmount");
        transtype=getIntent().getExtras().getString("TransType");
        transdate=getIntent().getExtras().getString("CategDate");
        transcategid=getIntent().getExtras().getString("CategCategId");
        txtCashflow.setText(transname);
        txtType.setText(transtype);
        txtAmount.setText(transamount);
    }
    if(RdIncome.isChecked()){
        txtType.setText("Income");
    }else{
        txtType.setText("Outcome");
    }
    onButtonClickButtonListener(dateSelected, catSelected);
}

public void showDialogOnClick(){
    //TextView lblIDate = (TextView)findViewById(R.id.lblDate);

    btnIDate = (Button)findViewById(R.id.btnDate);
    btnIDate.setOnClickListener(
            new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    showDialog(DIALOG_ID);
                }
            }
    );
}

@Override
protected Dialog onCreateDialog(int id){
    if (id == DIALOG_ID)
            return  new DatePickerDialog(this, dpickerListener , year_x, month_x, day_x);
    return null;
}

public DatePickerDialog.OnDateSetListener dpickerListener
        = new DatePickerDialog.OnDateSetListener() {
    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
        TextView lblIDate = (TextView)findViewById(R.id.lblDate);
        year_x= year;
        month_x = monthOfYear + 1;
        day_x = dayOfMonth;
        lblIDate.setText("Date selected : " + year_x + "-" + month_x + "-" + day_x);
        Toast.makeText(NewTransaction.this, year_x + "/" + month_x + "/" + day_x, Toast.LENGTH_LONG).show();
        //DateFormat.getDateInstance().format(myDatePicker.getCalendarView().getDate());
    }
};

private void clearText(){
    txtCashflow.clearComposingText();
    txtAmount.clearComposingText();
    txtType.clearComposingText();
}

public void onButtonClickButtonListener(final long dateSelected, final String catSelected){
        btnIAdd = (Button)findViewById(R.id.btnAddTrans);
        btnIAdd.setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        /*if(RdIncome.isChecked()){
                            txtType.setText("Income");
                        }else{
                            txtType.setText("Outcome");
                        }*/
                        if (isUpdate) {
                            //update
                            Toast.makeText(NewTransaction.this, "Clicked", Toast.LENGTH_LONG).show();
                            intAmount = Integer.parseInt(txtAmount.getText().toString());
                            boolean isInserted = dbHelper.updateTransData(id, txtCashflow.getText().toString(),
                                    intAmount, txtType.getText().toString(),
                                    dateSelected, catSelected, null);
                            if (isInserted == true) {
                                Toast.makeText(NewTransaction.this, "Inserted", Toast.LENGTH_LONG).show();
                                clearText();
                                Intent intent = new Intent(
                                        NewTransaction.this,
                                        ViewCashflow.class
                                );
                                startActivity(intent);
                            } else
                                Toast.makeText(NewTransaction.this, "Not Inserted", Toast.LENGTH_LONG).show();
                        } else {
                            //insert
                            Toast.makeText(NewTransaction.this, "Clicked", Toast.LENGTH_LONG).show();
                            intAmount = Integer.parseInt(txtAmount.getText().toString());
                            boolean isInserted = dbHelper.insertTransData(txtCashflow.getText().toString(),
                                    intAmount, txtType.getText().toString(),
                                    dateSelected, catSelected, null);
                            if (isInserted == true) {
                                Toast.makeText(NewTransaction.this, "Inserted", Toast.LENGTH_LONG).show();
                                clearText();
                                Intent intent = new Intent(
                                        NewTransaction.this,
                                        ViewCashflow.class
                                );
                                startActivity(intent);
                            } else
                                Toast.makeText(NewTransaction.this, "Not Inserted", Toast.LENGTH_LONG).show();
                        }
                    }
                });

        btnICancel = (Button)findViewById(R.id.btnCancelTrans);
        btnICancel.setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent intent = new Intent(
                                NewTransaction.this,
                                MainActivity.class
                        );
                        startActivity(intent);
                    }
                }
        );
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_new_transaction_, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}
}

这是我关于 CategorySetting/ViewCategory(另一个与此代码模式配合使用的Activity)的代码:

public class CategorySetting extends Activity {
private SQLiteDatabase db;
private static Button BtnIAddCateg;
private static Button BtnICancelCateg;
private static final String TAG = CategorySetting.class.getSimpleName();
DatabaseHelper dBHelper = new DatabaseHelper (this);
private ListView list;
private ArrayList<String> arrCategId = new ArrayList<String>();
private ArrayList<String> arrCategName = new ArrayList<String>();
private ArrayList<String> arrCategNote = new ArrayList<String>();
private ArrayList<String> arrCategCurr = new ArrayList<String>();
private AlertDialog.Builder build;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_category_setting);
    onButtonClickButtonListener();
    //ListView list = getListView();
    //showListView();
    displayData();
    onLongClickListener();
}

private void displayData() {
    db = dBHelper.getReadableDatabase();
    Cursor mCursor = db.rawQuery("SELECT * FROM " + dBHelper.TABLE_Categ_NAME, null);
    list = (ListView)findViewById(android.R.id.list);
    arrCategId.clear();
    arrCategName.clear();
    arrCategNote.clear();
    arrCategCurr.clear();
    if (mCursor.moveToFirst()) {
        do {
            arrCategId.add(mCursor.getString(mCursor.getColumnIndex(dBHelper.COL1)));
            arrCategName.add(mCursor.getString(mCursor.getColumnIndex(dBHelper.COL2)));
            arrCategNote.add(mCursor.getString(mCursor.getColumnIndex(dBHelper.COL3)));
            arrCategCurr.add(mCursor.getString(mCursor.getColumnIndex(dBHelper.COL4)));
        } while (mCursor.moveToNext());
    }
    DisplayAdapter disadpt = new DisplayAdapter(CategorySetting.this, arrCategId, arrCategName, arrCategId, arrCategCurr);
    list.setAdapter(disadpt);
    mCursor.close();

    list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
            //click to update data
            Intent i = new Intent(getApplicationContext(), AddCategory.class);
            i.putExtra("CategId", arrCategId.get(arg2));
            i.putExtra("CategName", arrCategName.get(arg2));
            i.putExtra("CategNote", arrCategNote.get(arg2));
            i.putExtra("CategCurr", arrCategCurr.get(arg2));
            i.putExtra("update", true);
            startActivity(i);
        }
    });
}

private void onLongClickListener(){
    ListView list = (ListView)findViewById(android.R.id.list);
    list.setOnItemLongClickListener(new OnItemLongClickListener() {

        public boolean onItemLongClick(AdapterView<?> arg0, View arg1, final int arg2, long arg3) {
            build = new AlertDialog.Builder(CategorySetting.this);
            build.setTitle("Delete " + arrCategName.get(arg2));
            build.setMessage("Do you want to delete ?");
            build.setPositiveButton("Yes",new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText( getApplicationContext(),
                            arrCategName.get(arg2) + " is deleted.", Toast.LENGTH_LONG).show();

                    db.delete(
                            dBHelper.TABLE_Categ_NAME, dBHelper.COL1 + "=" + arrCategId.get(arg2), null);
                    displayData();
                    dialog.cancel();
                }
            });

            build.setNegativeButton("No", new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                }
            });
            AlertDialog alert = build.create();
            alert.show();

            return true;
        }
    });
}

    //ListView view = getListView();
    //iew.addHeaderView(getLayoutInflater().inflate(R.layout.trans, null));
    //db = dBHelper.getWritableDatabase();
    //this.muat_ulang();

/*public void reload(){
    try {
        DatabaseHelper dbHelper = new DatabaseHelper(this.getApplicationContext());
        db = dbHelper.getWritableDatabase();
        Cursor c = db.rawQuery("SELECT CategName FROM " + tableName, null);
        if (c != null ) {
            if  (c.moveToFirst()) {
                do {
                    String categName = c.getString(c.getColumnIndex("CategName"));
                }while (c.moveToNext());
            }
        }
    } catch (SQLiteException se ) {
        Log.e(getClass().getSimpleName(), "Could not create or Open the database");
    } finally {
        if (db != null)
            db.execSQL("DELETE FROM " + tableName);
        db.close();
    }
}*/

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_category_setting, menu);
    return true;
}

public void onButtonClickButtonListener(){

    BtnIAddCateg = (Button)findViewById(R.id.btnAddNewCateg);
    BtnIAddCateg.setOnClickListener(
            new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intentAddCateg = new Intent ("com.example.ever_ncn.cashflow.AddCategory");
                    intentAddCateg.putExtra("update", false);
                    startActivity(intentAddCateg);
                    startActivity(intentAddCateg);
                }
            }
    );

    BtnICancelCateg = (Button)findViewById(R.id.btnCancelCateg);
    BtnICancelCateg.setOnClickListener(
            new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(
                            CategorySetting.this,
                            MainActivity.class
                    );
                    startActivity(intent);
                }
            }
    );
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}
}

这是关于AddCategory的内容:

public class AddCategory extends ActionBarActivity {
private static Button BtnIAdd;
private static Button BtnICancel;
EditText txtcategname, txtType;
Spinner selectCurrency;
ArrayAdapter<CharSequence> adapterCurrency;
DatabaseHelper DbHelper = new DatabaseHelper(this);
SQLiteDatabase db;
private boolean isUpdate;
private String id, categname, categnote, categcurr;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_add_category);
    txtcategname = (EditText)findViewById(R.id.editText);
    txtType = (EditText)findViewById(R.id.editText2);
    BtnICancel = (Button)findViewById(R.id.btnCancel);
    BtnIAdd = (Button)findViewById(R.id.btnAdd);

    //spinner
    selectCurrency = (Spinner) findViewById(R.id.spin_selectCurrency);
    adapterCurrency = ArrayAdapter.createFromResource(this, R.array.CurrencyName,android.R.layout.simple_spinner_item );
    adapterCurrency.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    selectCurrency.setAdapter(adapterCurrency);
    selectCurrency.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            Toast.makeText(getBaseContext(), parent.getItemAtPosition(position) + " selected", Toast.LENGTH_LONG).show();
            String currencyValue = String.valueOf(parent.getSelectedItem());
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    });

    isUpdate=getIntent().getExtras().getBoolean("update");
    if(isUpdate)
    {
        id=getIntent().getExtras().getString("CategId");
        categname=getIntent().getExtras().getString("CategName");
        categnote=getIntent().getExtras().getString("CategNote");
        categcurr=getIntent().getExtras().getString("CategCurr");
        txtcategname.setText(categname);
        txtType.setText(categnote);
    }
    addCategData();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_add_category, menu);
    return true;
}

public void addCategData(){
    BtnIAdd.setOnClickListener(
            new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    Toast.makeText(AddCategory.this, "Clicked", Toast.LENGTH_LONG).show();
                    db=DbHelper.getWritableDatabase();
                    ContentValues values=new ContentValues();

                    values.put(DbHelper.COL2,categname );
                    values.put(DbHelper.COL3,categnote );
                    values.put(DbHelper.COL4,categcurr );

                    System.out.println("");
                    if(isUpdate)
                    {
                        //update database with new data
                        boolean isInserted = DbHelper.updateCategData(Integer.parseInt(id), txtcategname.getText().toString(),
                                txtType.getText().toString(), selectCurrency.getSelectedItem().toString(), null);
                        if (isInserted == true) {
                            Toast.makeText(AddCategory.this, "Updated", Toast.LENGTH_LONG).show();
                            //baru sampe dsni
                            Intent intent = new Intent(
                                    AddCategory.this,
                                    CategorySetting.class
                            );
                            startActivity(intent);
                        } else
                            Toast.makeText(AddCategory.this, "Not Inserted", Toast.LENGTH_LONG).show();
                    }
                    else
                    {
                        //insert data into database
                        boolean isInserted = DbHelper.insertCategData(txtcategname.getText().toString(),
                                txtType.getText().toString(), selectCurrency.getSelectedItem().toString(), null);
                        if (isInserted == true) {
                            Toast.makeText(AddCategory.this, "Inserted", Toast.LENGTH_LONG).show();
                            //baru sampe dsni
                            Intent intent = new Intent(
                                    AddCategory.this,
                                    CategorySetting.class
                            );
                            startActivity(intent);
                        } else
                            Toast.makeText(AddCategory.this, "Not Inserted", Toast.LENGTH_LONG).show();
                    }
                    //close database
                    db.close();
                    finish();
                }
            }
    );
    BtnICancel.setOnClickListener(
            new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    finish();
                }
            }
    );
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}
}
3个回答

14
这是因为当您直接启动第二个活动“NewTransaction”时,没有在“意图”中放置“extras”,因此当您调用“getIntent()。getExtras();”时,它返回一个“null”对象,这就是为什么“getIntent()。getExtras()。getBoolean(“update”);”会抛出NPE的原因。
解决方法:在获取数据之前尝试检查“getIntent()。getExtras()!= null”,这将修复您的问题。
Bundle bundle= getIntent().getExtras();
    if (bundle!= null) {// to avoid the NullPointerException
        isUpdate=bundle.getBoolean("update");
        if(isUpdate)
        {
           id=bundle.getString("TransId");
           transname=bundle.getString("TransName");
           transamount=bundle.getString("TransAmount");
           transtype=bundle.getString("TransType");
           transdate=bundle.getString("CategDate");
           transcategid=bundle.getString("CategCategId");
           txtCashflow.setText(transname);
           txtType.setText(transtype);
           txtAmount.setText(transamount);
       }
    }

是的先生,这让我的代码运行良好。谢谢您。 但我仍然困惑为什么我的另一个活动(添加类别和类别设置)没有出现此错误。 - iWayan
CategorySetting 中,我找不到您调用 getIntent().getExtras() 的地方。对于 AddCategory,请检查您启动此活动的位置,我注意到您总是将“update”布尔值添加为额外内容,因此您永远不会发生 NPE。 - Rami

0

如果它在片段中,你可以使用:

if (getArguments() != null) {

          loginBody = getArguments().getParcelable(getActivity().getResources().getString(R.string.logInBodyParcelData));
    }
   /* } catch (Exception e) {
        e.printStackTrace();
    }*/
    if (loginBody != null) {
        setProfile();

    }

0
在你的ViewCashFlow类中尝试这个:
Intent i = new Intent(Context.getApplicationContext(), NewTransaction.class);

1
我已经尝试了这个,但在Gradle中出现了一些错误,它提示说"非静态方法getApplicationContext()无法从静态上下文引用",这是什么意思呢?我不明白导致错误的原因是什么。 - iWayan
1
我自己也是新手安卓开发者,我猜我们都会找到答案的! - MusaddiqAkhtar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接