2017-02-15 2 views
0

저는 초보자이지만 자바를 연습하려고합니다.이 문제가 발생했습니다. 사용자가 기부금을 입력하고 버튼을 누르면 기부액이 증가합니다. 필자는 전체 코드를 작성했지만 버튼을 클릭하여 기부 수에 추가하면 앱이 다운됩니다. 필자는 선생님의 모든 가르침을 따랐습니다. 나는 액티비티에서 메소드를 생성한다. UI 빌더에서 나는 click 속성의 버튼으로 가서 그 메소드로 설정한다. 부드럽게 진행되어야하지만 버튼을 클릭 할 때마다 충돌이 발생합니다. 이것은 onClick 속성을 computeDonation으로 설정 한 필자의 활동입니다. 버튼을 클릭하면 Android Studio 앱이 계속 깨집니다.

public void computeDonation(View v){ 

    String addedText = ((EditText)findViewById(R.id.AmountText)).getText().toString(); 

DonationModel donation = new DonationModel(addedText); 
String answer = donation.calcDonation(); 

((TextView)findViewById(R.id.totalText)).setText(answer);} 

모델이다 : 필자도이 다시 활동을 전송하면 바로 볼 수있는 숫자 형식없이 시도

String textAdded; 
double addedDonation; 

public DonationModel(String y){ 
    textAdded = y; 
} 

public String calcDonation(){ 
    double counter = Double.parseDouble(textAdded); 
    addedDonation += counter; 

    Locale locale = new Locale("en", "CA"); 
    NumberFormat fmt = NumberFormat.getCurrencyInstance(locale); 

    return fmt.format(addedDonation); 

} 

하지만 그렇지 않습니다. BTW for my class 나는 안드로이드 스튜디오의 이전 버전을 사용하고 있습니다. 02-15 17 : 12 :

는 로그 캣 인 28.797 21619-21619/ca.roumani.donations E/AndroidRuntime : FATAL EXCEPTION : 메인 공정 : ca.roumani.donations, PID : 21,619 자바. lang.IllegalStateException : android.support.v7.app.AppCompatViewInflater $ onl (AppCompatViewInflater.java:293) 의 메소드를 실행할 수 없습니다. android.view.View.performClick (View.java:5197)의 android.os.Handler.handleCallback (Handler.java:739)에 에서 android.view.View $ PerformClick.run (보기 .java : 20909) android.os.Handler.dispatchMessage (Handler.java:95)에서 android.os.Looper.loop (Looper.java:145)에서 에서 android.app.ActivityThread.main (ActivityThread.java:5942) 에서 자바 .lang.reflect.Method.invoke (네이티브 메소드) at java.lang.reflect.Method.invoke (Method.java:372) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java : 1399) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1194) 에 의해 발생 : java.lang.reflect.InvocationTargetException at java.lang.reflect.Method.invoke (기본 메소드) at java.lang.reflect.Method.in voke (Method.java:372) android.support.v7.app.AppCompatViewInflater $ DeclaredOnClickListener.onClick (AppCompatViewInflater.java:288) at android.view.View.performClick (View.java:5197) at android. view.View $ PerformClick.run (View.java:20909) (android.os.Handler.handleCallback (Handler.java:739) at android.os.Handler.dispatchMessage (Handler.java:95) at android. os.Looper.loop (Looper.java:145) android.app.ActivityThread.main (ActivityThread.java:5942) at java.lang.reflect.Method.invoke (기본 메소드) 에서 java.lang.reflect .Modod.invok e (Method.java:372) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1399) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1194) 에 의해 발생 : java.lang.NumberFormatException : 유효하지 않은 double : "" at java.lang.StringToReal.invalidReal (StringToReal.java:63) at java.lang.StringToReal.parseDouble (StringToReal.java:267) at java .lang.Double.parseDouble (Double.java:301) at ca.roumani.donations.DonationModel.calcDonation (DonationModel.java:20) at ca.roumani.donations.DonationActivity.computeDonation (DonationActivity.java:24) at java. lang.reflect.Method.invoke (네이티브 메소드) at java.lang.reflect.Method.invoke (Method.java:372) android.support.v7.app.AppCompatViewInflater $ DeclaredOnClickListener.onClick (AppCompatViewInflater.java:288)) android.view.View.performClick (View.java:5197) at android.view.View $ PerformClick.run (View.java:20909) at android.os.Handler.handleCallback (Handler.java:739)) android.os.Handler.dispatchMessage (Handler.java:95) at android.os.Looper.loop (Looper.java:145) android.app.ActivityThread.main (ActivityThread.java:5942) at에 있습니다. java.lang.reflect.Method.invoke (네이티브 메소드) at java.lang.reflect.Method.invoke (Method.java:372) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java : 1399) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1194)

+0

나는'NullPointerException'을 가지고있을 것입니다. logcat을 게시하십시오. –

+0

모두 빨간색으로 표시된 logcat을 복사하여 붙여 넣습니다. – Chris

+0

로켈 로캘 = 새로운 로케일 ("en_CA") – LSA

답변

4

textAdded는 NumberFormatException을 발생시키고 응용 프로그램을 충돌시키는 빈 문자열입니다. 사용자가 글고보기에 값을 입력하기 전에 호출되는 방법을

public String calcDonation() { 
    if (TextUtils.isEmpty(textAdded)) { 
     //textAdded is empty, so just return an empty String 
     return ""; 
    } 
    //We're sure that textAdded has a value, so we can try to parse it 
    double counter = Double.parseDouble(textAdded); 
    addedDonation += counter; 

    Locale locale = new Locale("en", "CA"); 
    NumberFormat fmt = NumberFormat.getCurrencyInstance(locale); 

    return fmt.format(addedDonation); 
} 

을하거나 방지 : 당신이 이것을 방지하기 위해 할 수있는 것은, 당신의 textAdded가 비어 있지 않은 경우를 분석하기 전에 확인하는 것입니다

public void computeDonation(View v){ 
    String addedText = ((EditText)findViewById(R.id.AmountText)).getText().toString(); 
    if (TextUtils.isEmpty(textAdded)) { 
     Toast.makeText(context, "Please enter a valid number", Toast.LENGTH_SHORT).show(); 
    } else { 
     DonationModel donation = new DonationModel(addedText); 
     String answer = donation.calcDonation(); 
     ((TextView)findViewById(R.id.totalText)).setText(answer); 
    } 
} 
1

빈 문자열을 이중으로 구문 분석하려고하면 문제가 발생합니다. 계산을 수행하기 전에 사용자가 유효한 데이터를 입력했는지 확인해야합니다. 이렇게하는 데 도움이되는 한 가지 방법은 계산을 문자열 전달 및 서식 지정과 분리하는 것입니다. 숫자 데이터 만 처리하도록 calcDonation()을 수정하는 것이 좋습니다. 또 다른 방법은 숫자를 문자열로 변환하거나 문자열에서 변환하는 것에 대해 걱정할 수 있습니다. 이렇게하면 사용자 입력의 유효성을 검사하고 필요할 때 적절한 오류 메시지를 표시 할 수 있습니다.

2

double addedDonation;이 초기화 된 곳이 보이지 않으므로 변수에 값이없는 경우 +=을 사용할 수 없습니다.

관련 문제