简述Java异常处理

Java异常处理

一,异常的概念
1,异常(exception)是在运行过程中代码序列中产生的一种例外情况。
2,Exception类的层次
所有的异常类是从 java.lang.Exception 类继承的子类。
Exception 类是 Throwable 类的子类。除了Exception类外,Throwable还有一个子类Error 。
Java 程序通常不捕获错误。错误一般发生在严重故障时,它们在Java程序处理的范畴之外。
Error 用来指示运行时环境发生的错误。
异常类有两个主要的子类:IOException 类和 RuntimeException 类。
二,常见的异常类型
在这里插入图片描述
三,异常处理
Java异常处理通过5个关键字控制:try、catch、 throw、throws和 finally。
1,try-catch结构
try{
代码A
代码B
}catch(ExceptionType e){
异常处理代码C
}
代码D
期望:A—>B—>C—>D 程序无异常时
实际:A—>异常处理—>C—>D 代码B出现异常时
实际:A—>B—>异常处理—>C—>D 代码B出现异常时
2,finally关键字
有些时候,try块内引用了一些物理资源,例如数据库连接、网络连接或磁盘文件等,那么一旦try块内出现异常,这些资源将无法保证被释放
必须要有一种很确切的办法办法确保资源一定得到释放,而不管是否存在异常,这就是finally存在的原因。
ry{
代码A
代码B
}catch(ExceptionType e){
异常处理代码C
}finally{
回收代码资源代码D
}
代码E

注意下面事项:
catch 不能独立于 try 存在。
在 try/catch 后面添加 finally 块并非强制性要求的。
try 代码后不能既没 catch 块也没 finally 块。
try, catch, finally 块之间不能添加任何代码。

代码展示:

package exception;

public class ArithmeticException {
    public static void main(String[] args) {

        //算数错误
        try {
            int num=5/0;                          //出现异常
            System.out.println(num);              // 异常后的程序不再执行
        }catch (java.lang.ArithmeticException e){  //捕捉异常
            System.out.println("除数不能为零");     //处理异常
        }finally {
            System.out.println("资源回收");        //资源回收
        }
        System.out.println("helloworld");         //后面的程序继续执行

        //试图访问null对象引用
        try {
            String  str = null;                  //定义一个空的字符串
            System.out.println(str.length());    //输出空字符串长度,出现异常
        }catch (NullPointerException c){         //捕捉异常
            c.printStackTrace();                 //打印异常
            System.out.println("不能为空");       //处理异常
        }finally {
            System.out.println("回收资源");       //回收资源
        }
        System.out.println("程序继续执行");        //后面的程序继续执行
    }
}

运行结果:
在这里插入图片描述
3,多重catch块

try{
代码A
try {
代码A1
代码B1
代码C1
}catch(ExceptionType2 e2){
异常处理代码D2
}
代码C
}catch(ExceptionType2 e2){
异常处理代码D1
}finally{
回收资源代码E
}
代码F

上面的代码段包含了 3 个 catch块。
可以在 try 语句后面添加任意数量的 catch 块。
如果保护代码中发生异常,异常被抛给第一个 catch 块。
如果抛出异常的数据类型与 ExceptionType1 匹配,它在这里就会被捕获。
如果不匹配,它会被传递给第二个 catch 块。
如此,直到异常被捕获或者通过所有的 catch 块。

代码展示:

package exception;

import java.lang.ArithmeticException;

public class MultiplAanomalies {
    public static void main(String[] args) {
        try {
            int i=5/1;           //语句正确,正常执行
            System.out.println(i);
            try {
                int num = 5/0;                //出现异常
                System.out.println(num);      //异常语句后面的代码不再执行 
                String str = null;           
                System.out.println(str.length());
            }catch (ArithmeticException c){        //捕捉异常     
                System.out.println("出现异常啦");
            }catch (NullPointerException c){         
                System.out.println("出现异常");
            }
        }catch (Exception c){
            System.out.println("出现异常了");
        }finally {
            System.out.println("资源回收");
        }
        System.out.println("程序继续执行");
    }
}

运行结果:
在这里插入图片描述
3,throw和throws关键字
(1),throw关键字
有时需要明确的引发一个异常,Java语言可以用 throw语句显式地引发异常。
执行流程一旦遭遇throw语句,就会立即停止,不会再执行下一个语句。
简单来说就是自定义一个异常
(2),throws关键字
throws跟在方法之后,说明该方法可能会抛出某个或某些异常,而这个方法并不关心或不方便处理,由方法的调用者来处理这些异常。

代码展示:

package Throw;

//自定义异常类,继承Exception类
public class MyExcertion extends Exception{

    public MyExcertion(){      //无参构造方法
        super();
    }


    public MyExcertion(String a){      //有参构造方法
        super(a);
    }
}


package Throw;

public class Test1 {
    public static void main(String[] args) {
        try {
            show();
        } catch (MyExcertion myExcertion) {
            myExcertion.printStackTrace();  //打印异常
            System.out.println("出现异常");
        }
    }


    public static void show() throws MyExcertion{
        if (2>1){                           //自定义异常,比如去银行取钱,取款金额大于卡内余额则会显示余额不足(相当于出现异常)。
            throw new MyExcertion();
        }
    }
}

运行结果:
在这里插入图片描述
四,异常使用规则
不要为每个可能会出现异常的语句都设置try和catch。虽 然使用异常可以分离常规代码和错误处理代码,从而提高 代码的可读性,但是,异常的不恰当使用会降低代码的可 读性。
避免总是catch Exception或Throwable,而要catch具 体的异常类。这样可以使程序更加清晰。
什么情况下使用异常?如果方法遇到一个不知道如何处理 的意外情况(abnormal condition),那么它应该抛出 异常。
不要在循环中使用try…catch,尽量将try…catch放在循 环外或者避免使用。
异常处理不应用来控制程序的正常流程,不要将异常看作 是“super if

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值