04java基础之异常,泛型

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_39823114/article/details/78566789

一、异常:

(1)程序运行过程中的不正常现象就叫异常。
(2)导致程序运行不正常的现象有很多,所以,就有很多的异常对象。
  而这些异常对象存在着共性的内容,所以,可以不断的进行抽取。最终形成了异常的体系结构。
  异常体系的根类是:Throwable
  Throwable:
|--Error:重大的问题,我们处理不了。也不需要编写代码处理。比如说内存溢出。
|--Exception:一般性的错误,是需要我们编写代码进行处理的。
|--RuntimeException:运行时异常,这个我们也不需要处理。
                   其实就是为了让他在运行时出问题,然后我们回来修改代码。
(3)异常的分类
异常有两种:
编译时被检测异常(Check异常):
该异常被标识,代表这可以被处理。

                        该异常在编译时,如果没有处理(没有抛也没有try),编译失败。没有完善错误处理的代码根本没有机会被执行

                        对Checked异常处理方法有两种

                        1 当前方法知道如何处理该异常,则用try...catch块来处理该异常。
                        2 当前方法不知道如何处理,则在定义该方法是声明抛出该异常。


运行时异常(编译时不检测、、、Runtime异常)
在编译时,不需要处理,编译器不检查。
该异常的发生,建议不处理,让程序停止。需要对代码进行修正。
(4)异常体系的特点:
异常体系中的所有类及其子类对象都具备可抛性。也就是说可以被throw和throws关键字所操作。

        (5)main方法是如何处理异常的。
A:在main里面编写代码进行处理
B:交给jvm自己进行处理。采用的是jvm的默认处理方式。
 其实就是相当于调用了异常对象的printStackTrace()方法。
(6)Throwable类的学习
getMessage():获取异常信息,返回字符串。
toString():获取异常类名和异常信息,返回字符串。
printStackTrace():获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。


三、Error

当程序发生不可控的错误时,通常做法是通知用户并中止程序的执行。与异常不同的是Error及其子类的对象不应被抛出。

Error是throwable的子类,代表编译时间和系统错误,用于指示合理的应用程序不应该试图捕获的严重问题。

Error由Java虚拟机生成并抛出,包括动态链接失败,虚拟机错误等。程序对其不做处理。

异常处理一般用到以下几个关键字try,catch,finally,throws,throw,
try 块用于捕获异常。其后可接零个或多个catch块,如果没有catch块,则必须跟一个finally块。
catch 块用于处理try捕获到的异常。
finally 块无论是否捕获或处理异常,finally块里的语句都会被执行 当在try块或catch块中遇到return语句时,finally语句块将在方法返回之前被执行
(7)多个异常同时被捕获的时候,记住一个原则:
先逮小的,再逮大的。
finally:永远被执行,除非退出jvm。System.exit(0);
面试题2个。
①、final,finally,finalize区别。
  final是最终的意思。它可以用于修饰类,成员变量,成员方法。
  它修饰的类不能被继承,它修饰的变量时常量,它修饰的方法不能被重写。
  finally:是异常处理里面的关键字。
  它其中的代码永远被执行。特殊情况:在执行它之前jvm退出。System.exit(0)
  finalize:是Object类中的一个方法。
  它是于垃圾回收器调用的方式。
②、假如catch中有return语句, finally里中的代码会执行吗?
  是在return前,还是在return后呢?
  会,在return前执行finally里面的代码
(8)Throw和throws的区别:  
1. 位置不同:throws用在函数上,后面跟的是异常类,可以跟多个;而throw用在函数内,后面跟的是异常对象。 
2. 功能不同:throws用来声明异常,让调用者只知道该功能可能出现的问题,可以给出预先的处理方式;throw抛出具体的问题对象,执行到throw,功能就已经结束了,跳转到调用者,并将具体的问题对象抛给调用者。也就是说throw语句独立存在时,下面不要定义其他语句,因为执行不到。 
3. throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常对象。 
(9)自定义异常
定义类继承Exception或者RuntimeException
1,为了让该自定义类具备可抛性。
2,让该类具备操作异常的共性方法。

二、泛型:
泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。 泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
推荐使用泛型
List<String> list=new ArrayList<String>();
list.add("a");
泛型减少装箱拆箱的次数
装箱:
把基本类型用它们相应的引用类型包装起来,使其具有对象的性质。int包装成Integer、float包装成Float
拆箱:
和装箱相反,将引用类型的对象简化成值类型的数据
Integer a = 100;                  这是自动装箱  (编译器调用的是static Integer valueOf(int i))
int     b = new Integer(100); 这是自动拆箱
使用泛型的好处:
泛型的用法是在容器后面添加<Type>
Type可以是类,抽象类,接口
(1)为什么会出现泛型?
因为集合存放的数据类型不固定,故往集合里面存放元素时,存在安全隐患,
如果在定义集合时,可以想定义数组一样指定数据类型,那么就可以解决该类安全问题。
JDK1.5后出现了泛型,用于解决集合框架的安全问题。
泛型是一个类型安全机制。
(2)泛型定义格式:通过<>来定义要操作的引用数据类型
ArrayList<String> al = new ArrayList<String>;
(3)泛型的好处:
**将运行时期出现的ClassCastException(类型转换异常)问题转移到编译时期;
**避免了强制转换的麻烦
(4)什么时候定义泛型?
泛型在集合框架中很常见,只要见到<>就要定义泛型。其实<>就是用来接收类型的。
当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可
(5)泛型的形式
**泛型类:即自定义泛型类
A:当类中要操作的引用数据类型不确定时,早起定义Object来完成扩展,现在定义泛型来完成
B:局限性:泛型类定义的泛型,在整个类中有效,如果该泛型类的方法被调用,
  当泛型类的对象明确要操作的类型后,所有要操作的类型就被固定。
**泛型方法:泛型放在返回值前面,修饰符的后面
A:为了避免泛型类的局限性,让不同方法可以操作不同的类型,而且类型还不确定,
 则可以将泛型定义在方法上
B:特殊之处:静态方法不可以反问类上定义的泛型
 如果静态方法操作的应用数据类型不确定,可以讲泛型定义在静态方法上
**泛型接口:
当泛型定义在接口上时,则子类中要指定实现接口类型,同时还可以子类也可以定义为泛型类
(6)泛型的高级应用:?通配符
**当指定两种泛型的集合,则迭代时也要定义两种泛型的迭代器,麻烦,此时可通过将迭代器的泛型
 改为?,如Iterator<?> it=al.iterator();
**两种泛型限定
向上限定: ? extends E  ;E可以接收E类型或者E的子类
向下限定: ? super E  ;E可以接收E类型或者E的父类


猜你喜欢

转载自blog.csdn.net/qq_39823114/article/details/78566789
今日推荐