当我遵循的每个示例都使用相同的转换时,为什么我无法在没有致命异常的情况下将字符串转换为 Float?

Why am I not able to convert a string to a Float without an Fatal Exception when every example I've followed has used the same casting?

真的要在这里扯掉我的头发了。我一整天都在尝试让非常简单的程序在 Android Studio 中的 Java 中运行,而在其他语言和 IDE 中我没有遇到任何问题。我遵循了多个教程,只是试图让简单的程序正常工作。我遇到了一个致命异常错误,说 java.lang 无法将字符串转换为浮点数。

这是我的代码,它的一页只是试图取一个浮点数,将它乘以另一个浮点数,然后将乘积添加到第一个浮点数,我留下了一些尝试来“解决”问题,所以如果他们看起来很糟糕,因为我正在尝试一切:

package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    EditText priceText, taxText, finalText;
    Button button;

    float price = 0.00f;
    float tax = 0.0f;
    float finalprice = 0.00f;

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



        priceText = findViewById(R.id.priceText);
        priceText.setText(String.valueOf(price));
        taxText = findViewById(R.id.taxText);
        String str = tax + "%";
        taxText.setText(str);
        finalText = findViewById(R.id.finalText);
        finalText.setText(String.valueOf(finalprice));

        button = findViewById(R.id.calcButton);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //String p = priceText.getText().toString();
                price = convertStringToFloat(priceText.getText().toString());
                //String t = taxText.getText().toString();
                tax = Float.parseFloat(String.valueOf(taxText));

                float _taxes = price * tax;
                finalprice = price + _taxes;

                finalText.setText(String.valueOf(finalprice));

            }
        });

    }
    public static float convertStringToFloat(String str)
    {
        return Float.parseFloat(str);
    }
}

当应用程序崩溃时,控制台不断吐出以下内容:

2021-09-07 10:15:34.700 7772-7772/com.example.myapplication E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.myapplication, PID: 7772
    java.lang.NumberFormatException: For input string: "androidx.appcompat.widget.AppCompatEditText{53d2c07 VFED..CL. .F...... 312,404-762,551 #7f08019b app:id/taxText aid=1073741826}"
        at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043)
        at sun.misc.FloatingDecimal.parseFloat(FloatingDecimal.java:122)
        at java.lang.Float.parseFloat(Float.java:451)
        at com.example.myapplication.MainActivity.onClick(MainActivity.java:42)
        at android.view.View.performClick(View.java:7161)
        at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1119)
        at android.view.View.performClickInternal(View.java:7133)
        at android.view.View.access00(View.java:804)
        at android.view.View$PerformClick.run(View.java:27416)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:241)
        at android.app.ActivityThread.main(ActivityThread.java:7617)
        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:941)
2021-09-07 10:15:34.728 7772-7772/com.example.myapplication I/Process: Sending signal. PID: 7772 SIG: 9

您似乎在这里失败了:

tax = Float.parseFloat(String.valueOf(taxText));

taxText 是一个 EditText 小部件:

EditText priceText, taxText, finalText;

如果您尝试获取用户输入的值,请将 String.valueOf(taxText) 替换为 taxText.getText().toString()

请注意,用户可能仍会输入一个不是有效浮点数的值,因此您仍然希望将 parseFloat() 调用包装在 try/catch 并在收到无效输入时采取一些措施(例如,通过 Log.e() 将消息记录到 Logcat 并向用户提供一些错误反馈)。