마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

앱을 실행하면 강제종료가 발생합니다.

0 추천
import ...

public class NewLoginActivity extends AppCompatActivity {

    private EditText email_edt, pass_edt;
    private LinearLayout login_btn,account_btn;

    private FirebaseAuth firebaseAuth;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_new_login);

        //editText
        email_edt = findViewById(R.id.email_edit);
        pass_edt = findViewById(R.id.password_edit);

        //button
        login_btn = findViewById(R.id.login_Linear_btn);
        account_btn = findViewById(R.id.account_Linear_btn);

        firebaseAuth = FirebaseAuth.getInstance();

        login_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String email = email_edt.getText().toString();
                String password = pass_edt.getText().toString();

                joinLogin(email, password);
            }
        });

        //회원 가입
        account_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(NewLoginActivity.this, NewRegisterActivity.class);
                startActivity(intent);
                finish();
            }
        });
    }

    private void joinLogin(String email, String password) {

        firebaseAuth.createUserWithEmailAndPassword(email, password)
                .addOnCompleteListener(NewLoginActivity.this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {

                        if (task.isSuccessful()) {
                            Intent intent = new Intent(NewLoginActivity.this, CompleteActivity.class);
                            startActivity(intent);
                            finish();
                        } else {
                            Toast.makeText(NewLoginActivity.this, "log failed", Toast.LENGTH_SHORT).show();
                            return;
                        }
                    }
                });
    }
}

    private EditText id_edt_acc, pass_edt_acc, name_edt_acc;
   

        account_complete_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                email = id_edt_acc.getText().toString();
                password = pass_edt_acc.getText().toString();
                name = name_edt_acc.getText().toString();
                if(isValidEamil()&&isValidPasswd())
                createUser(email, password);
                // sendData(email,password,name);
            }
        });
    }

}

로그인이나, 회원가입을 눌렀을때 강제 종료가 발생합니다.

두번째가 회원가입인데 logcat에서  account_complete_btn.setOnClickListener(new View.OnClickListener() {

부분에서 문제가 발생했다고하는데  일단 lineratlayout을 사용했습니다.
준톨이짱짱 (440 포인트) 님이 2020년 3월 12일 질문
준톨이짱짱님이 2020년 3월 12일 수정

1개의 답변

0 추천

 account_complete_btn, id_edt_acc, pass_edt_acc, name_edt_acc 는  findViewById 로 할당하는 코드가 빠진  듯 한데, account_complete_btn 는 할당 하셨어야 버튼 누르는 화면이라도 뜰테니.. 소스코드가 많이 빠진 듯 합니다. 

id_edt_acc, pass_edt_acc, name_edt_acc  할당이 안되 NullPointerException이 발생 했는지 보시고 

그게 아니라면, 해당 부분의  풀 소스나 logcat을 올려 주세요.. 

 

익명사용자 님이 2020년 3월 12일 답변
2020-03-12 20:28:23.988 2192-2192/? E/Zygote: isWhitelistProcess - Process is Whitelisted
2020-03-12 20:28:23.989 2192-2192/? E/Zygote: accessInfo : 1
2020-03-12 20:28:24.025 2192-2200/? E/tware.firebase: Failed to send DDMS packet REAQ to debugger (-1 of 20): Broken pipe
2020-03-12 20:28:25.393 2192-2192/com.hanseo_software.firebase2 E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.hanseo_software.firebase2, PID: 2192
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.hanseo_software.firebase2/com.hanseo_software.firebase2.NewRegisterActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.LinearLayout.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3113)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3256)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1947)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7037)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.LinearLayout.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
        at com.hanseo_software.firebase2.NewRegisterActivity.onCreate(NewRegisterActivity.java:78)
        at android.app.Activity.performCreate(Activity.java:7327)
        at android.app.Activity.performCreate(Activity.java:7318)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3093)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3256) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1947) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:7037) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965) 
package com.hanseo_software.firebase2;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Patterns;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.theartofdev.edmodo.cropper.CropImage;
import com.theartofdev.edmodo.cropper.CropImageView;

import java.util.regex.Pattern;

import de.hdodenhof.circleimageview.CircleImageView;

public class NewRegisterActivity extends AppCompatActivity {

    private EditText id_edt_acc, pass_edt_acc, name_edt_acc;
    private Button overlap_check_btn;
    private LinearLayout account_complete_btn,cancel_btn;
    private CircleImageView circleImageView;
    private Uri resultUri;

    private String email = "";
    private String password = "";
    private String name = "";

    private FirebaseAuth firebaseAuth;

    // 비밀번호 정규식
    private static final Pattern PASSWORD_PATTERN = Pattern.compile("^[a-zA-Z0-9!@.#$%^&*?_~]{4,16}$");
    /*
        private FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance(); //firebaseDatabase를 사용하기위한 instanec가져오기
        private DatabaseReference databaseReference = firebaseDatabase.getReference();
    */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_new_register);

        //circleImage
        circleImageView = findViewById(R.id.circleImageView);

        //Edit Text
        id_edt_acc = findViewById(R.id.email_edit_acc);
        pass_edt_acc = findViewById(R.id.pass_edit_acc);
        name_edt_acc = findViewById(R.id.name_edit_acc);

        //Button
        overlap_check_btn = findViewById(R.id.overlap_check_btn);
        account_complete_btn = findViewById(R.id.account_Linear_btn);
        cancel_btn = findViewById(R.id.cancel_Linear_acc);

        firebaseAuth = FirebaseAuth.getInstance();


        cancel_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent1 = new Intent(NewRegisterActivity.this, NewLoginActivity.class);
                startActivity(intent1);
                finish();
            }
        });

        account_complete_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                email = id_edt_acc.getText().toString();
                password = pass_edt_acc.getText().toString();
                name = name_edt_acc.getText().toString();
                if(isValidEamil()&&isValidPasswd())
                    createUser(email, password);
                // sendData(email,password,name);
            }
        });
    }

    private boolean isValidPasswd() {
        if (email.isEmpty())
        {
            Toast.makeText(getApplicationContext(),"이메일이 비어 있습니다.",Toast.LENGTH_SHORT).show();
            return false;
        }
        else if(!Patterns.EMAIL_ADDRESS.matcher(email).matches())
        {
            Toast.makeText(getApplicationContext(),"이메일 형식이 아닙니다.",Toast.LENGTH_SHORT).show();
            return false;
        }
        else{
            return true;
        }
    }

    private boolean isValidEamil() {
        if (password.isEmpty())
        {
            Toast.makeText(getApplicationContext(),"비밀번호가 비어 있습니다.",Toast.LENGTH_SHORT).show();
            return false;
        }
        else if(!PASSWORD_PATTERN.matcher(password).matches())
        {
            Toast.makeText(getApplicationContext(),"비밀번호가 형식이 아닙니다.",Toast.LENGTH_SHORT).show();
            return false;
        }
        else{
            return true;
        }
    }

    private void createUser(String email, String password) {
        firebaseAuth.createUserWithEmailAndPassword(email, password)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful()) {
                            // 회원가입 성공
                            Toast.makeText(getApplicationContext(),"회원가입이 완료되었습니다.",Toast.LENGTH_LONG).show();
                            Intent intent = new Intent(NewRegisterActivity.this,NewLoginActivity.class);
                            startActivity(intent);
                            finish();

                        } else {
                            // 회원가입 실패
                            Toast.makeText(getApplicationContext(),"회원가입 실패 하였습니다.재시도 바랍니다.",Toast.LENGTH_LONG).show();
                        }
                    }
                });


    }
/*
    private void sendData(String email, String password, String name) {
        if(resultUri!=null)
        {
            Data data = new Data(email,password,name,resultUri);
            databaseReference.child("user").push().setValue(data);
        }


    }*/

    //이미지 선택
    public void selectImage(View v) {
        Intent i = new Intent();
        i.setAction(Intent.ACTION_GET_CONTENT);
        i.setType("image/*");
        startActivityForResult(i,12);
    }

    //갤러리에서 이미지 불러오기
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == 12 && resultCode == RESULT_OK && data != null && data.getData() !=null) {
            CropImage.activity()
                    .setGuidelines(CropImageView.Guidelines.ON)
                    .setAspectRatio(1,1)
                    .start(this);
        }

        if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE) {
            CropImage.ActivityResult result = CropImage.getActivityResult(data);
            if (resultCode == RESULT_OK) {

                resultUri = result.getUri();
                circleImageView.setImageURI(resultUri);

            } else if (resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE) {
                Exception error = result.getError();
            }
        }

    }
}
로그캣에 나오듯 앱 실행 시 NewRegisterActivity.java 파일의 78라인에서
 NullPointerException 이 발생 했습니다.

account_complete_btn 이 null인 것으로 생각되니, activity_new_register.xml에 정의 된 account_complete_btn 의 id가 account_Linear_btn 가 맞는지 부터 확인 해 보셔야 할 듯 합니다. 왠지 account_complete_btn 이실듯...ㅎㅎ
정말 감사합니다. 덕분에 해결됐어요
...