Java 中的异常处理机制

1.什么是异常

异常:程序在运行过程中产生的不正常情况。

程序在运行的时候,发生了一些不被预期的事件,从而没有按照我们编写的代码执行,这就是异常。

异常是Java中的错误,但是并不是所有的错误都是异常,比如说,你在定义变量名的时候没有依照Java的规则,在语句的结尾少了一个分号,那么运行出来结果是提示是错误 java.lang.Error

不过如果你用System.out.println(5/0),那这个时候你的程序是可以正常编译的,但是在运行的时候,因为你用0做了除数,会抛出 java.lang.ArithmeticException 的异常。

2.异常的类型:

  1. 检查性异常;

  2. 运行时异常;

  3. 错误。

3.检查性异常

  • 例如我们要打开一个文件时,这段代码就可能存在异常,因为这个文件很有可能并不存在。

  • File f = new File("G://test.java");
    FileInputStream fs = new FileInputStream(f);

    这里G盘下的test.java文件就可能不存在,这个时候运行这段代码就可能会出异常,所以在我们编写代码的时候IDE会提示我们要处理这段代码可能出现的异常。

    如果我们不处理的话,程序是不能被编译的。

4.运行时异常

  • 运行时异常程序员可以不去处理,当异常出现时,虚拟机会处理。常见的运行时异常有空指针异常。

  • ClassCastException(类转换异常)
    IndexOutOfBoundsException(数组越界)
    NullPointerException(空指针)
    ArrayStoreException(数据存储异常,操作数组时类型不一致)

    5.错误

    错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。

    6.Exception 类

    所有的异常类都是从 java.lang.Exception 类继承的子类。

    Exception 类是 Throwable 类的子类。除了Exception类之外,Throwable还有一个子类Error

    Java 程序通常不捕获错误。错误一般发生在严重故障时,它们在Java程序处理的范畴之外。

    Error 用来指示运行时环境发生的错误。

    例如,JVM内存溢出。一般地,程序不会从错误中恢复。

    异常类有两个主要的子类:IOException 类和 RuntimeException 类。

5.java中的异常捕捉try.catch,finally

 try{代码块;代码A  throw"字符"   //抛出错误}catch(参数){ //抓住throw抛出的错误//处理错误并执行代码B}finally{//无论try catch结果如何还是继续执行代码C}

通过这两个单词的字面意思我们就能很好的理解了:try:尝试,catch:捕获; 尝试执行代码A代码B如果这两段代码有一个出现了异常,就会执行catch中的语句,如果代码A、B都不存在异常就不会执行catch代码,最后继续执行代码C

捕获异常需要用特定的类,下表总结了常用的异常类

非检测型异常:

异常 描述
ArithmeticException 当出现异常的运算条件时,抛出此异常。例如,一个整数"除以零"时,抛出此类的一个实例。
ArrayIndexOutOfBoundsException 用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引。
ClassCastException 当试图将对象强制转换为不是实例的子类时,抛出该异常。
IllegalArgumentException 抛出的异常表明向方法传递了一个不合法或不正确的参数。
IllegalMonitorStateException 抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程。
IllegalStateException 在非法或不适当的时间调用方法时产生的信号。换句话说,即 Java 环境或 Java 应用程序没有处于请求操作所要求的适当状态下。
IllegalThreadStateException 线程没有处于请求操作所要求的适当状态时抛出的异常。
IndexOutOfBoundsException 指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。
NegativeArraySizeException 如果应用程序试图创建大小为负的数组,则抛出该异常。
NullPointerException 当应用程序试图在需要对象的地方使用 null 时,抛出该异常
NumberFormatException 当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。
StringIndexOutOfBoundsException 此异常由 String 方法抛出,指示索引或者为负,或者超出字符串的大小。

检测性异常:

异常 描述
ClassNotFoundException 应用程序试图加载类时,找不到相应的类,抛出该异常。
CloneNotSupportedException 当调用 Object 类中的 clone 方法克隆对象,但该对象的类无法实现 Cloneable 接口时,抛出该异常。
IllegalAccessException 拒绝访问一个类的时候,抛出该异常。
InstantiationException 当试图使用 Class 类中的 newInstance 方法创建一个类的实例,而指定的类对象因为是一个接口或是一个抽象类而无法实例化时,抛出该异常。
InterruptedException 一个线程被另一个线程中断,抛出该异常。
NoSuchFieldException 请求的变量不存在
NoSuchMethodException 请求的方法不存在
IOException及其子类 对文件或流的操作有误时,抛出异常

6.练习

ArithmeticException、IndexOutOfBoundsException、NullPointerException、ClassCastException,针对上述异常情况,写出其对应的try-catch异常处理块

算数异常:

  • //1.算术异常 ArithmeticException
    Scanner z=new Scanner(System.in);
    int a,b;
    System.out.println("请输入两个数:");
    try{
    a=z.nextInt();
    b=z.nextInt();
    int sum=a/b;
    System.out.println(sum);
    }catch(ArithmeticException i){
    System.out.println(i.getMessage());
    }catch(InputMismatchException e){
    System.out.println(e.getMessage());
    e.printStackTrace();
    }
    catch(Exception e){
    e.printStackTrace();
    System.out.println("==========");
    e.getMessage();
    }
    System.out.println("程序结束运行");

    空指针异常

  • //2.空指针异常 NullPointerException
    try{
    Student s1 = new Student("张三",18);
    System.out.println(s1.toString());
    Student s2 = null;//对象s2不再指向任何的值空间
    System.out.println(s2.name);//使用对象s2调用字段,空指针操作
    }catch(NullPointerException i){
    System.out.println(i.getMessage());
    }catch(InputMismatchException e){
    System.out.println(e.getMessage());
    e.printStackTrace();
    }
    catch(Exception e){
    e.printStackTrace();
    System.out.println("==========");
    e.getMessage();
    }
    System.out.println("程序结束运行");
    

    下标越界

  • try{
    String[] fruits = {"apple" , "orange" , "pear" , "peach"};
    for (String string : fruits) {
    System.out.print(string + " ");
    }
    System.out.println(fruits[4]);
    }catch(ArrayIndexOutOfBoundsException i){
    System.out.println(i.getMessage());
    }catch(InputMismatchException e){
    System.out.println(e.getMessage());
    e.printStackTrace();
    }
    catch(Exception e){
    e.printStackTrace();
    System.out.println("==========");
    e.getMessage();
    }
    System.out.println("程序结束运行");

    类型转换异常

  • 
    //4.类型转换异常 classCastException
    try{
    Object obj = new Object();
    Student stu = (Student)obj;
    System.out.println(stu.toString());
    }catch(ClassCastException i){
    System.out.println(i.getMessage());
    }catch(InputMismatchException e){
    System.out.println(e.getMessage());
    // e.printStackTrace();
    }
    catch(Exception e){
    // e.printStackTrace();
    System.out.println("==========");
    e.getMessage();
    }
    System.out.println("程序结束运行");
    }
    }

java异常(机制和捕捉(常见异常类))详解 +练习题相关推荐

  1. java类加载机制、反射、动态代理详解

    类的加载.连接和初始化(系统可能在第一次使用某个类时加载该类, 也可能采用预加载机制来加载某个类)动态代理实现 1.JVM和类 当调用 java 命令运行某个 Java 程序时, 该命令将会启动一个 ...

  2. java中的example_mybatis中关于example类详解

    这几天刚接触example,很多内容都是破碎的,写一篇文章加深理解. 一.什么是example类 mybatis-generator会为每个字段产生Criterion,为底层的mapper.xml创建 ...

  3. 集合框架之ArrayDeque类详解

    Java集合框架分析(Deque)---ArrayDeque类详解 目录 一.数据结构 二.类标题 三.字段 四.构造函数 五.方法分析 类型 方法 作用 添加元素 public void addFi ...

  4. 1.异常简介:什么是异常???常见异常有哪些???

    1.异常简介:什么是异常???常见异常有哪些??? 学习:第7遍 1. 什么是异常??? 程序在运行过程中发生的意外情况,称为异常,如:除数为0.访问下标不存在的数组元素等 异常是一种信号,用于向调用 ...

  5. Java多线程系列(九):CountDownLatch、Semaphore等4大并发工具类详解

    之前谈过高并发编程系列:4种常用Java线程锁的特点,性能比较.使用场景 ,以及高并发编程系列:ConcurrentHashMap的实现原理(JDK1.7和JDK1.8) 今天主要介绍concurre ...

  6. java的thread类_thread 类详解

    java.lang.Thread类详解 一.前言 位于java.lang包下的Thread类是非常重要的线程类,它实现了Runnable接口,今天我们来学习一下Thread类,在学习Thread类之前 ...

  7. java线程池ThreadPoolExecutor类详解

    线程池有哪些状态 1. RUNNING:  接收新的任务,且执行等待队列中的任务 Accept new tasks and process queued tasks  2. SHUTDOWN: 不接收 ...

  8. Java并发编程之Thread类详解

    Thread类详解: 线程(Thread): 是操作系统进行调度的最小单位,Java中的线程是对操作系统线程的封装.本文从线程的创建到停止结合代码和具体实例分析一下关于java线程的一些常见问题. 线 ...

  9. java并发编程Future类详解

    作用和举例 future类的作用就是为了调用其他线程完成好后的结果,再返回到当前线程中,如上图举例: 小王自己是主线程,叫外卖等于使用future类,叫好外卖后小王就接着干自己的事去了,当外卖到了的时 ...

最新文章

  1. python 直接if判断和is not None的区别
  2. linux nginx cdn,linux – Nginx Proxy_Pass到CDN与直接击中CDN. P...
  3. 算法训练之STL使用汇总
  4. 手把手教你研发属于自己的智能无人机
  5. verilog 不可综合语句 总结 汇总(Z)
  6. http协议 web开发的应用 笔记
  7. Button按钮多行显示的实现方法
  8. unity最基本操作
  9. Golang实践录:反射reflect的一些研究及代码汇总
  10. 阿里云服务器——centos7下源码安装tomcat9
  11. App测试Android的闪退总结
  12. 龙虎斗 详解(C++)
  13. 谷粒商城doc文档_谷粒学院项目分享全栈开发入门必备(资料齐全)
  14. 对于【没有苹果开发账号,只有p12文件和mobileprovision文件进行打包】文章的补充
  15. span标签的间距问题
  16. strtok用法详解
  17. 1g内存编译android,如何让Android手机1G内存就“够用”?
  18. 关于TopoJSON以及制作方法
  19. 大数据常用的开发工具
  20. 深入浅出多目标优化--10分钟多目标优化入门

热门文章

  1. 堆栈,静态变量和普通变量,静态函数和普通函数的区别
  2. 独立云计算服务商的多维实践之道:用户需求驱动变革
  3. UICollectionView的headerView、footerView使用以及与UITableView加载headerView、footerView的区别...
  4. 《Ember.js实战》——2.3 计算属性
  5. redis桌面管理工具 redis-desktop-manager使用指南(转)
  6. 挑战JavaScript正则表达式每日两题(2)
  7. git push VS git fetch
  8. 某产品经理炫耀:3年跳槽3次,月薪从8k涨到38k,跳槽涨薪最快!
  9. 朋友来网易面试,挂了~
  10. 正则表达式学习神器!