13.2 注意catch顺序

尝试处理异常时,如果我们放了多个catch块,Java会监控它们的顺序。下面的例子会带来编译错误:

ScalaForTheJavaEyes/CatchOrder.java

  1. //Java code---will not compile due to incorrect catch order
  2. public class CatchOrder {
  3. public void catchOrderExample() {
  4. try {
  5. String str = "hello";
  6. System.out.println(str.charAt(31));
  7. }
  8. catch(Exception ex) { System.out.println("Exception caught"); }
  9. catch(StringIndexOutOfBoundsException ex) {
  10. System.out.println("Invalid Index"); }
  11. }
  12. }

编译这段代码,会得到这样的错误信息:“exception java.lang.StringIndexOutOfBoun- dsException has already been caught.”。Scala对其catch块使用模式匹配(参见13.1节,异常处理),按照我们提供的顺序起作用。因此,如果前面的语句处理了原本想在后面语句里处理的异常,Scala并不会给出警告。看一下下面的代码:

ScalaForTheJavaEyes/CatchOrder.scala

  1. try {
  2. val str = "hello"
  3. println(str(31))
  4. }
  5. catch {
  6. case ex : Exception => println("Exception caught")
  7. case ex : StringIndexOutOfBoundsException => println("Invalid Index")
  8. }

上面代码的输出如下:

  1. Exception caught

第一个case匹配Exception及其所有的子类。使用多个catch块时,我们必须确保,异常是由预期的catch块处理的。

在本章里,我们见识到了Scala提供的简洁而优雅的方式处理异常。Scala也无需捕获并不关心的异常。这让异常可以安全地传播到更高层次,得到正确处理。