上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
谬误10 误入歧途——所有的异常都要用try…catch语句捕获
开发应用程序的过程中,检测代码可能发生的错误并进行正确的处理是必需的,理想情况下,应用程序中每行代码都按照预想的情况运作。但是,在现实世界中却没有那么顺利。程序员可能会犯错、网络连接可能会中断、数据服务器可能会停止运行、资源可能找不到。总之,编写的代码必须能够检测出类似这些的错误并采取相应的对策。
在Java语言中,异常处理是一套行之有效的错误处理机制,它可以监视某段代码是否有错,并且将各种错误集中处理,如下面的代码所示:
public class Test { public static void main (String[] args) { Object obj; // 定义Object对象 Date dt; // 定义日期对象 try { obj = new Object (); dt = (Date) obj; // 将Object对象强制转换为 } catch (ClassCastException ex) // 无效类型转换异常 { System.out. println (ex. getMessage ()); } finally // 必须执行的代码块,通常用于释放资源或异常后的处理 { System.out. println ("一定会运行的代码"); } } }
说明
在上述的代码中,将Object 类型强制转换为Date 类型时,会引发无效类型转换异常(ClassCastException),将执行ClassCastException ex代码块中的代码,无论发现什么样的情况,最后一定会执行finally代码块中的代码,该代码块主要负责释放相关的资源。
程序运行后,在控制台输出的效果如图4.3所示。
图4.3 程序运行后,在控制台输出的信息
Java 中使用结构化异常处理的原则是在所有可能出错的地方都要加上结构化异常处理代码。因为这样能够保证在错误发生时,正确释放所有资源。但是盲目地针对每种异常都使用异常处理是不必要的。因为异常是一种耗费资源的机制,每当异常被抛出时,异常堆栈将被建立,异常信息将被加载,通常这些工作的成本相对较高。
上面代码中的类型转换异常处理方式可使用if语句代替,使用if语句实现安全的类型转换的代码如下所示:
public class Test2 { public static void main (String[] args){ Object obj; // 定义Object对象 Date dt = new Date (); // 定义日期对象 obj = new Object (); //利用if语句判断对象的数据类型是否相同 if(obj. getClass (). getSimpleName (). equals (dt. getClass (). getSimpleName ())){ dt = (Date) obj; // 将Object对象强制转换为 }else{ System.out. println ("obj:"+obj. getClass (). getSimpleName ()); System.out. println ("dt:"+dt. getClass (). getSimpleName ()); System.out. println ("数据类型转换失败"); } } }
运行上述代码后,在控制台输出的信息如图4.4所示。
图4.4 控制台输出的信息
说明
使用if语句可以将一个类型的变量转换为其他类型,但它和强制类型转换是有区别的,强制类型转换失败时,会引发一个ClassCastException异常,但使用if语句转换失败时,只返回null。