我目前正在尝试使用 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 + "²");
}
}
});
我尝试了异常处理来阻止应用程序突然存在,但这不起作用
“...应用程序工作正常,直到我单击平方操作按钮,即应用程序中的 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#valueOf 的 Java 文档提供了有关此类输入情况的一些有用信息。
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);