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

                                                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("程序结束运行");
    }
    }

     

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海绵hong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值