Java学习_07_泛型、异常

  博客内容仅作学习交流之用,详细内容参见网络资源,欢迎大家交流探讨!

1 泛型

1.1 What is the Generic?

       泛型是java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。

       Java语言引入泛型的好处是安全简单。

       在java SE 1.5之前,没有泛型的情况下,通过对类型object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做到显式的强制类型转换,而这种转换时要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。

       泛型的好处是在编译的时候检查类型安全,并且所有的强制类型转换都是自动和隐式的,提高代码的重用率

1.2 The Advantage of Using Generic

       ①类型安全;

       ②向后兼容;

       ③层次清晰

       ④性能较高,用GJ(Generic Java)编写代码可以分为java编译器和虚拟机带更多的类型信息,这些信息对java程序做进一步优化提供条件。

2 异常

       加强程序的健壮性,当出现无法控制的外部环境问题(例如:用户提供的文件不存在,文件内容损坏,网络不可用……)时,Java就会用异常对象描述。

       Java中的2中方法处理异常:

       ①   在发生异常的地方直接处理;

       ②   将异常抛给调用者,让调用者处理。

2.1 异常分类:

       ①   检查性异常:java.lang.Exception,也称编译异常。程序正确,但因为外在的环境条件不满足引发,例如:用户错误及I/O问题——程序试图打开一个并不存在的远程Socket端口,或者是打开不存在的文件时,这不是程序本身的逻辑错误,而很可能是远程机器名字错误(用户拼写错误)。对商用软件系统,程序开发者必须考虑并处理这个问题。Java编译器强制要求处理这类异常,如果不捕获这类异常,程序将不能被编译;

       ②   运行期异常:java.lang.Runtime.Exception,这意味着程序存在bug,例如:数组越界,0被除,入参不满足规范……这类异常需要更改程序来避免,java编译器强制要求处理这类异常;

       ③   错误:java.lang.Error,一般很少见,也很难通过程序解决,它可能源于程序的bug,但一般更可能源于环境问题,如内存耗尽。错误在程序中无须处理,而由运行环境处理。

顶层是java.lang.Throwable类,检查性异常、运行期异常、错误都是这个类的子孙类。Java.lang.Exception和java.lang.Error继承自java.lang.Throwable,而java.lang.RuntimeException继承自java.lang.Exception。

2.2 异常处理:

(1)  try…catch…finally

       在try语句块中是可能出现异常的语句,在catch语句块中处理异常,只有一个try语句块,可以有多个catch语句块,catch语句块必须紧跟在try语句块中,中间不能有其他语句。捕获到异常后,try-cacth结构后面的代码继续执行,try-catch 异常匹配后,该结构中的其他的语句不再执行。

       如果把finally块置于try…catch…语句后,finally块一般都会得到执行,它相当于一个万能的保险,即使前面的try块发生异常,而又没有对应的catch块,finally块将马上执行。例如:数据库链接的关闭,打开的文件的关闭……。

       以下情形,finally块将不会被执行:

       ①   finally快中发生了异常;

       ②   程序所在线程死亡;

       ③   在前面的代码中用了System.exit();

       ④   关闭CPU。

(2)  throws Exception

       ①   修饰符 返回值类型 方法名() throws 异常类型1, 异常类型2{

              //方法体

              }

       ②   用throw再次抛出异常

       对于未检查异常,在方法抛出时可以不再用throws来声明,直接使用throw抛出,而对于检查异常则必须在throws声明后才能进行throw抛出异常,并且需要将可能抛出异常的语句放入try-catch语句块中。

       将异常抛出给调用者,或没有调用者对异常进行处理,则有java虚拟机处理。

2.3 多个异常的处理规则

       定义多个catch可精确地定位异常,根据抛出异常的类型调用相应的catch模块。如果为子类的异常定义了特殊的catch块,而父类的异常则放在另一个catch块中,此时,必须满足以下规则:子类异常的处理块必须在父类异常处理块的前面,否则会发生编译错误,所以,越特殊的异常越在前面处理,越普遍的异常越在后面处理,例如:先捕获ArithmeticException,在捕获Exception。这类似于制定防火墙的规则次序:较特殊的规则在前,较普遍的规则在后。

       或者自定义并抛出异常。创建异常,抛出异常(首先实例化一个异常对象,然后用throw抛出)合在一起就是:throw newIOException(“异常说明信息”)。将两个步骤合在一起的好处是:创建异常时,会包含异常创建处的行信息,异常被捕获时可以通过堆栈迹(stack trace)的形式报告这些信息。如果在同一行代码创建和抛出异常,对于程序的调试非常有用。所以,throw new XXX()已经成为一个标准的异常抛出范式。在定义一个方法时,方法块中调用的方法可能会抛出异常,可用上面的throw new XXX()处理,如果不处理,那么必须在方法定义时,用throws声明这个方法会抛出的异常。

       对异常的处理,有一条行之有效的默认规则:向上抛出——被调用类在运行过程中对遇到的异常一概不作处理,而是直接向上抛出。一致到最上层的调用类,调用类根据应用系统的需求和特定的异常处理规则进行处理,如向控制台输出异常堆栈信息printStackTrace(),打印在日志文件中。用一句形象的话来讲,就是谁使用,谁(最上层的调用者)处理。

2.4 定义自己的异常

       Java提供的异常可以处理大多数的异常,但有时也需要编程者定义新的异常类来处理程序中的异常。创建自己的异常类只需要继承Exception类,并实现一些方法即可:

       Exception类中并没有定义任何方法,但它从Throwable类继承了一些方法。

 

站在巨人的肩上才能看得更远,一步一个脚印才能走得更远。分享成长,交流进步,转载请注明出处!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值