序:
在使用计算机语言进行项目开发的过程中,即使程序员把代码写得尽善尽美,在系统的运行过程中仍然会遇到一些问题,因为很多问题不是靠代码能够避免的,比如:客户输入数据的格式,读取文件是否存在,网络是否始终保持通畅等等。。
java程序在执行时,所发生的异常事件可分为两类:
Error : java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。一般不编写针对性的代码进行处理。
Exception : 其他因变成错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如:
①空指针访问
②试图读取不存在的文件
③网络连接中断
面对错误的处理方式:
①遇到错误就终止程序的运行
②由程序员在编写程序时,就考虑到错误的检测、错误消息的提示,以及错误的处理
错误分类:
①编译时异常(执行javac.exe命令时,出现的异常)
②运行时异常(执行java.exe命令时,出现的异常)
当执行一个程序时,如果出现异常,那么异常之后的代码就不再执行!
异常的处理机制:
Java采用异常处理机制,将异常处理的程序代码集中在一起,与正常的程序代码分开,使得程序简洁,并易于维护。
java提供的是异常处理的抓抛模型
java程序的执行过程中如出现异常,会生成一个异常类对象,该异常对象将被提交给java运行时系统,这个过程称为抛出(throw)异常;
自动抛出
手动抛出
异常对象的生成:
由虚拟机自动生成:程序运行过程中,虚拟机检测到程序发生了问题,如果在当前代码中没有找到相应的处理程序,就会在后台自动创建一个对应异常类的实例对象并抛出——自动抛出
try{ //运行代码 }catch(Exception e){ e.printStackTrace();//异常处理语句 }finally{ //最终执行语句 }
由开发人员手动创建:Exception exception = new ClassCastException();——创建好的异常对象不抛出对程序没有任何影响,和创建一个普通对象一样
注:① try内声明的变量,类似于局部变量,出了try{}语句,就不能被调用
② finally是可选的。
③ catch语句内部是对异常对象的处理:
>getMessage(); >printStackTrace();
④ 可以有多个catch语句,try中抛出的异常类对象从上往下去匹配catch中的异常类的类型,一旦满足就执行catch中的代码。执行完,就跳出其后的多条catch语句。
⑤如果异常处理了,那么其后的代码继续执行。
⑥若catch中多个异常类型是“并列”关系,孰上孰下都可以
若catch中多个一次类型是“包含”关系,必须将子类放在子类的上面,否则报错。
⑦finally中存放的是一定会被执行的代码,不管try中、catch中是否仍有异常未被处理,以及是否有return语句
⑧try - catch是可以嵌套的。
♥运行时异常:可以不显示的进行处理
♥编译时异常:必须要显示的进行处理
异常处理方式二:在方法的声明处,显示的抛出该一次对象的类型
格式:如:public static void method1()throws Exception{}
当在此方法内部出现异常的时候,会抛出一个异常类的对象,抛给方法的调用者。
异常的对象可以逐层向上抛,直至main中,当然在向上抛的过程中,可以再通过 try - catch - finally 进行处理
java异常的处理:抓抛模型
①抓:异常的处理,有两种方式(①try -catch -finlly ②throws +异常的类型)
②抛:一旦执行过程中,出现异常,会抛出一个一次类的对象。(自动的抛出 Vs 手动的抛出(throw + 异常的对象))
>手动抛出:throw new RuntimeException("出现异常");
>手动抛出的异常类,即可以是现成的异常类,也可以是自己创建的异常类
手动抛出异常的例子:
抛出的异常类型若是RuntimeException,可以不显示的处理
若是一个Exception,必须要显示的处理
子类重写的父类的方法,其抛出的异常类型只能是被重写的方法的异常类的子类或异常类型一样