java捕获和抛出异常

java 捕获和抛出异常

​ 异常通常是程序运行时出现的问题和错误。如:客户输入数据的格式,读取的文件是否存在,网络是否保持通畅等。java程序在执行过程中发生的异常事件分为:异常和错误

异常:(Exception)

异常指程序运行过程中出现的非正常现象。可能遇到的轻微错误,可以写代码处理异常并继续继承执行,不应让程序中断。

错误:(Error)

错误事件的发生通常会阻止程序正常运行。对于java虚拟机无法解决的严重问题,如jvm系统内部错误,资源耗尽等情况,一般不编写针对性的代码进行处理。

对于被认为是不能恢复的严重错误,不应该抛出,而应该让程序中断。


错误与异常最大的区别是错误往往比异常严重,发生了错误,一般不能在应用程序中捕获处理,程序只能非正常终止运行。

异常的简单分类:

(1):检查性异常

最具有代表性的是用户错误或者是问题引起的而异常,这是程序员无法预见的。例如要打开一个不存在的文件时,异常就发生了,这些异常在编译时不能被简单的忽略。

(2):运行时异常

它是可能被程序员避免的异常,与检查性异常相反,运行时可以在编译时被忽略。

(3):错误

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


java把异常当做对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。

java异常层次结构图如下:

异常处理机制(捕获)

抛出异常:当出现异常事件时,系统会自动产生一个异常对象,然后将其传递给java运行时系统。这个异常产生和提交的过程称为抛出异常。

捕获异常:当java运行时系统得到异常对象以后,它将寻找处理这一异常的方法,找到之后,运行时系统把当前异常对象交给该方法进行处理。这一过程称为捕获。

异常处理的一般步骤为:异常抛出---->异常捕获---->异常处理

java异常机制主要依赖于try,catch,finally,throwsthrow五个关键字。

try:它里面放置的是可能引发的异常类型。

catch:后面对应异常类型一个代码块,用于表明catch块用于处理这种类型的代码块。可以有多个catch块。

finally:主要用来处理后续事情。finally块总是被执行,如果finally中使用了return或者throw等终止方法的语句,不会跳回执行,而是直接执行。

下面来两个简单的代码示例:

分母不能为0的异常并捕获
package exception;

public class Test {
    public static void main(String[] args) {
        int a = 1;
        int b = 0;
   //     System.out.println(a/b);//出现异常,分母不能为0.ArithmeticException
        //下面我们来捕获这个异常,try——catch
        try {//try    用来检测区域
      //      System.out.println(a/b);
        }catch (ArithmeticException e){//catch(可能发生的异常类型)   捕获异常
            System.out.println("程序出现异常,变量不能为0");
        }finally {//处理后续工作
            System.out.println("finally");
        }
    }
}
方法的栈调用异常并捕获
public class Test {
    public static void main(String[] args) {
        int a = 1;
        int b = 0;
   //     System.out.println(a/b);//出现异常,分母不能为0.ArithmeticException
        //下面我们来捕获这个异常,try——catch
        try {//try    用来检测区域
              new Test().a();//通过对象点名来调用这个方法
        }catch (Throwable e){//catch(想要捕获的异常类型)//   捕获异常
            System.out.println("程序出现异常,变量不能为0");
        }finally {//处理后续工作
            System.out.println("finally");
        }
    }
    public void a(){ b(); }
    public void b(){ a(); }
}

当我们想捕获多个异常时,可以像循环结构那样,并列catch模块

多个异常捕获时
    /*
当我们想要捕获多个异常时
catch(){

}catch(){

}catch(){
//括号内捕获的异常类型要从小到大去写。error>exception>throwable
}
 */
    我们可以通过快捷键alt+Ctrl+T选中含有异常的代码语句,自动生成try-catch-finally。

throw语句

throw通常用来明确的抛出一个异常

if(异常条件1 成立)

​ throw new 异常1();

if(异常条件2 成立)

​ throw new异常2();

简单代码示例

在try检测模块内主动抛出异常
        try {//try    用来检测区域
              if(b==0){//使用throw关键字来抛出
                  throw new ArithmeticException();//主动抛出这个异常
              }
            System.out.println(a/b);

throws语句

throws语句用来声明一个异常。

public class Test {
    public static void main(String[] args) {
        try {
            new Test().test(1,0);
        } catch (ArithmeticException e) {
            e.printStackTrace();
        } finally {
        }
    }
    //假设方法中处理不了这个异常,需要在方法上抛出异常
    public void test (int a,int b) throws ArithmeticException{//在这个方法里声明这个异常
        if (b == 0) {
            throw new ArithmeticException();//主动抛出的异常,一般在方法中
        }
        System.out.println(a / b);
    }
}

狂神说java

posted @ 2021-08-08 16:26  有点儿意思  阅读(867)  评论(0编辑  收藏  举报