有金钱之外的思想,保留一点自己值得自傲的地方,人生活得更加有意义。

简介

  • 写程序的过程中,会遇到很多问题。比如:你写了个接口,然后用户输入的接口参数并不满足你的要求,导致程序出了一些问题,这个时候我就需要想办法处理这些问题。
  • 软件程序在运行过程中,非常可能遇到异常问题,这种异常问题在程序中叫异常,英文是Exception,意思是例外。程序中要做的就是合理的设计解决异常,让程序不崩溃

异常的分类

异常主要分为以下三种类型:

  • 检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在的文件时,一个异常就发生了,这些异常在编译时不能被简单的忽略。
  • 运行时异常:运行时异常是可能被程序员避免的异常。与检查型异常相反,运行时异常可以在编译时被忽略。
  • 错误:错误不是一场,而是脱离程序员控制的问题。

异常体系结构

  • Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。
  • Java API中已经定义了许多异常类,这些异常类分为两大类,错误Error和异常Exception
  • Error 大多数情况是虚拟机抛出的,大多数情况与编写者无关也有关,需要视情况调优
    • VirtulMachineError 虚拟机异常

      • StackOverflowError 函数调用栈太深了,检查代码是否有循环调用方法而无法退出的情况,例如:递归没有结束判断就会发生该问题,原因:栈是有最大栈深度的,当你无限的入栈,栈空间肯定会溢出报错
      • OutOfMemoryError 在虚拟机扩展栈是无法申请到足够的空间,则抛出该异常,例如:多线程环境下,所有线程都在执行任务并且都没有及时回收,从而不断申请内存,导致扩展栈时无法申请到足够的空间
    • AWTError GUI图形界面化编程相关异常
  • Exception
    • IOException IO流相关异常

      • EOFException(END OF FILE)本质就是个消息,告诉你文件到了结尾的地方
      • FileNotFoundException 访问了不存在的文件或者访问到了一个目录而不是文件,就会抛出这个异常
    • RuntimeException 运行时异常
      • ArrithmeticException 算数异常,比如除数为零的时候
      • MissingResourceException 资源缺失异常,没加载依赖包就先执行程序导致的
      • ClassNotFoundException 类没找到,基本就是名字写错了,类放错了位置
      • NullPointerException 空指针异常
      • IllegalArgumentException 不合法的参数异常
      • ArrayIndexOutOfBoundsException 数组下标越界异常
      • UnkownTypeException 遇到未知种类的类型

区别

  • Error通常是灾难性的错误,因为发生该错误的时候,程序是无法控制的,JVM会选择终止线程;Exception通常是可以被程序处理的,并且在程序中应该尽可能的去处理这些异常。

异常处理

  • 五个关键字:try、catch、finally、throw、throws

案例:

 public class ErrorController {public static void main(String[] args) {try{new ErrorController().deom(0,1);}catch(ArithmeticException e){e.printStackTrace();}}// throws 如果这个方法处理不了这个异常,可以吐出异常,由上层调用者解决异常public void demo(int a,int b) throws ArithmeticException{if(a == 0){// throw 主动抛出异常throw new ArithmeticException();}//监控代码try{System.out.println(b/a);//捕获异常 ArithmeticException--计算异常}catch (ArithmeticException e){System.out.println("计算出现问题");// catch可以写多个,捕获多个异常,但必须从小到大捕获}catch (Throwable t){System.out.println("我能捕获所有异常");// 不管有没有异常都执行该代码,处理善后}finally {System.out.println("程序执行完毕");}}}

自定义异常

  • 使用Java内置的异常类可以描述在编程时出现的大部分情况,当然也可以自定义异常,只需要继承Exception类即可
  • 在程序中使用自定义异常类,大体可以分为一下几个步骤:
  1. 创建自定义异常类
  2. 在方法中通过throw关键字抛出异常对象
  3. 如果在当前抛出的异常的方法中处理异常,可以使用try-catch语句捕获并处理;否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作
  4. 在出现异常方法的调用者中捕获并处理异常
 // 自定义异常类public class MessageException extends Exception {private String message;public MessageException(String message) {this.message = message;}@Overridepublic String toString() {return "MessageException{"+"message='" + message + ''' +'}';}}// 调用自定义异常public static void main(String[] args){int a = 0;int b = 1;//监控代码try{System.out.println(b/a);//捕获异常}catch (ArithmeticException e){try {throw new MessageException("错了啊");} catch (MessageException messageException) {System.out.println(messageException); // 输出 MessageException{message='错了啊'}程序执行完毕}}finally {System.out.println("程序执行完毕");}}

常见问题及建议

  • 所有的异常中最常见的应该就是空指针异常NullPointerExpetion,对于空指针异常应该遵循早暴露,早修复的原则,禁止使用catch隐藏该异常
  • 应该养成良好的习惯来降低NullPointerException的产生,例如:
 // 成员变量初始化时应该使用""而不是nullprivate String name = "";// 返回数组的时候,应该返回空数组而不是nullreturn new String[0]// 如果非要用null作为返回值,应该是用Optional.empty();return Option.empty();// 这样调用方需要使用Optional.isPresent()判断是否有结果

总结

  • 处理运行时异常时,采用逻辑去合理规避同时辅助try-catch处理
  • 在多重catch块后面,可以加一个catch(Exception)来处理可能会被遗漏的其他异常
  • 对于不确定的代码,也可以加上try-catch处理潜在的异常
  • 尽量去处理异常,切记只是简单的调用printStackTrace()去打印
  • 具体如何处理异常,要根据不同的业务需求和异常类型去决定
  • 尽量添加finally语句块去释放占用的资源

本文作者《猿氏·凯》,如果雷同,纯属抄袭····

异常导致循环退出_Java异常有哪些?异常怎么处理?相关推荐

  1. java异常类型 数组越界_java数组中的异常类型整理

    对于程序中出现异常,是很多程序员不想看到的情况,因为这就需要我们去查询异常的原因,然后进行一些处理异常的操作.在Java数组操作时,也会有一些异常情况的发生.这里我们罗列出了两种:ClassCastE ...

  2. 使用@Async异步注解导致该Bean在循环依赖时启动报BeanCurrentlyInCreationException异常的根本原因分析,以及提供解决方案

    前言 今天在自己工程中使用@Async的时候,碰到了一个问题:Spring循环依赖(circular reference)问题. 或许刚说到这,有的小伙伴就会大惊失色了.Spring不是解决了循环依赖 ...

  3. @Async注解导致循环依赖,BeanCurrentlyInCreationException异常

    使用@Async异步注解导致该Bean在循环依赖时启动报BeanCurrentlyInCreationException异常的根本原因分析,以及提供解决方案 今天在自己项目中使用@Async的时候,碰 ...

  4. 主线程异常会导致 JVM 退出?

    大家好,我是坤哥 上周线程崩溃为什么不会导致 JVM 崩溃在其他平台发出后,有一位小伙伴留言说有个地方不严谨 他认为如果 JVM 中的主线程异常没有被捕获,JVM 还是会崩溃,那么这个说法是否正确呢, ...

  5. java中三种可能导致异常的情况_JAVA基础知识点之异常

    一.JAVA异常 异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的众多子类描 ...

  6. UsageStatsService之坑:一个XML解析异常导致的开机动画死循环

    文章目录 UsageStatsService之坑:一个XML解析异常导致的开机动画死循环 声明 问题说明 日志排查 猜想和验证 问题定位 插曲 -- XML的解析 问题修复 杯弓蛇影 参考资料 修改说 ...

  7. 关于线程池运行过程中,业务逻辑出现未知异常导致线程中断问题反思

    最近在项目研发中的关于线程池应用过程中由于业务逻辑异常导致的线程中断,但程序未中断导致的脏数据问题  话不多说,在最近最新的一个版本发布过程中,业务需要,我们要定期去给客户预留出可用的资源数据,提供客 ...

  8. java的异常有哪些类_Java中的异常类型有哪些

    1. java.lang.nullpointerexception 这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对 ...

  9. 黑马程序员全套Java教程_Java基础教程_异常(含扩展)(二十三)

    黑马程序员全套Java教程_Java基础教程_异常(含扩展)(二十三) 1.1 异常概述与异常体系结构 1.2 JVM遇到异常时的默认处理方案 1.3 异常处理 1.4 异常处理之try--catch ...

最新文章

  1. 腾讯首次公布微信最全用户数据【完整版】
  2. Cannot find module 'express'
  3. 从1.5k到18k, 一个程序员的5年成长之路(分享)
  4. 怎么写字_写字楼外卖员不让进怎么办?写字楼外卖柜提供解决方案!
  5. 为什么mysql与eclipse_mysql的用户名和密码都是正确的,但是eclipse启动说不对
  6. 解决T400死机的问题!
  7. 打钱!我的数据库被黑客勒索了!
  8. 【24万欧】国外人工智能计算机博士自述面试经历
  9. MPLS 次末跳弹出配置_weblogic的安装与配置
  10. supermap试用许可过期如何重新申请
  11. unity播放视频代码
  12. 【微机原理与接口技术】学习笔记9 DMA控制器8237A
  13. SFUD | 一款串行 Flash 通用驱动库
  14. 云栖社区新版首页上线_开启找bug模式
  15. vue学习入门——Idea中安装vue插件
  16. XorPay.com 支付平台介绍【免费开通个人微信支付接口】
  17. 为什么机器人不会抢走你的工作?
  18. 新浪程序员因加班错失年会77万元年会大奖?网友呼吁:应该补发
  19. 微信退款php参数格式错误,PHP实现微信申请退款功能
  20. kali工具fping的简单使用之扫描IP

热门文章

  1. leetcode 101 Symmetric Tree
  2. Java并发编程(五)JVM指令重排
  3. Centos7下安装部署oracle数据库方法及问题汇总
  4. Android 设定横屏,禁止屏幕旋转,Activity重置 [更新视频播放器相关]
  5. golang 判断 两个slice 是否相等
  6. linux centos 丢失 grub.conf 启动系统
  7. linux网络命令 ifconfig、ifup、ifdown 网络配置 网卡开启关闭
  8. golang 获取文件md5
  9. linux gcc 包含头文件 动态库 静态库 链接路径问题
  10. 安装phpMyAdmin图文教程