异常(Exception) 运行时出现的问题 ArrayIndexOutOfBoundException NullPointerException ClassCastException StackOverflowException 通知方法出错的一种方式
程序中总会遇到各种错误(运行时错误) 1.需要一种方式,通知调用者,程序出问题 1.通过返回值 Queue<Integer> queue=....; queue.poll();//从队列中删除一个数 //当队列为空时,返回null 缺点:1.占用一个特殊值 2.检查起来很麻烦 2.通过异常 queue.remove(); //当队列为空,抛异常
语法: 1.如何定义异常 定义一种错误 2.如何抛出异常 表示当前调用发生了某种错误 throw new RuntimeException();//系统已经定义好的运行时异常 抛出了一个运行时异常 异常抛出去会中断当前的执行流,类似于return 3.如何处理异常 调用者的责任 try/catch/finally
捕获异常 try{ 可能会抛出异常的语句 list.get(0); throw new ArraysIndexOutOfBound();//throw后面是对象 }catch(NullPointerException e){ 只管处理该类空指针的异常,或者他子类的空指针异常,不处理其他类型的异常 } catch(Exception e){//捕获所有的异常,类似于基类的概念} catch(异常类型 异常对象名) catch(异常1|异常2 e)两个异常同一种处理方法 异常是从上往下匹配,一旦匹配中,就不匹配了
try{ //可能抛异常的语句 可以写一定会出现异常的,可以写可能会抛出异常的 若可能抛异常 却没抛异常,就执行try后面的, 跑了一场最后就执行finally中的 }finally{ 必须要执行的语句 } 因为抛异常会中断,不会执行下面的语句,这样写就可以抛异常后,还可以执行这个语句
有没有异常都会执行finally部分
也可以 try{}catch{}finally{}
try块不能省略,catch和finally不能同时省略,catch可以多重
try和finally中同时有return语句,try中不返回,先存起来,会返回finally的,若finally中没有return语句 则返回try中的
异常是一种对象,java中一切皆对象 只有你抛出的时候,异常对象才被实例化
e.printStackTrace();写在catch里,打印出异常的调用栈,可以追踪异常 getMessage() ;异常消息
发生了错误应该怎么办? 错误可能有哪些? 1.硬件错误 不可恢复的错误 CPU烧了 不要catch error 2.可恢复错误 1.网络卡了 1.重试 2.通知修复(自动/手动) 3.程序员造成的错误(代码错误) 尽可能早的暴露 不要catch或者catch后增加日志打印
Throwable(java中所有可被抛出的东西)分为Exeption 和error(不可恢复) Exception分为可恢复错误和RunTimeException(运行时异常)(程序员犯得错误) RE与error属于非受查异常 uncheck Exception中除了RE之外的是受查异常 check 抛Exception的异常时,也要在方法签名时写出来,它包括受查异常就当受查异常处理
是uncheck的,不用写 void method(){ //抛uncheck的异常 }
是check的,方法签名中要写出异常 void method() throws IOException{ //抛check的异常 不在签名中写会飘红 告诉用户掉这个方法有风险 或者自己catch掉就不用写在方法签名中 }
受查异常,必须在方法中加入异常列表 非受查异常,可写可不写,
受查异常:Exception及其子类(不包括RuntimeException)
非受查异常:Error及其子类和RuntimeException及其子类
try(){} 后面有括号,在try中执行完后自动关闭,主要因为try跟那个closeable有关 try(closeable c=new ) 无论是否发生异常,会调用c的close方法
自定义异常类 1.Exception的类 2.RunTimeException的类
异常: 1.通知错误的机制(运行时) 2.两个动作 1.抛出异常(发生错误) 2.铺货异常(错误处理) 3.语法 throw 异常对象; throw new Exception(); Exception e=new Exception(); throw e; try{...}catch(Exception e){ //分析 e; throw e; } 捕获: try必须{ }catch可选(异常类型exc){ }catch可选(异常1|异常2 exc){ }finally可选{ } 异常的匹配从上往下匹配,一旦匹配停止finally是一定会执行到的
try(Closable c=new Scanner(...)){ } 无论是否发生异常,会调用c的close方法