欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java学习之走进异常

程序员文章站 2022-06-23 10:49:22
...

异常概念

  • 程序在运行的过程中出现的不正常现象。出现异常不处理将终止程序运行
  • 异常处理的必要性:任何程序都可能存在大量的未知问题,错误;如果不对这些问题进行正确处理,则可能导致程序的中断,造成不必要的损失
  • 异常处理:Java编程语言使用异常处理机制为程序提供了异常处理的能力
    Java学习之走进异常

异常分类

  • Throwable:可抛出,一切错误或异常的父类,位于java.lang包中
    • Error:JVM,硬件,执行逻辑错误,不能手动处理
      *Error
      OutOfMemoryError
    • Exception:程序在运行和配置中产生的问题,可处理
      RuntimeException:运行时异常,可处理,可不处理
      CheckedExcetion:检查时异常,必须处理

1.常见运行时异常

Java学习之走进异常

异常的产生

  • 当程序在在运行时遇到不符合规范的代码或结果时,会产生异常或程序员使用throw关键字手动抛出异常

异常的传递

  • 异常的传递:按照方法的调用链反向传递,如始终没有处理异常,最终会由jvm进行默认异常处理(打印堆栈跟踪信息)

异常的处理

  • Java的异常处理是通过5个关键字实现的

    • try:执行可能产生异常的代码
    • catch:捕获异常,并处理
    • finally:无论是否发生异常,代码总能执行
    • throw:手动抛出异常
    • throws:声明方法可能要抛出的各种异常
  • try…catch
    1.正常运行
    2.发生异常并捕获
    3.发生异常,不能捕获

/**
 * try...catch
 */
public class Demo02 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int result=0;
        try {
            System.out.println("请输入第一个数字");
            int num1=scanner.nextInt();
            System.out.println("请输入第二个数字");
            int num2=scanner.nextInt();
            result=num1/num2;
        } catch (Exception e) {//父类可以捕获所有异常
            e.printStackTrace();
        }
        System.out.println("结果是:"+result);
        System.out.println("程序结束");
    }
}

Java学习之走进异常
try…catch…finally
1.finally块是否发生异常都执行,可以释放资源
2.fianlly块不执行的唯一情况,退出java虚拟机

/**
 * try...catch...finally
 */
public class Demo03 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int result=0;
        try {
            System.out.println("请输入第一个数字");
            int num1=scanner.nextInt();
            System.out.println("请输入第二个数字");
            int num2=scanner.nextInt();
            result=num1/num2;
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            System.out.println("释放资源");
        }
        System.out.println("结果是:"+result);
        System.out.println("程序结束");
    }
}

Java学习之走进异常

  • try…catch…catch…catch多重catch
    1.子类在异常前,父类异常在后
    2.发生异常时按顺序逐个匹配
    3.只执行第一个与异常类型匹配的catch语句
    4.finally根据需要可写可不写
  • try…finally
  • try…finally不能捕获异常,仅仅用来当发生异常时,用来释放资源
  • 一般用在底层代码,只释放资源不做异常处理,把异常向上抛出

/**
 * try...finally
 */
public class Demo04 {
    public static void main(String[] args) {
        try {
            divide();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static  void divide(){
            Scanner scanner = new Scanner(System.in);
            int result=0;
            try {
                System.out.println("请输入第一个数字");
                int num1=scanner.nextInt();
                System.out.println("请输入第二个数字");
                int num2=scanner.nextInt();
                result=num1/num2;
            }finally {
                System.out.println("释放资源");
            }
            System.out.println("结果是:"+result);
            System.out.println("程序结束");
        }

}

Java学习之走进异常

1.声明异常

  • 如果在一个方法体中抛出了异常,用throws关键字声明异常
  • 使用原则:底层代码向上声明或者抛出异常,最上层一定要处理异常,否则程序中断
/**
 * 声明异常
 * throws
 */
public class Demo05 {
    public static void main(String[] args) {
        try {
            divide();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

    public static  void divide() throws Exception{
        Scanner scanner = new Scanner(System.in);
        int result=0;

            System.out.println("请输入第一个数字");
            int num1=scanner.nextInt();
            System.out.println("请输入第二个数字");
            int num2=scanner.nextInt();
            result=num1/num2;
            System.out.println("释放资源");

        System.out.println("结果是:"+result);
        System.out.println("程序结束");
    }

}

Java学习之走进异常

2.抛出异常

  • 除了系统自动抛出异常外,有些问题需要程序员自行抛出异常
  • throw关键字:抛出异常
  • 语法:throw new 异常对象
  • 如果抛出的是检查异常,需要在方法体声明异常
	if(n>1){
		n++;
	}else{
		throw new RuntimeException("n小于1");
	}

自定义异常

  • 需继承自Exception或Exception的子类,常用RuntimeException
  • 必要提供的构造方法
    • 无参数构造方法
    • String message参数的构造方法
/**
 * 自定义异常
 *
 */
public class AgeException extends RuntimeException{
    public AgeException() {
    }

    public AgeException(String message) {
        super(message);
    }

    public AgeException(String message, Throwable cause) {
        super(message, cause);
    }

    public AgeException(Throwable cause) {
        super(cause);
    }

    public AgeException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}

方法覆盖(重写)

  • 带有异常声明的方法覆盖:
    • 方法名,参数列表,返回值类型必须和父类相同
    • 子类的访问修饰符合父类相同或是比父类更宽
    • 子类的方法,不能抛出比父类更多,更宽的检查异常
相关标签: java exception