异常处理
异常
- 导致程序中断运行的一种指令流;
- 体系结构:Throwable存在两个子类:Error(错误,无法用代码处理)和Exception(异常,try…catch处理)
- Exception分为非受检异常(RuntimeException,运行时的异常,写完代码就飘红,可以不扔)和受检异常(非运行时的异常,写完代码不飘红,必须明确抛出throws)
异常处理
-
try{ // 有可能发生异常的代码段 }catch(异常类型1 对象名1){ // 异常的处理操作 }catch(异常类型2 对象名2){ // 异常的处理操作 } ... finally{ // 异常的统一出口,无论是否发生异常,finally必然执行(如内存释放等操作可以放在这) //如果是程序被关闭的情况(指软件在内存里没了,电脑停电,关机),finally才不会执行 }
流程:
1、 一旦产生异常,则系统会自动产生一个异常类的实例化对象;
2、 那么,此时如果异常发生在try语句,则会自动找到匹配的catch语句执行,如果没有在try语句中,则会将异常抛出(抛给调用产生异常的方法代码的位置);
3、 所有的catch根据方法的参数匹配异常类的实例化对象,如果匹配成功,则表示由此catch进行处理。try{ System.out.println(x/y); }catch(ArithmeticException e){ System.out.println("除数不能为0"); }
异常处理能让代码能继续往下走,不会崩溃
(GC处理的内存垃圾,蓝牙属于硬件,不会被GC释放内存
只要是RuntimeException的子类,则表示程序在操作的时候可以不必使用try…catch进行处理,如果有异常发生,则由JVM进行处理。当然,也可以通过try catch处理。
throws
不处理,而是交给调用处理
-
异常是否抛出去,应该站在哪个角度思考?
一个方法用户传递参数才能运行,如果调用这个方法传参传错了,不在方法本身,这时候用throws;
-
格式:
返回值 方法名称()throws Exception{}
throw(用的少)
-
不会导致系统产生异常,自己造一个异常(用户年龄设置180岁时
throw new Exception("抛着玩的。") ;
自定义异常
- (非受检查,RuntimeException)不论是抛出去还是产生的,运行时的不会飘红线,都不需要明确的处理try…catch;
- (受检)飘红线,必须抛出去或try catch,明确说明怎么处理,才能正常编译;