Java异常基础知识

【更多资讯及资料获取,关注微信公众号号:浅醉JAVA】

最近总结复习,所以写下这篇文章,不喜勿喷,如有建议,欢迎沟通交流。--------「Bang」

1.1  异常分类

目录

 

1.1  异常分类

编译时异常—运行时异常(RuntimeException)

1.1.1 区别:

1.2 JVM 默认是如何处理异常的

1.3 自主处理异常的两种方式:

1.4 注意:

1.4.1  try…catch…

1.4.2 throws

1.4.3 finally

1.5 自定义异常

1.5.1 为什么需要自定义异常?

1.5.2 如何自定义异常?

1.6 异常的注意事项及如何使用异常处理

 1) 继承中的异常:抛出

2) 如何使用异常处理


编译时异常—运行时异常(RuntimeException)

  
异常超级接口:Throwable

getMessage()        :获取异常信息,返回字符串

toString()              :获取异常类名和异常信息,返回字符串

printStackTrace()  :打印异常类名和异常信息,以及异常出现在程序中的位置。(JVM默认就使用这种方式处理异常。)

1.1.1 区别:

   所有的RuntimeException类及其子类的实例被称为运行时异常,其他的异常就是编译时异常

   编译时异常:java程序必须显示处理,否则程序就会发生错误,无法通过编译。

   运行时异常:无需显示处理,也可以和编译时异常一样处理。


   编译时异常:比如涉及到外部资源时,会让处理异常。不处理编译不通过。

                 (未雨绸缪异常:在做事时,先做好出现坏结果时的处理方法)

                   如:FileInputStream fs = new FileInputStream(“my.file”);  -à会让进行异常处理

   运行时异常:就是程序员所犯的错误,需要修改代码来解决。

1.2 JVM 默认是如何处理异常的

main函数收到这个问题时,有两种处理方式:

   a. 自己将该问题处理,然后继续运行

   b. 自己没有针对的处理方式,只有交给调用main的JVM来处理

JVM有一个默认的异常处理机制,就是将该异常进行处理。并将该异常的名称、信息、位置打印在控制台上,同时将程序停止运行。

1.3 自主处理异常的两种方式:

      

 A : try… catch …finally               :处理异常后,程序继续向下执行

                 try{

                        try 用来检测异常

                 }catch(NullPointException e){

                      可以有多个catch

                }catch(Exception e){

                        catch 用来捕获异常

              }finally{

                     finally用来释放资源

                   如:关闭数据库、流

           }

B : throws

定义功能方法时,需要把出现的问题暴露出来让调用者去处理。

那么就通过throws在方法上标识。

编译时异常:必须抛出

运行时异常:也可以不处理,不抛出

1.4 注意:

1.4.1  try…catch…

1)安卓,客户端开发:如何处理异常? try{ }catch(Exception  e) {  }

2)ee, 服务端开发:一般都是底层开发,从底层向上抛。

 

3)try后跟多个catch时,要把小的异常放前边,大的异常放后边。如果大在前,将会接收所有小异常。

4)JDK 1.7 多个catch处理新特性

       catch(NullPointExceptin | IndexOutOfRangeException  e){  } 可以多个异常在一个里面

1.4.2 throws

1)  编译时异常抛出

因为抛出的时Exception包含了编译时异常,所以要求必须显示的抛出处理。

public class ExceptionTest {
    private int age;
    public int getAge() {
        return age;
    }

    public void setAge(int age) throws Exception {
        if(age > 0 && age <= 150){
            this.age = age;
        }else{
            //将异常向上抛出给调用该方法的的main方法处理
            throw new Exception("年龄非法");
        }
    }

    //throws 又将该异常继续上抛出给调用这个main方法的JVM处理
	//throws 标识,标识提醒JVM此处可能有异常
    public static void main(String[] args) throws Exception {
        ExceptionTest test = new ExceptionTest();
        test.setAge(100);
    }
}

2)  运行时异常抛出

下例是抛出的运行时异常,所以不要求进行处理。可以抛出也可以不抛出。

public class ExceptionTest {
    private int age;
    public int getAge() {
        return age;
    }

    public void setAge(int age){
        if(age > 0 && age <= 150){
            this.age = age;
        }else{
            //因为抛出的是 运行时异常 不要求必须处理,所以可以抛出也可以不抛出处理。
            throw new RuntimeException("年龄非法");
        }
    }

    public static void main(String[] args){
        ExceptionTest test = new ExceptionTest();
        test.setAge(100);
    }
}

3) throw 和 throws的区别

throws : 定义功能方法时,需要把出现的问题暴露出来让调用者去处理。

throw 的概述:

       在功能方法内部出现某种情况,程序不能继续进行。需要进行跳转时,就用throw把异常对象抛出。

区别:

       throws :

              用在方法声明后面,跟的时异常类名

              可以跟多个异常类名,并用逗号隔开(无先后顺序)

              表示抛出异常,由该方法的调用者来处理

       throw:

              用在方法内部,跟的时异常对象。

              只能抛出一个异常对象

              表示抛出异常,有方法内部的语句处理。

1.4.3 finally

1) finally的特点

       ==被finally控制的语句体一定会执行

       ==特殊情况:在执行到finally之前,JVM退出了(比如:System.exit(0))

2)   finally的作用:

       ==用于释放资源,在IO流操作中和数据库操作中常见

3)      finally 和 final / finalize的区别

       == final修饰类 、方法、变量

              final修饰的类不能被继承,方法不能被重写,变量只能赋值一次。

       == finally 是try语句中的一个语句体,不能单独使用,用于释放资源

== finalize 是一个方法。当垃圾回收器确定不存在对某对象的更多应用时,由对象回收    器调用该对象的该方法,回收该对象。

4) 如果catch里面有return语句,

请问finally的代码还会执行吗?

如果会,请问是在return前,还是后?

 

== 会执行。

== 在return 中间执行,return先开始操作,并没有彻底返回执行,而是在有finally的时候,执行完finally在进行彻底return。


1当: finally中没有return时 ,try或catch中有return?

在return中间,显示按照顺序执行,try或catch中的return一次,但是并没有真正的返回结果结束程序,而是已经把结果给了主函数(此后的操作不会对结果有影响),然后继续进行逻辑执行,即try-catch-finally的逻辑。最后会再一次执行try或catch中的return,返回上次给的结果,结束程序。

2 当:finall中有return时,无论try-catch什么情况?

如果catch中有return,则是catch先发起return,并将结果给到main方法,但并没有彻底结束。此时,再执行finally中的return,算是发起一次新的return,它的结果将覆盖旧的return结果。所以最终返回的时finally中的结果。

但是正常情况下,finally语句中是绝对不能写return返回语句的,因为它会覆盖try和catch中的结果。使他们毫无意义,就是犯罪啊。 他的真正作用是用来释放资源的。

3  另外,try语句块中能够抛出异常,然后执行catch语句;

结论:finally中的代码是在return 和break语句中间执行的。

1.5 自定义异常

1.5.1 为什么需要自定义异常?

==通过名字其他的异常区分开来,便于异常问题的排查和处理。

1.5.2 如何自定义异常?

       == 继承 Exception

       == 继承 RuntimeException

              重写他们的构造方法。

 

1.6 异常的注意事项及如何使用异常处理

 1) 继承中的异常:抛出

           == 子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类(父亲坏了,儿子不能比父亲更坏)

           == 如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或是他的子类,子类不能抛出父类没有的异常。

           == 如果被重写的方法没有异常抛出,那么子类绝不可以抛出异常,如果子类方法内由异常发生,那么子类只能try,不能throws

 

2) 如何使用异常处理

           == 原则:如果该功能内部可以将问题处理,用try;处理不了,交由调用者处理,,用throws

           == 区别:后续程序需要继续运行就try

                        后续程序不需要继续进行就throws   ( throw会将异常抛给调用者并停止程序运行)

           == 如果JDK没有提供对应的异常,许哟啊自定义异常

【更多资讯及资料获取,关注微信公众号号:浅醉JAVA】

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值