异常处理自我归纳

异常处理自我归纳

 异常分类如下:
    Object 类:
         Throwable类
                error:
                exception :  受检查异常和运行时异常(不受检查异常)

error

:其主要异常为java运行时系统内部错误或资源耗尽错误(通常是内存不够或者是字节码不合法),这类错误不是由于应用程序本身产生的,而是硬件方面的问题,应用程序不会抛出此类对象。如果出现此类错误,应该尽量使程序安全结束。

exception

:其包含的异常主要为两大类,受检查异常和运行时异常(RuntimeException)。

受检查异常:指的是当你在编写代码时编译器强制要求你处置的异常,如果不处置代码则会报错(无法编译)。

运行时异常:指的是编译器不是强制要求你解决的异常,虽然你的代码可能出错,但是编译器允许你进行编译。

常见受检查的异常

1、IOException(输入或输出异常,即读写异常)
发生情况:一般在读写数据时容易放生这种情况

2、FileNotFoundException
发生情况::创建File 对象时 (一是“拒绝访问”,二是“系统找不到指定路径”)
3、ClassNotFoundException
发生情况: (1)web.xml文件中根本就不存在该类的配置或者配置的路径写错;
(比较常 见)

(2)web.xml问件中存在,但是项目中类写错了名字;

(3)类放错了文件夹;

4、NullPointException(空指针异常)

常见不受检查的异常

1、ClassCastException(类转换异常)
发生情况:是JVM在检测到两个类型间转换不兼容时引发的运行时异常
2、IndexOutOfBoundsException(数组越界异常)
发生情况:数组操作越界时通常易发生
3、NullPointerException(空指针异常)
发生情况:定义的引用类型的变量,赋予null,并没有指向实际存在的一块内存空间当使用了该变量,会出现此错误
ArrayStoreException(数据存储异常,操作数组时类型不一致)

4、BufferOverflowException(还有IO操作的,缓冲溢出异常)

在处理异常时,什么时候使用try… catch ,什么时候使用 throws

       如果因为传参导致的异常,则应该使用trows 将其抛出
       其他情况使用  try ...catch 就地解决
        
        说白了就是如果当前方法由于自己的原因而产生的异常,应该自己原地解决,如果自己不解决,其异常一直会存在,一直抛,直到抛出到JVM那里,绕了一圈又回来,始终无法解决。但如果是它使用的其他对象产生的则,此时应当抛出去,抛到调用它的对象那里去

finally 关键字深刻理解(面试经常问的题目)

  通常所说的finally在try...catch 语句后,不管是否发生异常,其最后都会被执行
  
  但是什么情况下finally 是不执行的:
             一般为电脑突然断电后,程序在内存中不存在了,或者是执行了退出程序代码
            (system.exe());
          当程序执行了return 语句后,finally 语句是否执行  ?
              答案是执行的,因为当执行return 语句时,程序此时会准备一个 返回结果,即使没有要求返回
              结果,程序也会返回一个没有结果的结果,而在这个期间,就是finally语句执行的阶段

  判断输出的值:
public static void main(String []args){
    Person p = Go();
    System.out.println(p.age);
}
public static void Go{
      try{
            Person p = new Person();
            p.age = 20;
            return p;
      }catch(Exception e){
        
      }
      finally{
            p.age = 10;
      }
 }
static class Person{//成员内部类
       int age;
}

问此时输出 的年龄是多少??
     此时输出的结果 为 10,因为当此时执行finally 语句时,return 已经准备好了返回的 对象,此时返回对象的值是复制了一份 p的值,而复制的值是一个地址值,说白了,它输出的时候指向的还是堆内存里的值(已经经过finally修改过的),所以他输出的是10;
public static void main(String []args){
   int a = Go();
    System.out.println(a);
}
public static void Go{
      try{
            int a = 20;
            return a;
      }catch(Exception e){
        
      }
      finally{
            a = 10;
      }
 }

问此时输出 的年龄是多少??
此时输出的值为20,因为当此时执行finally 语句时,也是已经准备好了返回的值,此时返回的值,是备份 变量 a 的值,此时变量 a 所处的内存为栈内存,此时返回的就是复制的 a 的值,并不是指的是栈内存中的 a ,此时finally执行的语句改变的是栈内存中的值,所以输出的是20;(其根本原因是引用类型和非引用类型的关系)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值