java基本理念是:“”构造不佳的代码不能运行“”
1、概念
因为异常机制将保证能够捕获这个错误,所以不用小心翼翼的各种去检查。而处理错误只需要在一个地方完成,那就是 异常处理程序。
2、基本异常
异常情形是指阻止当前方法或作用域继续执行的问题。
3.捕获异常
3(1).try块:如果在方法内部抛出了异常,这个方法将在抛出异常的过程中结束。要是不希望方法就此结束,可以在方法内设置一个特殊的块来捕获异常。因为在这个块里“尝试”各种(可能产生异常的)方法调用,所以称为try块
3(2).异常处理程序:异常处理理论上有两种基本模型。终止模型:将假设错误非常关键,以至于程序无法返回到异常发生的地方继续执行。恢复模型:异常处理程序的工作是修正错误,然后重新尝试调用出问题的方法(那么在遇见错误时就不能抛出异常,而是调用方法来修正该错误。或者,把try块放在while循环里,这样就不断地进入try块,直到得到满意的结果。)
4、创建自定义异常
要自定义异常类,必须从已有的异常类继承,最好是选择意思相近的异常类继承。建立新的异常类型最简单的方法就是让编译器为你产生默认构造器。
class SimpleException extends Exception{ } public class InheritingExceptions { public void f() throws SimpleException{ System.out.println("Throw SimipleException from f()"); throw new SimpleException(); } public static void main(String[] args) { InheritingExceptions sed = new InheritingExceptions(); try { sed.f(); } catch (SimpleException e) { System.out.println("Caugth it"); } } } /*Throw SimipleException from f() Caugth it */
5、异常说明
关键词 throws 跟在方法后面,如f() throws Exception,Exception1, . . .{} 意味着这个方法f可能会抛出异常列表中的异常。 关键词throw ,抛出一个异常。
6、捕获所有异常
只写一个异常处理程序来捕获所有类型的异常。通过捕获异常类型的基类Exception,就可以做到这一点
catch(Exception e) { System.out.println("Caught an exception");}
6.1栈轨迹
public class WhoCalled{ static void f(){ try { throw new Exception(); } catch (Exception e) { for(StackTraceElement ste:e.getStackTrace()){ System.out.println(ste.getMethodName()); } } } static void g(){ f(); } static void h(){ g(); } public static void main(String[] args) { f(); System.out.println("====================="); g(); System.out.println("============================="); h(); } } /*f main ===================== f g main ============================= f g h main*/
6.2 重新抛出异常
挡在异常处理模块里继续抛出异常,那么printStackTrace()方法显示的将是原来异常抛出点的调用栈信息,而非重新抛出点的的信息。
System.out.println("An exception was thrown");
throw e;
}
System.out.println("An exception was thrown");
throw (Exception)e.fillInStackTrace();
}
6.3 异常链
在捕获一个异常后抛出另一个异常,并希望把原始异常的信息保存下来,这被称为异常链。
7 java 标准异常
8 使用finally进行清理
try--(catch可无)--finally
1 try finally 放在循环里可以做到“程序继续执行前必须要达到某个条件”。
2 使资源恢复到初始状态可以finally
3 try块执行停止(无catch)后在执行下一步操作之前finally会立刻执行
- 在异常被抛到更高层前就会执行finally
- break、continue或者带标签时finally也会先执行
- return在finally也会先执行
4 可能造成原异常丢失的finally用法:
- finally里产生另一个异常
- finally里return。一般这种异常是运行时异常。
9、异常的限制
覆盖方法时只能抛出基类方法的异常列表中的一种或者多种异常或者其子类异常或者不抛,但不能抛出基类没有的异常。
10、构造器
构造器抛了异常则创建对象后也要抛出异常,并且与构造器的完全一致。
父类构造器抛了异常,子类构造器必须抛出基类所有的异常,不可以不抛,并且可以抛出其他异常。
11、异常匹配
基类异常会匹配子类异常,且只匹配第一个能匹配的catch,所以在多个catch中基类和子类异常都要匹配时,子类异常catch要出现在父类catch之前,如果出现在父类之后会被父类捕获匹配子类catch永远也不会被匹配,所以会报错。
12、其他可选异常
不总结了,可以自己看书。基本用不到。