Java-异常处理

Java语言具有如下的异常处理机制:当程序运行出现意外情形时,系统会自动生成一个异常对象来通知程序。在程序中,我们可以使用特定的语句来捕获异常对象,读取对象中的信息,进而做出处理。也可以使用特定的语句抛出异常对象,将这个异常对象交给程序的调用者处理。
异常的继承体系
  • 所有的非正常情况被分为两类:
错误(Error)和异常(Exception),其中Error代表虚拟机相关问题,一般无法处理,也无需处理。
  • 所有的 Exception 被分为两类
  1. RuntimeException,代表运行时异常,程序可以显式处理这种异常,也可以不处理,而是交给顶层调用者统一处理。
  2. 非运行时异常(Checked异常),程序必须显式地处理这种异常,否则在编译阶段会发生错误,导致程序无法通过编译。
捕获异常
语法:
	
try {
业务逻辑代码
}
catch (AException e) {
A异常的处理代码
}
catch (BException e) {
B异常的处理代码
}
...
finally {
回收资源代码
}
说明:
  1. 无论哪行代码发生异常,系统都会生成一个异常对象,这与try...catch...语句没有关系;
  2. 若程序没有对这个异常对象做任何处理,则程序在此退出;
  3. 创建异常对象后,JVM会寻找可以处理它的catch块,并将异常对象交给这个catch块去处理;
  4. 程序应该先处理小异常、再处理大异常,即将处理父类异常的catch块放在处理子类异常的catch块之后;
  5. finally块中代码总是会被执行,它必须位于try、catch之后,通常用来释放资源;
  6. try是必须的,catch、finally是可选的,但catch、finally二者之中至少要出现一个。
声明抛出异常
语法:
	
throws ExceptionClass1, ExceptionClass2, ...
说明:
  1. throws语句用于标识某方法可能抛出的异常,它必须位于方法签名之后;
  2. throws语句声明抛出异常后,程序中旧无需使用try语句捕获该异常了;
  3. 在重写时,子类方法声明抛出的异常类型不能比父类方法声明抛出的异常类型大。
抛出异常
语法:
	
throw ExceptionInstance;
说明:
  1. throw语句用于在程序中主动抛出一个异常;
  2. throw语句抛出的不是异常类型,而是一个异常实例;
  3. 对于主动抛出的异常,也可以采用try块捕获,或者采用throws语句向外抛出。
异常的处理原则
  1. 不要多度的使用异常:
不要用异常处理代替错误处理代码,不要用异常处理代替流程控制语句;
  1. 不要忽略捕获的异常:
对于捕获到的异常,要进行合适的修复,对于不能处理的部分,应该抛出新的异常;
  1. 不要直接捕获所有的异常:
应对不同的异常做出有针对性的处理,而捕获所有的异常,容易压制(丢失)异常;
  1. 不要使用过于庞大的try块:
庞大的try块会导致业务过于复杂,不利于分析异常的原因,也不利于程序的阅读及维护。
全部评论

相关推荐

09-08 21:59
西北大学 Java
1. 这段实习里面哪个项目对你帮助比较大?2. 重构过程中怎么保证安全性的?3. 在重构过程中有遇到哪些问题吗?兼容性问题?bug?4. 之后如果要做这方面重构有什么建议或者理解?5. 上线后怎么去评估功能是否完善?6. 物联网的课程设置有什么特点?与计科有什么区别?7. 编译原理?汇编语言?8. 对嵌入式编程有什么理解?与正常的企业项目有什么区别?9. 用在服务器中的linux和用在嵌入式系统的linux有什么区别?10. 为什么嵌入式大部分用C和C++?11. 嵌入式的内存、CPU都有多大?12. 讲下面向对象的特性13.  在开发中觉得这些特性重要吗?14. 反射的机制知道吗?15. 一个java后端项目分层一般怎么做?16. 了解哪些数据库产品?17. 数据库设计表有什么原则?18. 联合索引设计有什么注意事项?19. 什么时候数据库需要分库分表?20. 项目中用过分库分表吗?21. 项目中用了哪些RPC组件?了解哪些?22. RPC组件一般网络中都会使用NIO模型,说说你了解的BIO、NIO模型23. NIO的特性基于操作系统方面有哪些了解?24. 多路IO复用对应操作系统的哪部分?25. epoll有两种模式,哪两种?有什么作用?26. 现在HTTP服务是基于NIO还是BIO?27. HTTP的网络方面的能力有什么?比如指定一个组件的能力?指定并发量?28. HTTP请求处理网络IO的能力?29. 现在我发一个HTTP请求给你,这个网络请求传输按分层来讲会怎么传输?封装和拆包的过程30. 以太包到哪就结束了?然后拆包去传输?31. 整个传输过程中每次拆包都会要CPU参与吗?32. HDFS和K8S有接触吗?消息队列有用到吗?33. 算法:找到链表倒数第n个节点
点赞 评论 收藏
分享
09-19 15:57
南开大学 Java
📍面试公司:字节🕐面试时间:9月19💻面试岗位:后端❓面试问题:只说我觉得稍微有难度的,基础的不写了一.八股1.ARP欺骗是什么(先问的我输入一个网址到回显的过程,我中途提到了arp会去找mac地址,然后就问我ARP欺骗是什么,凭感觉说了下)2.消息队列怎么保证三个层面可靠性,有序性,不丢失?3.消息队列有很多个,如何取舍选择哪个呢?4.详细说说堆这个数据结构5.进程间通信方式?各自的优缺点。二.场景题你有一台机器,很小的内存,现在你有一个很大的日志,日志里面只记录了IP地址,实现一个算法找出访问次数最大的IP(我说用hash,面试官说ip都装不下,你map里又要记录ip又要记录次数,能装下吗?后面说分治)三.项目1.为什么用http和mq通信?为什么不用RPC?2.消息队列如何保证不重复消费?存在redis里的话用什么数据结构?什么时候移除?3.这个项目有哪些表?追问订单信息这个表构建索引了吗?应该怎么对这个表构建索引?哪些字段加索引?4.讲讲微服务间如果通信?讲讲锁单/结算/退单流程?5.讲讲动态配置中心怎么实现的?限流器怎么实现的,为什么用本地缓存,能用redis吗,redis怎么实现限流器?四.手撕删除倒数第n个链表节点(面试官有点皮,故意让我输入需要特判的情况,比如n大于链表长度了,比如删除了链表的头节点)🙌面试感想:还行,百分之95都答上了,继续加油!!!
查看12道真题和解析
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

更多
正在热议
更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务