05String&exception

本文深入探讨Java异常处理机制,包括try-catch-finally语句的使用,异常对象的创建与处理,以及如何自定义异常。文章还讲解了编译时异常与运行时异常的区别,以及如何通过throws和throw关键字正确地抛出和处理异常。
摘要由CSDN通过智能技术生成

  1. 发生异常后,错误之前的可以运行,错误之后不能够运行

  2. 当我们的程序终止之后, jvm此时就会进入,自己默认的错误处理流程

    a. 错误发生的地方,收集错误信总,并且创建异常(错误)对象,该异常对象包含这些错误信息

    b. 访问异常对象,获取实际发生的错误信息,输出到控制台窗口

  3. try-catch自己处理可能发生错误的代码,不让JVM来帮我们做(此时先执行我们的,处理不了让JVM来执行)

//异常处理语法:
try {
  //可能出现异常的,正常的代码逻辑,一旦出现错误,就由catch来处理(异常处理器)
} catch(Exception e) { //可以理解为传参
  //每一个catch分支对应一个异常处理器,用来处理同一个代码块出现的不同类型的异常
  //在catch分支中处理具体类型的代码异常
  //开发者是看不到这个错误信息的
  //但是会将公共错误信息输出到日志文件中  
}//catch之后的代码可以正常运行
 finally { //异常处理完毕后的处理逻辑
}

jvm会将创建的异常对象与catch分支做类型匹配,这些分支是互斥的,最多只会匹配一个

  • 异常处理类型之间存在父子的继承关系,所以catch分支的位置要选择得当,父类要放在后面
  • 同一个异常处理器可以处理属于同一种常类型的多种异常 catch(异常类型1 |异常类型2 |… )
  • 注:是|不是||
  • try-catch快捷键:Ctrl+Alt+T :要先选中试验代码

可以在文档中查看EXception的子类

Exception
ArithmeticException
ArrayIndexOfBoundsException
NullPointerException
.....
  1. 我们通常所使用的,获取异常信息的方法,都是定义在Throwable类中的:

    • getMessage()

      获取异常信息,返回字符串。例如 / by zero

    • toString()

      获取异常类名异常信息,返回字符串。

      相较于getMessage,还会输出异常类型名,例如:java. lang.ArithmeticException: / by zero

    • printStackTrace() :没有返回值,上面两个需要赋给一个引用变量

      获取异常类名异常信息,以及异常出现在程序中的位置,并打印到控制台。如:

      java. lang. ArithmeticException: /by zero 
      at com. cskaoyan. exception. exceptionhandle. Demo5ExceptionInfo. main (Demo5ExceptionInfo. iava: 31)
      
    • printStackTrace(PrintStream s) 涉及到流

      该方法将异常内容保存在日志文件中,以便查阅。

  • 要想调用类中的非静态方法,则需要创建该方法所属的类的对象

  • 编译时异常:即IDE划红线处,同样将该代码包起来,例:

    public void Access(){
            try {
                clone(); //将此处包起来,就不会出现编译时异常,取而代之的是异常输出,注:通过在类上加上一个接口implements Cloneable,那么什么也不会输出
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }
        }
    
    1. 异常抛出
      • 异常信息会层层向上抛出
      • 编译异常不会,如果想,可利用throws关键字(对于运行时异常没什么作用)
      • throws后可以跟多个异常类型
    class TestExceptionThrow{
        public void method1(){
        try{
            method2()}catch(Exception e){
            System.out.printin(e.tostring)
        }
        public void method2(){
    		int i = 9int j =0int result=i/1
    }
    
  • 正是因为有了这种异常信息的处理,使得不再成为口头约定,而是一种通用机制

修饰符 返回值(形参列表)throws 异常列表(}

  • pubtic static void main(string args){
        Demo3Throws obj1 = new Demo3Throws(); 
        try {
        	obj1. testThrows ();
            //为什么这里只有两个呢?答:第三种是运行时异常,没有必要
        } catch (CloneNotSupportedException e) {
        	e. printstackTrace();
        } catch (DataFormatException e) {
        	e. printstackTrace();
        }
    }
    public void testThrows() throws cloneNotSupportedException, DataFormatException, ArithmeticException {}
    //如果你比较关注具体的异常信息,则列出这些异常类型,否则直接写一个Exception即可
    //异常列表尽量不要出现父子关系的类型
    
  • 添加throws以后,方法覆盖需要注意的点:

    1. 异常类型完全相同,当然没有问题,除此之外,满足兼容(父类方法中的异常包含子类方法中的异常)
    2. 针对编译异常而言,父类没有,子类不能有
    3. 父类有,子类没有,OK

throw
1.在方法体中使用
2.主动在程序中抛出异常
3.每次只能抛出确定的某个异常对象

基本语法:
throw   异常对象
    
public void test(int i){
if(i <=0{//当参数值不合法的时候
//此时jvm不会自动帮我们创述异常对象,并将该异常,向上报告
RuntimeException runtimeException= new RuntimeException"i值的取值不合法");
//将异常对象向上抛出
throw runtimeExreption;  
}
  • 需要先创建一个异常对象

  • 如果要抛出编译时异常,要在方法声明中throws一下配合使用

    if(i<=0){
    //编译时异常
    Exception exception = new Exception"i值的取值不合法");
    //将异常对象问上抛出
    throw exception;
    }
    /*
    	throw语句后面的代码都不会执行
    */
    
  1. throws vs throw

    • throws
      用在方法声明后面,跟的是异常类名
      可以跟多个异常类名,用逗号隔开
      表示抛出异常,由该方法的调用者来处理
      throws表示出现异常的一种可能性,并不一定会发生这些异常
    • throw
      用在方法体内,跟的是异常对象名
      只能抛出一个异常对象
      表示抛出异常,可以由方法体内的语句处理
      throw则是抛出了异常,执行throw则一定抛出了某种异常
  2. 原则:如果该功能内部可以将问题处理用try,如果处理不了,交由调用者处理用throws

  3. finally 的特点
    1.被finally修饰的代码块中的代码一定会执行

    2.特殊情况:在执行到finally之前jvm退出了(比如system.exit(0))

  • try{
    int i = 1//int result=i/0;return;catch(Exception e)
    System.out.println("产生了异常");
    }finally{
        //释放系统资源
    System.out.println("hello finally");
    }
    }
    
  
* 用于释放资源,在IO流操作和数据库操作中会见到

> 面试题:
>
> 1.final,finally 和<u>finalize</u>(Obj里面的一个方法,当一个对象变成垃圾,准备被<u>垃圾回收器</u>回收之前,才会被JVM执行)的区别 
> 1如果catch里面有return语句,请问finally的代码还会执行吗?
> 如果会,请问是在return前还是return后
>
> 答:

:question: IDEA怎么将代码快抽成一个方法

```java
private static int test(){
	int i;
    try{
        i=10;
        i =i/0;
    }catch(Exception e){
        System.out.printIn("发生了异常");
        i= 20;
        return i;
        }finally{
        system.out.println("finally");//本来执行完return i就应该返回的,结果碰到了强制执行的finally,又继续执行finally里面的代码快,完了以后后面就不再执行了
        і = 100;
    }
        System.out.println("'before return");
    //这个return,是在骗编译器
        return i;
    }
结果:返回值是20

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R0HF4SXc-1584796573903)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20200321134536581.png)]

碰到了强制执行的finally,又继续执行finally里面的代码快,完了以后后面就不再执行了
і = 100;
}
System.out.println("'before return");
//这个return,是在骗编译器
return i;
}
结果:返回值是20




[外链图片转存中...(img-R0HF4SXc-1584796573903)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值