我对编程还是比较陌生的,所以我从观察中学到了一些东西但却没有完全理解。 Try-Catch就是其中之一。根据我的研究,try语句允许我定义要测试错误的代码块,catch语句允许我定义在try块中发生错误时要执行的代码块。
我明白了。我曾尝试在我收到崩溃我的应用程序的异常错误的情况下使用Try-Catch。 Try-Catch似乎阻止(停止)崩溃。但这是我的问题,是否可以让应用程序不断捕获异常错误?
例如,我正在使用EditText小部件。我希望EditText的输入值代表货币,所以我应用了android:inputType =“numberDecimal”。我从中学到的问题是该属性允许小数点后的任意数量的值。这时我想出了一个使用DecimalFormat之类的正确格式更新EditText的想法。
我没有发布我的整个代码,但这是我很好奇的部分。
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
// TODO Auto-generated method stub
DecimalFormat format = new DecimalFormat("0.00");
if (etBill.getText().toString() != null &&
etBill.getText().toString().length() > 0) {
try {
doubleBill = Double.parseDouble(etBill.getText().toString());
strFormatted = format.format(doubleBill);
Log.d(TAG, "unformatted(" + doubleBill + ")" +
" // formatted(" + strFormatted + ")");
//etBill.setText("$" + strFormatted, TextView.BufferType.EDITABLE);
etBill.setText("$" + strFormatted);
} catch (NumberFormatException nfe) {
Log.e(TAG, "FloatingPointParser.parseDouble error");
}
} else {
// values in editText were deleted; hardcode value
doubleBill = 0.0;
strFormatted = format.format(doubleBill);
}
}
这是我每次在EditText小部件中输入值时捕获的异常错误。
所以我的问题是,Try-Catch是一种让我纠正错误的方法吗?是否可以捕获异常错误,例如在运行的应用程序的生命周期中出现此NumberFormapException?我使用这个吗?提前谢谢!
答案 0 :(得分:2)
NumberFormatException
是运行时异常,您正在正确捕获它。但是,您应该通过重新运行代码或将异常传递到堆栈来处理它,而不是仅打印某些东西以让您知道它已经捕获了它。例如,如果用户输入数字然后捕获此异常,则可以提示他们重新输入新号码。如果抛出此异常的数字不是由用户提供的,而是由您的代码提供的,那么它表示您在某处有逻辑错误,应该修复它以防止首先抛出此异常。
答案 1 :(得分:2)
一般而言,异常机制应该用于特殊情况 - 这通常不应该发生。如果您每次输入值时都会抛出异常,那就是滥用该机制。通常,有一种更好的方式不涉及异常。但在某些情况下,例外机制是处理这种情况的最简洁方法。
以下是Josh Bloch的 Effective Java:Programming Language Guide 的引用:
"仅在例外条件下使用例外。也就是说,不要对控制流使用异常,例如在调用Iterator.next()时捕获NoSuchElementException而不是首先检查Iterator.hasNext()。"
答案 2 :(得分:2)
异常处理不仅是一门艺术,而且是许多讨论/辩论的主题。我将尝试解决更广泛的问题,而不会招致任何人的愤怒。
有两种例外 - 故障异常和意外事故异常。故障异常是无法恢复的,例如无法连接到应该在您的应用程序运行的Web服务。您在catch
块中记录它们并重新抛出,让它们冒泡到某个故障处理程序。应急异常就是你用数字格式问题所描述的 - 你可以从中恢复的东西。在这种情况下,您可以在catch
块中完全处理事情。例如,您可以通过提示输入来允许应用程序进行恢复。
然后有一个问题,人们不喜欢使用异常进行流量控制 - 这是有充分理由的。在您的情况下,这意味着在if
语句中使用正则表达式,例如,测试数字格式而不是使用潜在的异常生成操作。您通常不希望对正常控制流使用异常,但您还需要注意不要让意识形态胜过简单的解决方案。你将通过经验学到平衡。
因此,您应该从catch
块中的异常中恢复。或者完全使用不同的非异常机制来管理控制流。
希望有所帮助。
答案 3 :(得分:1)
在编程中使用Try catch是公平的。但处理错误是不同的问题。尝试捕获只是为了捕捉你的程序中可能发生的错误条件,但你可能希望抓住它或留给你。简单的例子是年龄不允许作为浮点数,但允许高度浮点数和十进制数。