首页 技术 正文
技术 2022年11月14日
0 收藏 416 点赞 3,283 浏览 3270 个字

异常体系结构

1、所有异常都继承于Throwable类,其下有两大子类:

(1)Error类:错误,一般编程人员不太接触,如虚拟机错误、线程死锁。硬伤:使程序崩溃

(2)Exception类:异常,编码、环境、用户输入等问题,其子类主要有:

· 非检查异常(运行时异常RuntimeException):【由java虚拟机自动捕获】如空指针NullPointer、越界ArrayIndexOutofBounds、错误类型转换ClassCast、算数异常Arithmetic   等。

· 检查异常CheckException:【需要手动添加捕获和处理语句】文件异常IO等。

异常处理

一、try-catch(多catch块)-finally

(1)try块:负责捕获异常,一旦try中发现异常,程序的控制权将被移交给catch块中的异常处理程序。【try语句块不可以独立存在,必须与 catch 或者 finally 块同存】

(2)catch块:如何处理?比如发出警告:提示、检查配置、网络连接,记录错误等。执行完catch块之后程序跳出catch块,继续执行后面的代码。

· 编写catch块的注意事项:多个catch块处理的异常类,要按照先catch子类后catch父类的处理方式,因为会【就近处理】异常(由上自下)。

(3)finally:最终执行的代码,用于关闭和释放资源等

===================
异常处理

try-catch以及try-catch-finally

try{

  //一些会抛出的异常

}

catch(Exception e){

  //处理该异常的代码块

}

finally{

  //最终要执行的代码

}

如果在try语句块中的任何代码抛出了一个在catch子句中说明的异常类,那么:

1)程序将跳过try语句块的其余代码。

2)程序将执行catch子句中的处理器代码。

如果在try语句块中的代码没有抛出任何异常,那么程序将跳过catch子句。

如果方法中的任何代码抛出了一个在catch子句中没有声明的异常类型,那么这个方法就会立即退出。

终止执行,交由异常处理程序(抛出提醒或记录日志等),异常代码块外代码正常执行。

try会抛出很多种类型的异常,多个catch块捕获多钟错误。

多重异常处理代码块顺序问题:先子类再父类(顺序不对也会提醒错误),finally语句块处理最终将要执行的代码。

try语句可以只有finally子句,而没有catch子句。事实上,在需要关闭资源时,用这种方式使用finally子句是一种不错的选择。

注:
1、try…catch…捕获单个异常,当有多个异常时,使用多重catch语句。【注意:顺序问题(先子类后父类)】
2、InputMismatchException输入不匹配异常;ArithmeticException算数异常。
3、finally语句用于处理异常后的善后工作,比如关闭打开的网址,打开的文件等等。

return在try-catch-finally中:

1、不管有没有出现异常,finally块中代码都会执行;

2、当try和catch中有return时,finally仍然会执行;

3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,仍然是之前保存的值),所以函数返回值是在finally执行前确定的;

4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。

注:
1、e.printStackTrace()可以输出异常信息;
2、-1为抛出异常的习惯写法;
3、如果方法中try, catch, finally中没有返回语句,则会调用这三个语句块之外的return结果;
4、finally块无论如何,不管前面是正常还是异常,都要执行;
5、finally 在try中的return之后 在返回主调函数之前执行。

异常抛出

两个重要的关键字:throw 和 throws

throw — 将产生的异常抛出(动作)

throws — 声明将要抛出何种类型的异常(声明)

  public void 方法名 (参数列表) throws 异常列表 {

    //调用会抛出异常的方法或者:

    throw new Exception(); 

  }

1、throws的异常列表可以是抛出一条异常,也可以是抛出多条异常,每个类型的异常中间用逗号隔开。

2、方法体中调用会抛出异常的方法或者是先抛出一个异常:用throw new Exception()
    throw写在方法体里,表示“抛出异常”这个动作。

3、如果某个方法调用了抛出异常的方法,那么必须添加try catch语句去尝试捕获这种异常。

自定义异常

class 自定义异常类 extends 异常类型{

}

Java中的异常链

只有Error,Exception,RuntimeException提供了带cause参数的构造器,其他的所有异常类只能通过initCause()来设置cause。

所有Throwable的子类构造器中都可以接受一个cause对象作为参数。cause是异常原由,代表着原始异常。既可以在当前位置创建并抛出行的异常,也可以通过cause追踪到异常最初发生的位置。

异常链是一种面向对象编程技术,指将捕获的异常包装进一个新的异常中并重新抛出的异常处理方式。原异常被保存为新异常的一个属性(比如cause)。这个想法是指一个方法应该抛出定义在相同的抽象层次上的异常,但不会丢弃更低层次的信息。

把捕获的异常包装成新的异常,在新异常里添加原始的异常,并将新异常抛出,它们就像是链式反应一样,一个导致(cause)另一个。

实现异常链功能的两种基本写法:

public class chainTest {/**
* @param args
* Test1抛出喝大了异常
* Test2调用test1捕获了喝大了异常,并且包装成运行时异常,继续抛出
* main方法中调用test2尝试捕获test2方法抛出的异常
*/
  public static void main(String[] args) {
    try{ // TODO Auto-generated method stub
    chainTest ct=new chainTest();
    ct.Test2();    }
    catch(Exception e){
    e.printStackTrace();
    }
  }  public void Test1()throws DrunkException{
    throw new DrunkException("喝车别开酒");
  }  public void Test2(){
    try{
      Test1();
    }    catch( DrunkException e){
      RuntimeException rte=new RuntimeException(e);
      //rte.initCause(e);      throw rte;
    }
  }
}

带资源的try语句

如果try块抛出一个异常,而且close方法也抛出一个异常,这就会带来一个难题。带资源的try语句可以很好地处理这种情况。

带资源的try语句的最简单形式为:

try (Resource res = …)

{

  work with res

}

try块退出时,会自动调用res.close()。

应用中的经验与总结

1、处理运行时异常时,采用逻辑去合理规避同时辅助try-catch处理

2、在多重catch块后面,可以加一个catch(Exception)来处理可能会被遗漏的异常

3、对于不确定的代码,也可以加上try-catch,处理潜在的异常

4、尽量去处理异常,切忌只是简单的调用printStackTrace()去打印

5、具体如何处理异常,要根据不同的业务需求和异常类型去决定

6、尽量添加finally语句块去释放占用的资源

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,500
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,914
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,747
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,504
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,142
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,306