2015-08-19 3 views
-5

Я новичок в программировании для Android, и я пытаюсь создать приложение, которое разделяет счет между людьми. Но что-то о моих целых числах неверно. Я знаю это, потому что в моем LogCat он говорит: «Вызванный: java.lang.NumberFormatException: Invalid INT: ""1 ошибка не позволяет мой код компилировать

Вот мой MainActivity.java

public class MainActivity extends Activity { 
public double x; 
public double y; 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    //Button 
    Button btn = (Button) findViewById(R.id.button); 


    //EditText 
    EditText nop = (EditText) findViewById(R.id.editText); 
    EditText cob = (EditText) findViewById(R.id.editText2); 


    //Getting the strings 
    try{ 
     x = Double.valueOf(nop.getText().toString()); 
    } catch (NumberFormatException) { 
     x = 0; 
    } 

    try{ 
     y = Double.valueOf(cob.getText().toString()); 
    } catch (NumberFormatException) { 
     y = 0; 
    } 

    String textX = nop.getText().toString(); 
// if variable contains valid number: 
    if (textX != null && textX.length() > 0) 
     x = Double.valueOf(); // exception thrown by method 
    else 
     x = 0; 

    //TextView 
    final TextView tv = (TextView) findViewById(R.id.textView); 

    btn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      double z = x/y; 
      tv.setText((int) z); 
     } 
    }); 

} 
} 

Вот LogCat:

08-19 07:30:28.452 16070-16070/com.elie.billsplitter E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.elie.billsplitter, PID: 16070 
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.elie.billsplitter/com.elie.billsplitter.MainActivity}: java.lang.NumberFormatException: Invalid int: "" 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390) 
      at android.app.ActivityThread.access$800(ActivityThread.java:151) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5257) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
    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 com.elie.billsplitter.MainActivity.onCreate(MainActivity.java:25) 
      at android.app.Activity.performCreate(Activity.java:5990) 
      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390) 
            at android.app.ActivityThread.access$800(ActivityThread.java:151) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            at android.os.Looper.loop(Looper.java:135) 
            at android.app.ActivityThread.main(ActivityThread.java:5257) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:372) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
+2

Пожалуйста, добавьте ошибку вы испытываете .. – Alex

+0

сообщение об ошибке вас 're getting – VirtualProdigy

+0

Пример с неправильными целыми числами –

ответ

1

устремленный исключение:

java.lang.RuntimeException: Невозможно запустить активность ComponentInfo {com.elie.billsplitter/ком. elie.billsplitter.MainActivity}: java.lang.NumberFormatException: Invalid INT: ""

ошибка в этом фрагменте кода

//Getting the strings 
x = Integer.parseInt(nop.getText().toString()); 
y = Integer.parseInt(cob.getText().toString()); 

Почему?
nop.getText().toString().equals("") или cob.getText().toString().equals("").

Как этого избежать?
Вы должны быть уверены, что получите действительный String из этого EditText, потому что, если они пустые или не содержат эквивалент doubleString, у вас будет NumberFormatException.

Решение?
Лучшие способы будут:

  • добавить валидацию EditText, чтобы получить действительно только String s.
  • Преобразование значения, если выбрано NumberFormatException.

try{ 
    x = Double.valueOf(nop.getText().toString()); 
} catch (NumberFormatException e) { 
    x = 0; 
} 

try{ 
    y = Double.valueOf(cop.getText().toString()); 
} catch (NumberFormatException e) { 
    y = 1; // division/0 will throw NaN 
} 

ADD-ON: Почему я не использую Integer.parseInt() ??
Если вы создаете double s вы не можете разобрать int потому, что вы потеряете точность, и, например, в Java (int) 1/(int) 3 = 0 или (int) 10/(int) 3 = 3 поэтому используйте Double::valueOf()

x = Double.valueOf(nop.getText().toString()); 
y = Double.valueOf(cob.getText().toString()); 
+0

** первый ** из всех, [не изменяйте оригинальный код] (http://meta.stackexchange.com/questions/169052/guidance-to-avoid-chameleon-behavior), ** second **, читать тщательно ответьте: вы применили 2 метода, которые я отправил в оригинальном ответе, поэтому ** пожалуйста, удалите второе 'x' назначение ** из' String textX = nop.getText(). toString(); 'to' x = 0'. –

+0

СПАСИБО СМОТРЕТЬ БОЛЬШЕ !!!! IVE ПЫТАЕТСЯ НАЙТИ ЭТО НА 3 ДНЯ! – Asm

+0

Приятно слышать это @Asm. Поскольку это ваш первый квестон, вы должны знать, что если этот или любой ответ разрешил ваш вопрос, пожалуйста, рассмотрите [принятие его] (http://meta.stackexchange.com/q/5234/179419), нажав галочку. Это указывает более широкому сообществу, что вы нашли решение и дали некоторую репутацию как самому, так и самому себе. Конечно, нет никаких обязательств для этого. –

Смежные вопросы