Как исправить фатальную ошибку при выполнении setText()

Когда я выполняю метод onClick, приложение вылетает. Проблема, кажется, в функции setText

Я сузил проблему до данного кода:

В коде нет синтаксических ошибок, которые были обнаружены Джава:

public void calculate(View view){

        double subTotal;
        double Total;
        double tipAmount;
        TextView showTotal = findViewById(R.id.textView2);
        TextView tip = findViewById(R.id.Tip);
            SeekBar percent = findViewById(R.id.seekBar);
            int percent1 = percent.getProgress() + 100;
            EditText input = findViewById(R.id.editText);
            String placeHolder = input.getText().toString();
            subTotal = Double.parseDouble(placeHolder);

            if ((subTotal >= 0) && (subTotal <= 999999) && (subTotal == (double)subTotal)){
            Total = Double.parseDouble(roundTwo.format(subTotal * percent1 * .01));
            tipAmount = Double.parseDouble(roundTwo.format(subTotal * (percent1-100) *.01));
            String totalString = Double.toString(Total);
            tip.setText(getResources().getString(R.string.Tip_Amount, tipAmount));
            showTotal.setText(getResources().getString(R.string.Total_Amount,Total));



        }
            else {
                showTotal.setText(getResources().getString(R.string.error));
            }
    }

Строки XML:

<string name = "Tip_Amount">Tip: %1$d</string>
<string name = "Total_Amount">Total: %1$d</string>

Приложение вылетает из-за данной строки в файле java. Вот данные Logcat: Логкат:

 Process: com.example.tipcalculator, PID: 19871
    java.lang.IllegalStateException: Could not execute method for android:onClick
        at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:390)
        at android.view.View.performClick(View.java:7251)
        at android.view.View.performClickInternal(View.java:7228)
        at android.view.View.access$3500(View.java:802)
        at android.view.View$PerformClick.run(View.java:27843)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7116)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:925)
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invoke(Native Method)
        at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385)
        at android.view.View.performClick(View.java:7251) 
        at android.view.View.performClickInternal(View.java:7228) 
        at android.view.View.access$3500(View.java:802) 
        at android.view.View$PerformClick.run(View.java:27843) 
        at android.os.Handler.handleCallback(Handler.java:883) 
        at android.os.Handler.dispatchMessage(Handler.java:100) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:7116) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:925) 
     Caused by: java.util.IllegalFormatConversionException: d != java.lang.Double
        at java.util.Formatter$FormatSpecifier.failConversion(Formatter.java:4403)
        at java.util.Formatter$FormatSpecifier.printInteger(Formatter.java:2885)
        at java.util.Formatter$FormatSpecifier.print(Formatter.java:2839)
        at java.util.Formatter.format(Formatter.java:2530)
        at java.util.Formatter.format(Formatter.java:2459)
        at java.lang.String.format(String.java:2911)
        at android.content.res.Resources.getString(Resources.java:485)
        at com.example.tipcalculator.MainActivity.calculate(MainActivity.java:88)
        at java.lang.reflect.Method.invoke(Native Method) 
        at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385) 
        at android.view.View.performClick(View.java:7251) 
        at android.view.View.performClickInternal(View.java:7228) 
        at android.view.View.access$3500(View.java:802) 
        at android.view.View$PerformClick.run(View.java:27843) 
        at android.os.Handler.handleCallback(Handler.java:883) 
        at android.os.Handler.dispatchMessage(Handler.java:100) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:7116) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:925) 

напишите свой logcat/stacktrace пожалуйста

lvl4fi4 23.06.2019 05:34

Отредактировал, заранее спасибо

Nandha 23.06.2019 05:41

не могли бы вы опубликовать свой код активности, пожалуйста? я думаю, вы не инициализировали view может быть один из тех tip, showTotal

lvl4fi4 23.06.2019 05:49

также у вас есть Caused by: java.util.IllegalFormatConversionException: d != java.lang.Double, что означает какой-то неправильный разговор. опубликуйте свой полный код активности и покажите, какая именно строка кода имеет исключение.

lvl4fi4 23.06.2019 05:57

Нет, у меня точно есть, но я выложил метод

Nandha 23.06.2019 05:57

Вы пробовали использовать <string name = "Tip_Amount">Tip: %d</string> <string name = "Total_Amount">Total: %d</string>?

ישו אוהב אותך 23.06.2019 06:11

Посмотри снова. setText() не отображается в трассировке стека. Следовательно проблема не в этом. Проблема раньше, в оценке его аргументов.

user207421 24.06.2019 06:08
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
76
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я думаю, что то, что вы передаете как tipAmount и Total, имеет проблему с типом, поскольку ваш форматировщик строк %1$dожидает в не является двойным или другим типом. Сначала попробуйте распечатать их с помощью Log.

Это будет работать

tip.setText(getResources().getString(R.string.Tip_Amount, 100));
showTotal.setText(getResources().getString(R.string.Total_Amount, 1000));

это не сработает

tip.setText(getResources().getString(R.string.Tip_Amount, 100.00))
showTotal.setText(getResources().getString(R.string.Total_Amount, 1000.00));

Пожалуйста, перейдите по ссылке, чтобы узнать больше о форматировании строк Форматтер

Ответ принят как подходящий

Вы использовали d в %1$d в файле strings.xml, поэтому ожидается целое число. Однако вы отправляете двойное значение, поэтому возникает ошибка. Поскольку вам нужна десятичная часть, можно использовать f вместо d и обновить strings.xml следующим образом:

<string name = "Tip_Amount">Tip: %1$.2f</string>
<string name = "Total_Amount">Total: %1$.2f</string>

Таким образом, вы также получите хорошее представление, 2 цифры после точки. Кстати, я рекомендую использовать BigDecimal для валют.

Другие вопросы по теме