从第一个 activity 到第二个 return 按钮会使应用程序崩溃

return button from the first activity to the second crashes the app

好的,这就是我的问题,我有两个活动,都用于输入信息。一个导致另一个。 当我从第二个 activity 按下 return 按钮时,应用程序崩溃了,我不知道为什么..

这是第一个activity的代码:

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.support.design.widget.Snackbar;

public class Add_Score extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add__score);
        final Button Next = (Button)findViewById(R.id.buttonNext);
        final Intent Add_Comment_Picture = new Intent(this, Add_Comment_Picture.class);

        Next.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                String score = ((EditText) findViewById(R.id.editText)).getText().toString();
                String desc = ((EditText)findViewById(R.id.editTextDesc)).getText().toString();
                if(score.compareTo("") != 0 && desc.compareTo("") != 0){
                    startActivity(Add_Comment_Picture);
                    Add_Comment_Picture.putExtra("score", score);
                    Add_Comment_Picture.putExtra("desc" , desc );
                    startActivity(Add_Comment_Picture);
                }
                else{
                    Snackbar.make(v , "Please fill in the score and description" , Snackbar.LENGTH_LONG).show();
                }
            }
        });
    }
}

这是第二个的代码activity:

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Build;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;

import org.w3c.dom.Text;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

public class Add_Comment_Picture extends AppCompatActivity {
    static final int CAM_REQUEST = 1;
    static final int RESULT_LOAD_IMAGE = 2;
    ImageView imageView;
    ImageButton button;
    ImageButton buttonGallery;
    String mCurrentPhotoPath;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add__comment__picture);
        button = (ImageButton) findViewById(R.id.imageButtonCamera);
        imageView = (ImageView) findViewById(R.id.imageView);
        buttonGallery = (ImageButton) findViewById(R.id.imageButtonGallery_f);


        Calendar c = Calendar.getInstance();

        String hours = Globals.getTimePadding(c.get(Calendar.HOUR));
        String minutes = Globals.getTimePadding(c.get(Calendar.MINUTE));
        String time = hours + ":" + minutes;
        String value = getIntent().getExtras().getString("score");
        String value2 = getIntent().getExtras().getString("desc");
        TextView scoreText = (TextView) findViewById(R.id.textViewScore);
        scoreText.setText("Score: " + value);
        TextView t = (TextView) findViewById(R.id.textViewDatec);
        t.setText(time);
        TextView descText = (TextView) findViewById(R.id.textViewDesc);
        descText.setText(value2);


        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Intent camera_intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                File file = getFile();
                camera_intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
                startActivityForResult(camera_intent, CAM_REQUEST);
            }
        });

        buttonGallery.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Intent intent_gallery = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                startActivityForResult(intent_gallery , RESULT_LOAD_IMAGE);
            }
        });

    }



    private String createFileName(){
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        return "JPEG_" + timeStamp + "_.jpg";
    }

    @Override
    protected void onStart() {
        super.onStart();

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

            int hasWritePermission = checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);
            int hasReadPermission = checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE);
            int hasCameraPermission = checkSelfPermission(Manifest.permission.CAMERA);

            List<String> permissions = new ArrayList<String>();
            if (hasWritePermission != PackageManager.PERMISSION_GRANTED) {
                permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
            }

            if (hasReadPermission != PackageManager.PERMISSION_GRANTED) {
                permissions.add(Manifest.permission.READ_EXTERNAL_STORAGE);
            }

            if (hasCameraPermission != PackageManager.PERMISSION_GRANTED) {
                permissions.add(Manifest.permission.CAMERA);
            }
            if (!permissions.isEmpty()) {
                requestPermissions(permissions.toArray(new String[permissions.size()]), 111);
            }
        }


    }

    private File getFile() {
        File folder = new File("sdcard/data/data/com.yuvaleliav1gmail.foodchain/photos");
        if (!folder.exists()) {
            folder.mkdir();
        }

        mCurrentPhotoPath = createFileName();
        File image_file = new File(folder,mCurrentPhotoPath);
        return image_file;
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(requestCode == CAM_REQUEST){
            copyFile("sdcard/data/data/com.yuvaleliav1gmail.foodchain/photos/" + mCurrentPhotoPath , getFilesDir().toString() + "/" + mCurrentPhotoPath);
            File d = new File("sdcard/data/data/com.yuvaleliav1gmail.foodchain/photos/" + mCurrentPhotoPath);
            d.delete();
            imageView.setImageDrawable(Drawable.createFromPath(getFilesDir().toString() + "/" + mCurrentPhotoPath));
        }
        if(requestCode == RESULT_LOAD_IMAGE){
            if(data != null){
                Uri selectedImage = data.getData();
                String[] filePathColumn = { MediaStore.Images.Media.DATA };
                Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
                cursor.moveToFirst();
                int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
                String picturePath = cursor.getString(columnIndex);
                cursor.close();
                mCurrentPhotoPath = createFileName();
                copyFile(picturePath, getFilesDir().toString() + "/" + mCurrentPhotoPath);
                imageView.setImageDrawable(Drawable.createFromPath(getFilesDir().toString() + "/" + mCurrentPhotoPath));
            }
        }

        super.onActivityResult(requestCode, resultCode, data);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case 111: {
                for (int i = 0; i < permissions.length; i++) {
                    if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                        System.out.println("Permissions --> " + "Permission Granted: " + permissions[i]);


                    } else if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
                        System.out.println("Permissions --> " + "Permission Denied: " + permissions[i]);

                    }
                }
            }
            break;
            default: {
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            }
        }
    }

    public void copyFile(String path1 , String path2){
        InputStream inStream = null;
        OutputStream outStream = null;
        try{

            File file1 =new File(path1);
            File file2 =new File(path2);

            inStream = new FileInputStream(file1);
            outStream = new FileOutputStream(file2); // for override file content
            //outStream = new FileOutputStream(file2,<strong>true</strong>); // for append file content

            byte[] buffer = new byte[1024];

            int length;
            while ((length = inStream.read(buffer)) > 0){
                outStream.write(buffer, 0, length);
            }

            if (inStream != null)inStream.close();
            if (outStream != null)outStream.close();

            System.out.println("File Copied..");
        }catch(IOException e){
            e.printStackTrace();
        }
    }
}

这是logcat暗恋发生的时候:

05-22 12:46:50.361 8312-8312/com.yuvaleliav1gmail.foodchain E/AndroidRuntime: FATAL EXCEPTION: main
                                                                              Process: com.yuvaleliav1gmail.foodchain, PID: 8312
                                                                              java.lang.RuntimeException: Unable to start activity ComponentInfo{com.yuvaleliav1gmail.foodchain/com.yuvaleliav1gmail.foodchain.Add_Comment_Picture}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference
                                                                                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3253)
                                                                                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349)
                                                                                  at android.app.ActivityThread.access00(ActivityThread.java:221)
                                                                                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
                                                                                  at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                  at android.os.Looper.loop(Looper.java:158)
                                                                                  at android.app.ActivityThread.main(ActivityThread.java:7224)
                                                                                  at java.lang.reflect.Method.invoke(Native Method)
                                                                                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                                                                                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
                                                                               Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference
                                                                                  at com.yuvaleliav1gmail.foodchain.Add_Comment_Picture.onCreate(Add_Comment_Picture.java:56)
                                                                                  at android.app.Activity.performCreate(Activity.java:6876)
                                                                                  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1135)
                                                                                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3206)
                                                                                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349) 
                                                                                  at android.app.ActivityThread.access00(ActivityThread.java:221) 
                                                                                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794) 
                                                                                  at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                                  at android.os.Looper.loop(Looper.java:158) 
                                                                                  at android.app.ActivityThread.main(ActivityThread.java:7224) 
                                                                                  at java.lang.reflect.Method.invoke(Native Method) 
                                                                                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                                                                                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

您正在调用 startActivity 两次,一次在添加额外内容之前,一次在添加额外内容之后。

startActivity(Add_Comment_Picture);
Add_Comment_Picture.putExtra("score", score);
Add_Comment_Picture.putExtra("desc" , desc );
startActivity(Add_Comment_Picture);

这样您实际上是在 activity 之前 您实际上是在 Intent 中添加额外内容。只需删除第一个电话并保持这样:

Add_Comment_Picture.putExtra("score", score);
Add_Comment_Picture.putExtra("desc" , desc );
startActivity(Add_Comment_Picture);

This is just a piece of advice: It's a general convention to name your variables with a lowercase letter and use camel case ( instead of Add_Comment_Picture, you'd call it addCommentPictureIntent). Also concatenating at the end the type it represents is a good way to differentiate the variable when there are many of them. You can read more about conventions online, but they're useful to follow and make the code more readable.

它是 NPE 所以我建议看一次 what-is-a-null-pointer-exception-and-how-do-i-fix-it 以便更好地理解 NPE

在你的情况下 bundlenull 这意味着你正试图从 null 对象访问 String。所以在访问之前检查 getIntent().getExtras() 是否是 null 总是更好的习惯,以防止像

这样的崩溃
if(getIntent().getExtras() !=null){
    String value = getIntent().getExtras().getString("score");
    String value2 = getIntent().getExtras().getString("desc");
    ... 
}

为了预先检查特定的密钥,你可以这样做,

Bundle extras = getIntent().getExtras();
if(extras != null){
     if (extras.containsKey("score") && extras.containsKey("desc")){
        String value = getIntent().getExtras().getString("score");
        String value2 = getIntent().getExtras().getString("desc");
         ...
       }
  }

使用下面的代码(你的问题是你在添加额外内容之前开始 activity):

public class Add_Score extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_add__score);
    final Button Next = (Button)findViewById(R.id.buttonNext);
    final Intent Add_Comment_Picture = new Intent(this, Add_Comment_Picture.class);

    Next.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            String score = ((EditText) findViewById(R.id.editText)).getText().toString();
            String desc = ((EditText)findViewById(R.id.editTextDesc)).getText().toString();
            if(score.compareTo("") != 0 && desc.compareTo("") != 0){
                // startActivity(Add_Comment_Picture);
                Add_Comment_Picture.putExtra("score", score);
                Add_Comment_Picture.putExtra("desc" , desc );
                startActivity(Add_Comment_Picture);
            }
            else{
                Snackbar.make(v , "Please fill in the score and description" , Snackbar.LENGTH_LONG).show();
            }
        }
    });
}
}