计算器android应用程序开发中的方形按钮(x^2)异常处理错误

问题描述 投票:0回答:1

我目前正在尝试使用 Java 在 android studio 中开发一个计算器 android 应用程序。该应用程序工作正常,直到我单击平方操作按钮,即应用程序中的

x^2
按钮,当没有输入时或当我在任何运算符之后单击平方操作按钮时。例如当我输入输入
1+
然后当我尝试输入
x^2
时,它会自动从应用程序退出。我尝试了多个 Try catch 块以阻止应用程序突然存在,但它不起作用 下面我有方形按钮的onClick方法的代码

bsquare.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (tvMain.getText().toString().isEmpty()) {
                        Toast.makeText(MainActivity.this, "Please enter a valid number..", Toast.LENGTH_SHORT).show();
                    } else {
                        double d = Double.parseDouble(tvMain.getText().toString());
                        double square = d * d;
                        tvMain.setText(String.valueOf(square));
                        tvsec.setText(d + "²");
                    }
                }
            });

我尝试了异常处理来阻止应用程序突然存在,但这不起作用

java android onclick calculator
1个回答
0
投票

“...应用程序工作正常,直到我单击平方操作按钮,即应用程序中的 x^2 按钮,当没有输入时或在任何操作符后单击平方操作按钮时。...”

另外检查是否可以解析 tvMain.getText().toString() 而不会抛出 NumberFormatException
而且,我建议使用 String#isBlank 而不是 isEmpty

在此示例中,我使用 boolean 来包含输入有效性。
只有在解析成功后才将其设置为true

bsquare.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        String string = tvMain.getText().toString();
        boolean valid = false;
        double d = 0;
        if (string != null && !string.isBlank()) {
            try {
                d = Double.parseDouble(tvMain.getText().toString());
                valid = true;
            } catch (NumberFormatException exception) { }
        }
        if (!valid)
            Toast.makeText(MainActivity.this, "Please enter a valid number..", Toast.LENGTH_SHORT).show();
        else {
            double square = d * d;
            tvMain.setText(String.valueOf(square));
            tvsec.setText(d + "²");
        }
    }
});

Double#valueOfJava 文档提供了有关此类输入情况的一些有用信息。

Double#valueOf(Java SE 20 和 JDK 20)

...为了避免在无效字符串上调用此方法并引发 NumberFormatException,可以使用下面的正则表达式来筛选输入字符串:

final String Digits     = "(\\p{Digit}+)";  
final String HexDigits  = "(\\p{XDigit}+)";  
// an exponent is 'e' or 'E' followed by an optionally  
// signed decimal integer.  
final String Exp        = "[eE][+-]?"+Digits;  
final String fpRegex    =  
    ("[\\x00-\\x20]*"+  // Optional leading "whitespace"  
        "[+-]?(" + // Optional sign character  
        "NaN|" +           // "NaN" string  
        "Infinity|" +      // "Infinity" string  
 
        // A decimal floating-point string representing a finite positive  
        // number without a leading sign has at most five basic pieces:  
        // Digits . Digits ExponentPart FloatTypeSuffix  
        //  
        // Since this method allows integer-only strings as input  
        // in addition to strings of floating-point literals, the  
        // two sub-patterns below are simplifications of the grammar  
        // productions from section 3.10.2 of  
        // The Java Language Specification.  
 
        // Digits ._opt Digits_opt ExponentPart_opt FloatTypeSuffix_opt  
        "((("+Digits+"(\\.)?("+Digits+"?)("+Exp+")?)|"+  
 
        // . Digits ExponentPart_opt FloatTypeSuffix_opt  
        "(\\.("+Digits+")("+Exp+")?)|"+  
 
        // Hexadecimal strings  
        "((" +  
        // 0[xX] HexDigits ._opt BinaryExponent FloatTypeSuffix_opt  
        "(0[xX]" + HexDigits + "(\\.)?)|" +  
 
        // 0[xX] HexDigits_opt . HexDigits BinaryExponent FloatTypeSuffix_opt  
        "(0[xX]" + HexDigits + "?(\\.)" + HexDigits + ")" +  
 
        ")[pP][+-]?" + Digits + "))" +  
        "[fFdD]?))" +  
        "[\\x00-\\x20]*");// Optional trailing "whitespace"  
if (Pattern.matches(fpRegex, myString))  
    Double.valueOf(myString); // Will not throw NumberFormatException  
else {  
    // Perform suitable alternative action  
}

“...当我输入输入1+,然后当我尝试输入x^2时,它会自动从应用程序退出。我尝试了多个Try catch块以阻止应用程序突然存在,但它没有”不起作用下面我有方形按钮的 onClick 方法的代码......”

在这种情况下,您可以使用 String#substring 方法来隔离数字。

String string = tvMain.getText().toString();
string = string.substring(0, string.length() - 1);

或者,如果您不确定可能有多少个附加运算符,您可以使用 loop 来修剪该值。
在这种情况下,虽然最后一个字符不是数字。

String string = tvMain.getText().toString();
while (!Character.isDigit(string.charAt(string.length() - 1)))
    string = string.substring(0, string.length() - 1);
© www.soinside.com 2019 - 2024. All rights reserved.