一、全部异常都继承于Throwable类,其下有两大子类:java
(1)Error类:错误,通常编程人员不太接触,如虚拟机错误、线程死锁等。硬伤:使程序崩溃 ,没办法处理sql
(2)Exception类:异常,编码、环境、用户输入等问题,其子类主要有:编程
非检查异常(运行时异常RuntimeException):【由java虚拟机自动捕获】 空指针NullPointer 越界ArrayIndexOutofBounds 错误类型转换ClassCast 算数异常Arithmetic 等等
检查异常CheckException:【须要手动添加捕获和处理语句】文件IO异常、sql异常等等
异常处理: 1、try-catch(多catch块)-finally (1)try块:负责捕获异常,一旦try中发现异常,程序的控制权将被移交给catch块中的异常处理程序。【try语句块不能够独立存在,必须与 catch 或者 finally 块同存】 (2)catch块:如何处理?好比发出警告:提示、检查配置、网络链接,记录错误等。执行完catch块以后程序跳出catch块,继续执行后面的代码。 编写catch块的注意事项:多个catch块处理的异常类,要按照先catch子类后catch父类的处理方式,由于会【就近处理】异常(由上自下)。 (3)finally:最终执行的代码,用于关闭和释放资源等 ============================================================ try{ //一些会抛出检查异常的java语句 }catch(Exception e){ //处理该异常的代码块 }finally{ //最终要执行的代码 } System.out.println(""); 若是有异常抛出,方法结束执行,异常会由系统捕获,并交给相应的catch去处理(抛出提醒或记录日志等),异常代码块外代码正常执行。 try会抛出不少种类型的异常,多个catch块捕获多钟错误。 多重异常处理代码块顺序问题:先子类再父类(顺序不对也会提醒错误),finally语句块处理最终将要执行的代码
一、无论有木有出现异常,finally块中代码都会执行; 二、当try和catch中有return时,finally仍然会执行; 三、finally是在try和catch中的return后执行的(先把要返回的值保存起来,无论finally中的代码怎么样,返回的值都不会改变,仍然是以前保存的值),因此函数返回值是在finally执行前肯定的; 四、finally中最好不要包含return,不然程序会提早退出,返回值不是try或catch中保存的返回值。而是finally中的值。 1.e.printStackTrace()能够输出异常信息 2.return -1:为抛出异常的习惯写法 3.若是方法中try,catch,finally中没有返回语句,则会调用这三个语句块以外的return结果 4.finally块不管如何,无论前面是正常仍是异常,都要执行。 5.finally 在try中的return以后 在返回主调函数以前执行。
finally 在try中的return以后 在返回主调函数以前执行。网络
两个重要的关键字:throw和throws 1.throws的异常列表标识可能抛出的异常,多是抛出一条异常,也多是抛出多条异常,每一个类型的异常中间用逗号隔开 2.方法体中调用会抛出异常的方法或者是先抛出一个异常:用throw new Exception() throw写在方法体里,表示“抛出异常”这个动做 3.若是某个方法调用了抛出异常的方法,那么必须添加try catch语句去尝试捕获这种异常,或者添加声明,将异常抛出给更上一层的调用者进行处理
自定义异常: class 自定义异常类 extends 异常类型{} 上面的异常类型能够是Exception,也能够是其子类
一、处理运行时异常时,采用逻辑去合理规避同时辅助try-catch处理 二、在多重catch块后面,能够加一个catch(Exception)来处理可能会被遗漏的异常 三、对于不肯定的代码,也能够加上try-catch,处理潜在的异常 四、尽可能去处理异常,切记只是简单的调用printStackTrace()去打印 五、具体如何处理异常,要根据不一样的业务需求和异常类型去决定 六、尽可能添加finally语句块去释放占用的资源