异常

异常

  1. 异常分为两大类,运行时异常和编译时异常
  2. 运行时异常,编译器不要求强制处置的异常。一般是指编程时的逻辑错误,是程序员应该避免出现的异常。java.lang.RuntimeException类及它的子类都是运行时异常
  3. 对于运行时异常,可以不作处理,因为这类异常很普遍,若全处理可能会对程序的可读性和运行效率产生影响
  4. 编译时异常是编译器要求必须处置的异常

细节:

1.如果异常发生了,异常后面的代码不会执行,直接进入catch块

2.如果异常没有发生,则顺序执行try的代码块,不会进入catch块

3.如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等)则使用如下代码-finally

4.可以有多个catch语句,捕获不同的异常(进行不同的业务处理),要求父类异常在后,子类异常在前,比如(Exception在后,NullPointerException在前),如果发生异常,只会匹配一个catch

5.可以进行try-finally配合使用,这种用法相当于没有捕获异常因此程序会直接崩掉/退出.应用场景:就是执行一段的代码,无论是否发生异常都必须执行某个业务逻辑

package com.example.try_;



/**
 * @Author 10704
 * @Time 2022/5/9 12:25
 * @Version 1.0
 */
public class TryDetail {
    public static void main(String[] args) {
        //1.如果异常发生了,异常后面的代码不会执行,直接进入catch块
        //2.如果异常没有发生,则顺序执行try的代码块,不会进入catch块
        //3.如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等)则使用如下代码-finally
        try {
            String name = "郜庆辉";
            int a = Integer.parseInt(name);
            System.out.println("数字a=" + a);
        } catch (NumberFormatException e) {
            System.out.println("异常信息=" + e.getMessage());
        }finally {
            System.out.println("finally代码块被执行");
        }

        System.out.println("程序继续执行");
    }
}

package com.example.try_;

/**
 * @Author 10704
 * @Time 2022/5/9 12:36
 * @Version 1.0
 */
public class TryDeatail02 {
    public static void main(String[] args) {
        // 4.可以有多个catch语句,捕获不同的异常(进行不同的业务处理),
        // 要求父类异常在后,子类异常在前,比如(Exception在后,
        // NullPointerException在前),如果发生异常,只会匹配一个catch

        try {
            Person person = new Person();
            person = null;
            System.out.println(person.getName());// NullPointerException
            int n1 = 10;
            int n2 = 0;
            int res = n1 / n2;          // ArithmeticException
            System.out.println("res=" + res);

        } catch (NullPointerException e) {
            System.out.println("空指针异常=" + e.getMessage());
        } catch (ArithmeticException e) {
            System.out.println("算数异常=" + e.getMessage());
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

class Person {
    private String name = "jack";

    public String getName() {
        return name;
    }
}
package com.example.try_;

/**
 * @Author 10704
 * @Time 2022/5/9 12:50
 * @Version 1.0
 */
public class TryDetail03 {
    public static void main(String[] args) {
        //5.可以进行try-finally配合使用,这种用法相当于没有捕获异常
        //因此程序会直接崩掉/退出.
        //应用场景:就是执行一段的代码,无论是否发生
        // 异常都必须执行某个业务逻辑
        try {
            int n1 = 10;
            int n2 = 0;
            System.out.println(n1 / n2);
        } finally {
            System.out.println("执行了finally");
        }

        System.out.println("程序继续执行");
    }
}

throws

基本介绍:

  1. 如果一个方法(中的语句执行时)可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显示地声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理
  2. 在方法声明中用throws语句可以声明抛出异常的列表,throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类。

throws细节

package com.example.throws_;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

/**
 * @Author 10704
 * @Time 2022/5/9 15:15
 * @Version 1.0
 */
public class ThrowsDetail {
    public static void main(String[] args) {
        f1();
    }

    public static void f1() {
        // 1.对于编译异常,程序中必须处理,比如使用try-catch或者throws
        // 2.对于运行时异常,程序中如果没有处理,默认就是throws的方式处理

        int n1 = 10;
        int n2 = 0;
        int res = n1 / n2;
    }
}

class Father {
    public void method() throws RuntimeException {
    }
}

class Son extends Father {
    // 3.子类重写父类的方法时,对抛出异常的规定:子类重写的方法
    //  所抛出的异常类型要么和父类抛出的异常一致,要么为父类抛出异常类型的子类异常
    @Override
    public void method() throws ArithmeticException {
    }


    public static void f2() throws FileNotFoundException {
        // 1.因为f3()方法抛出的异常是一个编译异常
        // 2.这时就要f2()必须处理这个编译异常
        // 3.在f2()中,处理这个异常的办法要饿时try-catch-finally,或者继续throws这个编译异常

        f3();
    }

    public static void f3() throws FileNotFoundException {
        FileInputStream file = new FileInputStream("d://aa.txt");
    }

    public static void f4() {
        // 1.在f4中调用f5这个方法是可以的,不需要显示的throws或者try
        // 2.原因是f5()抛出的异常是运行异常
        // 3.而在Java中,并不要求程序员显示处理,因为有默认的处理机制
        f5();
    }

    public static void f5() throws RuntimeException {

    }
}

自定义异常

package com.example.customexception_;

public class Customeexception_ {
    public static void main(String[] args) {
        //要求年龄范围在18-120之间,否则抛出一个自定义异常
        int age = 190;

        if (!(age >= 18 && age <= 120)) {
            throw new AgeException("年龄必须输入从18~120");

        }
    }
}

// 自定义一个异常
// 1.一般情况下,我们自定义异常是继承RuntimeException
// 2.即把自定义异常做成运行时异常,好处是运行时异常可以使用默认的处理机制
class AgeException extends RuntimeException {
    public AgeException(String message) {
        super(message);
    }
}

throw和throws的区别

意义 位置 后面跟的东西
throws 异常处理的一种方式 方法声明处 异常的类型
throw 手动生成异常对象的关键字 方法体中 异常对象

常见的七大异常(前五种常用)

  1. ClassCastException(类转换异常)

    1. 当试图将对象强制转换为不是实例的子类时,抛出该异常。
  2. IndexOutOfBoundsException(数组越界)

    1. 用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引
  3. NullPointerException(空指针异常)

    1. 当应用程序试图在需要对象的地方使用 null 时,抛出该异常
  4. NumberFormatException (数字格式不正确异常)

    1. 当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常 => 使用异常我们可以确保输入是满足条件数字.
  5. ArithmeticException (数学运算异常)

    1. 当出现异常的运算条件时,抛出此异常。例如,一个整数“除以零”时
  6. IllegalAccessException(安全权限异常)

    1. 这个异常的解释是“没有访问权限“,当应用程序要调用一个类,但当前的方法即没有对该类的访问权限便会出现这个异常。对程序中用了Package的情况下要注意这个异常。
  7. IOException(输入输出异常)

    1. 一般读写文件会出现这个异常,比如你想从磁盘上读一个文件到你写的程序,如果硬盘上没有这文件,java虚拟机就会报这个异常。
posted @ 2022-05-10 17:59  忧愁小松鼠  阅读(69)  评论(0)    收藏  举报