簡體   English   中英

如何解決錯誤:很遺憾 <my app> 已經停止

[英]How to solve the error : Unfortunately <my app> has stopped

我是Android編程的新手。 我正在制作的第一個應用程序遇到一些問題。 每次我運行該應用程序時,都會在我的手機(用於測試和調試應用程序)上彈出一條消息,提示“不幸的是,MyNewApp3已停止”。 此錯誤甚至都無法打開我的應用。 我該如何解決這個問題?

這是我的代碼:

package newapp.com.bipl.mynewapp3;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;

public class Page2 extends AppCompatActivity {

RadioGroup Rg;
RadioButton B;
RadioButton O;
RadioButton H;
EditText Dec;
TextView Ans;
int Num;
String Result;
int b;
int c;
char z;
String s;
String d;


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

    Toast.makeText(getBaseContext(),"Successful Login",Toast.LENGTH_LONG).show();

    Rg = (RadioGroup) findViewById(R.id.RGroup);
    B = (RadioButton) findViewById(R.id.Binary_rb);
    O = (RadioButton) findViewById(R.id.Octal_rb);
    H = (RadioButton) findViewById(R.id.Hexa_rb);
    Dec = (EditText) findViewById(R.id.NumEntry_txt);
    Ans = (TextView) findViewById(R.id.Answer_lbl);
    Num = Integer.parseInt(Dec.getText().toString());
    //Num = 161;
    if(B.isSelected())
        Binary(Num);
    if(O.isSelected())
        Octal(Num);
    if (H.isSelected())
        Hexal(Num);

}

/* public void Conversion(){
    if(B.isSelected())
        Binary(Num);
    if(O.isSelected())
        Octal(Num);
    if (H.isSelected())
        Hexal(Num);
}*/

public void Binary(int a){

    while(b > 0){
        c = a % 2;
        b = a/2;
        d = "" + c;
        s = d.concat(s);
        a = b;
    }
    Result = s;
    Toast.makeText(getBaseContext(), "" + Result, Toast.LENGTH_SHORT).show();
    Ans.setText("" + Result);

}

public void Octal(int a){

    while(b > 0){
        c = a % 8;
        b = a/8;
        d = "" + c;
        s = d.concat(s);
        a = b;
    }
    Result = s;
    Toast.makeText(getBaseContext(), "" + Result, Toast.LENGTH_SHORT).show();
    Ans.setText("" + Result);

}

public void Hexal(int a){

    while(b > 0){
        c = a % 16;
        b = a/16;

        if(c>9){
            switch (c){
                case 10 : z = 'A';
                          break;
                case 11 : z = 'B';
                          break;
                case 12 : z = 'C';
                          break;
                case 13 : z = 'D';
                          break;
                case 14 : z = 'E';
                          break;
                case 15 : z = 'F';
                          break;
            }

            d = "" + z;

        }
        else
            d = "" + c;

        s = d.concat(s);
        a = b;
    }

    Result = s;
    Toast.makeText(getBaseContext(), "" + Result, Toast.LENGTH_SHORT).show();
    Ans.setText("" + Result);


  }
}

我的LogCat輸出(在看到人們建議其他人放置Logcat輸出之后,我發布了此內容;我不知道它的用途):

01-12 11:45:52.559 15441-15441 / newapp.com.bipl.mynewapp3 V / TextView:stopSelectionActionMode()01-12 11:45:52.572 15441-15441 / newapp.com.bipl.mynewapp3 D / AndroidRuntime:Shutting VM 01-12 11:45:52.573 15441-15441 / newapp.com.bipl.mynewapp3 E / AndroidRuntime:致命例外:主進程:newapp.com.bipl.mynewapp3,PID:15441 java.lang.RuntimeException:無法開始活動ComponentInfo {newapp.com.bipl.mynewapp3 / newapp.com.bipl.mynewapp3.Page2}:java.lang.NumberFormatException:無效的int:“”位於android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2521) android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1470)上的android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2595)在android.app.ActivityThread.access $ 800(ActivityThread.java:178)在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1470)在android。 os.Handler.dispatchMessage(Handler.java:111)位於android.os.Looper.loop(Looper.java:194)位於android.app.ActivityThread.main(ActivityThread.java:5631)在java.lang.reflect.Method .invoke(Nativ e方法),位於com.android.internal.os處com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:959)處的java.lang.reflect.Method.invoke(Method.java:372)。 ZygoteInit.main(ZygoteInit.java:754)原因:java.lang.NumberFormatException:無效的int:“”,位於java.lang.Integer.invalidInt(Integer.java:138),位於java.lang.Integer.parseInt(Integer。 java:358)at java.lang.Integer.parseInt(Integer.java:334)at newapp.com.bipl.mynewapp3.Page2.onCreate(Page2.java:41)at android.app.Activity.performCreate(Activity.java :6092)在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1112)在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2468)在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2595)在android android.os.Handler.dispatchMessage(Handler.java:111)上的.app.ActivityThread.access $ 800(ActivityThread.java:178)在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1470)在android.os .Looper.loop(Looper.jav a:194),位於android.app.ActivityThread.main(ActivityThread.java:5631),位於java.lang.reflect.Method.invoke(本機方法),位於java.lang.reflect.Method.invoke(Method.java:372)在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:959)處com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)01-12 11:50:52.616 15441- 15441 / newapp.com.bipl.mynewapp3 I / Process:正在發送信號。 PID:15441 SIG:9

每次顯示或使用任何變量進行轉換時,您都必須檢查null,這是因為您沒有檢查字符串是否為null,在您的情況下為null。 所以執行

if(Dec != null){
    if(Dec.getText() != null){
        Num = Integer.parseInt(Dec.getText().toString());
    }
}

它應該工作正常!

聲明並為“ Num”變量分配零,如下所示

int Num = 0;

然后首先以字符串格式獲取您的EditText值,然后解析

String mynum = Dec.getText().toString();
Num = Integer.parseInt(mynum);

在這里,您可以檢查myNum是否為null。

您可以添加try-catch將String轉換為int。 如果它得到無法轉換的空字符串之類的信息,則不會崩潰。

try
{
    if(str != null){
      Num = Integer.parseInt(Dec.getText().toString());
    }
    else{
      Num = 0;
    }
}
catch (NumberFormatException e)
{
    Num = 0;
}

該實現將停止因任何錯誤的輸入轉換而崩潰。

當在onCreate()方法中初始化EditText時,沒有輸入任何內容,因此Dec.getText().toString"" ,當然,您無法調用Integer.parseInt("")從而得到NumberFormatException

因此,您應該在parseInt()之前添加檢查

if (!"".equal(Dec.getText().toString)){
    Num = Integer.parseInt(Dec.getText().toString());
}

問題是,您嘗試在應用啟動后立即使用parse Int將空字符串轉換為整數。 有關更多信息,請參見此stackoverflow帖子 因此,您只需檢查editText是否返回空字符串,或者也可以嘗試捕獲異常。

logcat也是非常有用的,它可以幫助您確定導致問題的代碼的哪一部分。 檢查logcat-

Caused by: java.lang.NumberFormatException: Invalid int: ""
                                                                           at java.lang.Integer.invalidInt(Integer.java:138)
                                                                           at java.lang.Integer.parseInt(Integer.java:358)
                                                                           at java.lang.Integer.parseInt(Integer.java:334)
                                                                           at newapp.com.bipl.mynewapp3.Page2.onCreate(Page2.java:41)

它清楚地告訴您parseInt方法引發異常,然后單擊下面一行中的41,甚至將您帶到那段代碼。

newapp.com.bipl.mynewapp3.Page2.onCreate(Page2.java:41)

試試這個代碼-

package newapp.com.bipl.mynewapp3;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;

public class Page2 extends AppCompatActivity {

RadioGroup Rg;
RadioButton B;
RadioButton O;
RadioButton H;
EditText Dec;
TextView Ans;
int Num;
String Result;
int b;
int c;
char z;
String s;
String d;


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

    Toast.makeText(getBaseContext(),"Successful Login",Toast.LENGTH_LONG).show();

    Rg = (RadioGroup) findViewById(R.id.RGroup);
    B = (RadioButton) findViewById(R.id.Binary_rb);
    O = (RadioButton) findViewById(R.id.Octal_rb);
    H = (RadioButton) findViewById(R.id.Hexa_rb);
    Dec = (EditText) findViewById(R.id.NumEntry_txt);
    Ans = (TextView) findViewById(R.id.Answer_lbl);

    //Num = 161;

if ("".equals(Dec.getText().toString()))
 {   if(B.isSelected() || O.isSelected() || H.isSelected())
       Ans.setText("Empty field");     }
else{if(B.isSelected())
            Binary(Num);
        if(O.isSelected())
            Octal(Num);
        if (H.isSelected())
            Hexal(Num);}


    }

/* public void Conversion(){
    if(B.isSelected())
        Binary(Num);
    if(O.isSelected())
        Octal(Num);
    if (H.isSelected())
        Hexal(Num);
}*/

public void Binary(int a){
    Num = Integer.parseInt(Dec.getText().toString());    
    while(b > 0){
        c = a % 2;
        b = a/2;
        d = "" + c;
        s = d.concat(s);
        a = b;
    }
    Result = s;
    Toast.makeText(getBaseContext(), "" + Result, Toast.LENGTH_SHORT).show();
    Ans.setText("" + Result);

}

public void Octal(int a){
    Num = Integer.parseInt(Dec.getText().toString());
    while(b > 0){
        c = a % 8;
        b = a/8;
        d = "" + c;
        s = d.concat(s);
        a = b;
    }
    Result = s;
    Toast.makeText(getBaseContext(), "" + Result, Toast.LENGTH_SHORT).show();
    Ans.setText("" + Result);

}

public void Hexal(int a){
    Num = Integer.parseInt(Dec.getText().toString());
    while(b > 0){
        c = a % 16;
        b = a/16;

        if(c>9){
            switch (c){
                case 10 : z = 'A';
                          break;
                case 11 : z = 'B';
                          break;
                case 12 : z = 'C';
                          break;
                case 13 : z = 'D';
                          break;
                case 14 : z = 'E';
                          break;
                case 15 : z = 'F';
                          break;
            }

            d = "" + z;

        }
        else
            d = "" + c;

        s = d.concat(s);
        a = b;
    }

    Result = s;
    Toast.makeText(getBaseContext(), "" + Result, Toast.LENGTH_SHORT).show();
    Ans.setText("" + Result);


  }
}

檢查Null異常:

if (TextUtils.isEmpty(Dec.getText().toString())){
        //value is empty
}else {
       Num = Integer.parseInt(Dec.getText().toString());
}
if(B.isSelected())
    Binary(Num);
if(O.isSelected())
    Octal(Num);
if (H.isSelected())
    Hexal(Num);

           ......
          .............

您必須創建一些按鈕或某些動作偵聽器(例如edittext ontextchangeListener),然后必須將代碼如下所示:

如果您使用按鈕:

button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if(!Dec.getText.toString.equals(""))
              Num = Integer.parseInt(Dec.getText().toString());
        }
    });

如果您正在使用edittext textchangelistener:

TextWatcher textWatcher = new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
    }

    @Override
    public void afterTextChanged(Editable s) {
        if(s.length() > 0)
           Num = Integer.parseInt(s.getText().toString());
    }
};

您的代碼的問題是,在解析時,edittext沒有任何值。 因此要解析它,ParseInt需要一些值。 因此,更好的方法是采取一些按鈕操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM