try {
inti =10/0;
}catch (ArrayStoreException e) {
System.out.println(2);
} catch (ClassCastException e) {
System.out.println(3);
} catch (UnmodifiableSetException e) {
System.out.println(4);
} catch (Exception e) {
System.out.println(1);
}finally{
System.out.println(6);
}
多重格式:
try{可能会抛出异常语句体1
}catch(异常类1 变量1){
语句体2
}catch(异常类2 变量2){
语句体3
}
.
.
.
catch(异常类n-2 变量n-2){
语句体n-1
}finally{
语句体n }
Try{}catch(){}finally{}:
1.语句块可以写多个catch语句
2.父类异常不能子类异常之前
3.如果抛出异常不能和catch中的所有异常精确匹配,那么就将抛出异常自动向上造型(子类到父类),直到匹配。如果不能匹配,就抛出异常。
try
捕获违例的第一步是用try{可能会抛出异常的语句}语句块选定捕获违例的范围。
catch(异常类型 变量)
在catch语句块中是对违例对象进行处理的代码,每个try语句块可以伴随一个或多个catch语句,用于处理可能产生的不同类型的违例对象。与其它对象一样,可以访问一个违例对象的成员变量或调用它的方法。
getMessage( ) 方法,用来得到有关异常事件的信息
printStackTrace( )用来跟踪异常事件发生时执行堆栈的内容。
多重 catch:
一段代码可能会生成多个异常
当引发异常时,会按顺序来查看每个 catch 语句,并执行第一个类型与异常类型匹配的语句
执行其中的一条 catch 语句之后,其他的 catch 语句将被忽略
finally
捕获例外的最后一步是通过finally语句为例外处理提供一个统一的出口,使得在控制流转到程序的其它部分以前,能够对程序的状态作统一的管理。不论在try代码块中是否发生了异常事件,finally块中的语句都会被执行。
finally语句是任选的
如果try或者catch块有return 指令,finally还是会被执行,流程先跳到finally然后再回到return指令
如果一个方法(中的语句执行时)可能生成某种Exception,但是并不能确定如何处理这种违例,则此方法应声明抛弃违例
throws
声明异常表明该方法将不对这些违例进行处理,而由该方法的调用者负责处理
EG:
publicclass Person {
//被调方法
publicvoid meth()throws ClassNotFoundException{
try{
Class.forName("comc.wsdasdA.ADASA");
inti =10/0;
}catch (ArithmeticException e) {
thrownew MyExceptionRun();
}
}
}
publicclass TestMain {
publicstaticvoid main(String[]args){
try {
// int i =10/0;
// throw new MyException();
System.out.println("ssss");
Person p = new Person();
p.meth();//调用者
}catch (ClassNotFoundException e) {
e.printStackTrace();
System.out.println(2);
} catch (ClassCastException e) {
System.out.println(3);
} catch (UnmodifiableSetException e) {
System.out.println(4);
} catch (MyExceptionRun e) {
e.printStackTrace();
}catch (RuntimeException e) {
System.out.println(1);
e.printStackTrace();
}finally{
System.out.println(6);
}
}
}
throw
异常是通过关键字 throw抛出,程序可以用throw语句抛出明确的异常。如:
try {
if(flag<0){
throw new NullPointerException();
}
}
throw语句的操作数一定是Throwable类类型或Throwable子类类型的一个对象。
自定义异常:必须继承exception或exception的子孙类。
//自定义异常类
publicclassMyExceptionRun extends RuntimeException {
/**
* 动态指定 异常提示信息
* @param message
*/
public MyExceptionRun(Stringmessage) {
super(message);
}
@Override
publicvoid printStackTrace() {
// System.out.println("同学小学数学没毕业?");
super.printStackTrace();
}
}
publicclass Person {
publicvoid meth()throws ClassNotFoundException{
try{
// Class.forName("comc.wsdasdA.ADASA");
inti =10/0;
}catch (ArithmeticException e) {
thrownew MyExceptionRun("关于数学运算的异常");
}
}
}
publicclass TestMain {
publicstaticvoid main(String[] args){
try {
// int i =10/0;
// throw new MyException();
System.out.println("ssss");
Person p = new Person();
p.meth();//调用者
}catch (ClassNotFoundException e) {
e.printStackTrace();
System.out.println(2);
} catch (ClassCastException e) {
System.out.println(3);
} catch (UnmodifiableSetException e) {
System.out.println(4);
} catch (MyExceptionRun e) {
e.printStackTrace();
}catch (RuntimeException e) {
System.out.println(1);
e.printStackTrace();
}finally{
System.out.println(6);
}
}
}
集合:
Collection:集合层次中的根接口,JDK没有提供这个接口直接的实现类。
List:是一个有序的集合,可以包含重复的元素
ArrayList:可变的数组,元素允许重复
LinkedList:针对经常插入或者删除中间元素所设计的高效率集合
Set:不能包含重复的元素。
SortedSet是一个按照升序排列元素的Set。
TreeSet:以有序状态保存并可防止重复
Map:包含了key-value对。Map不能包含重复的key
SortedMap是一个按照升序排列key的Map
Map接口和Collection接口没有任何关系。
ArrayList和LinkedList的比较
ArrayList底层采用数组完成,而LinkedList则是以一般的双向链表(double-linked list)完成,其内每个对象除了数据本身外,还有两个引用,分别指向前一个元素和后一个元素。
如果我们经常在List的开始处增加元素,或者在List中进行插入和删除操作,我们应该使用LinkedList,否则的话,使用ArrayList将更加快速。
Vector和ArrayList的异同
Vector类中所有的方法都是线程同步的,两个线程并发访问Vector对象是安全的,需要额外的监视器检查,运行效率低些。
ArrayList类中所有的方法是非同步的,程序的效率比Vector高。