13.2 注意catch
顺序
尝试处理异常时,如果我们放了多个catch
块,Java会监控它们的顺序。下面的例子会带来编译错误:
ScalaForTheJavaEyes/CatchOrder.java
//Java code---will not compile due to incorrect catch order
public class CatchOrder {
public void catchOrderExample() {
try {
String str = "hello";
System.out.println(str.charAt(31));
}
catch(Exception ex) { System.out.println("Exception caught"); }
catch(StringIndexOutOfBoundsException ex) {
System.out.println("Invalid Index"); }
}
}
编译这段代码,会得到这样的错误信息:“exception java.lang.StringIndexOutOfBoun- dsException has already been caught.”。Scala对其catch
块使用模式匹配(参见13.1节,异常处理),按照我们提供的顺序起作用。因此,如果前面的语句处理了原本想在后面语句里处理的异常,Scala并不会给出警告。看一下下面的代码:
ScalaForTheJavaEyes/CatchOrder.scala
try {
val str = "hello"
println(str(31))
}
catch {
case ex : Exception => println("Exception caught")
case ex : StringIndexOutOfBoundsException => println("Invalid Index")
}
上面代码的输出如下:
Exception caught
第一个case
匹配Exception
及其所有的子类。使用多个catch
块时,我们必须确保,异常是由预期的catch
块处理的。
在本章里,我们见识到了Scala提供的简洁而优雅的方式处理异常。Scala也无需捕获并不关心的异常。这让异常可以安全地传播到更高层次,得到正确处理。