java的异常对象都是Throwable类派生出的,又分为两类:Error和Exception,Error是java运行时系统内部错误或者资源耗尽错误,Exception则是java程序本身的错误。各种异常子类多如牛毛,没有必要刻意去记,知道异常机制原理即可。
对于任何一个抛出异常的方法,如果没有处理器捕获这个异常,那么当前线程就会结束。java发展至今,已经总结出了很多已知的异常,并给出了相应的处理器,所以,我们应该去尽量避免这些已查异常的出现,对于未知的异常,应该在代码中做好异常处理,避免当前线程终止。
1、自定义异常类
异常类的目的就是用来描述问题的,当遇到任何标准异常类都不适合的问题时,就可以自己创建异常类,自定义的异常类派生于Exception类或者Exception类的子类,一般有两个构造方法:默认构造方法和带有一个字符串参数的构造方法, 字符串用于描述异常。
举个例子:定义异常类MyException 和 MyException2
public class MyException extends IOException {
public MyException(){}
public MyException(String description){
super(description);
}
}
public class MyException2 extends IOException {
public MyException2(){}
public MyException2(String description){
super(description);
}
}
public class Test {
//测试自定义异常类
public void customizedException(int a) throws MyException{
if(a < 10){
throw new MyException("我是自定义异常类");
}else {
throw new MyException();
}
}
public static void main(String[] args) throws MyException {
//测试自定义异常类
Test test = new Test();
test.customizedException(11);
}
}
运行结果:
这是抛出的默认构造方法创建的异常类对象。
这是抛出的带参构造方法创建的异常类对象。
由此可见,两个构造方法不同所带来的区别,且程序是以状态码1结束的,说明是非正常结束,那是因为程序中只是抛出了异常,并没有异常处理器捕获,因此导致程序直接终止。
2、try/catch 捕获异常
2.1 一个异常
try{
test.customizedException(9);
}catch (Exception e){
System.out.println(e.getMessage());
}
try{ }里面的代码是执行代码,如果执行过程中,抛出了异常,则看catch( )是否能够捕捉该异常(即抛出的异常类对象能否赋值给catch的参数,如果能,则捕捉到,否则,捕捉不到),如果能捕捉到该异常,则执行catch( ){ }部分的代码。
抛出的异常类对象能否赋值给catch的参数:意思是catch的参数类型要么就是异常类,要么就是异常类的父类或祖类。
还有一点:catch( )的参数变量隐含是final类型的,即不可更改。
2.2 多个异常
try{
test.customizedException(9);
}catch (MyException e){
System.out.println(e.getMessage());
}catch (MyException2 e){
System.out.println(e.getMessage());
}
如果try{ }里的代码可能会抛出多种异常,那么就用多个catch分别捕获即可,catch捕获了几个异常,就执行几个catch的代码,catch( )的参数的有效域仅限于当前catch。
如果try会抛出多种异常,但是有多种异常的意思是一样的(即多种异常都代表同一个东西出错了),假设(仅仅是假设)RuntimeException 和 IOException 都代表了同一种异常,那么可以写法如下,这样的写法需要注意的是,异常类之间没有父子关系或者继承关系。
try{
test.customizedException(9);
}catch (RuntimeException | IOException e){
System.out.println(e.getMessage());
}
2.3 catch抛出异常
在catch( ){ }里面再抛出异常,可以达到异常类型的转变,对原异常的描述信息进行覆盖或者追加。
Test test = new Test();
try{
test.customizedException(9);
}catch (MyException e){
throw new MyException2(e.getMessage()+"我是异常类2222");
}
运行结果:
来源:CSDN
作者:讲不出 再见
链接:https://blog.csdn.net/dgh112233/article/details/103614439