JAVA异常

一.什么是异常?

异常就是有异于常态,和正常情况不一样,有错误出错。在java中,阻止当前方法或作用域的情况,称之为异常。

java中异常的体系是怎么样的呢?

1.Java中的所有异常类都继承于Throwable类。Throwable主要包括两个大类,一个是Error类,另一个是Exception类;

2.Exception类,也就是通常所说的“异常”。主要指编码、环境、用户操作输入出现问题,Exception主要包括两大类,非检查异常(RuntimeException)和检查异常(其他的一些异常,文件异常或者sql异常)

3.RuntimeException异常主要包括以下四种异常(其实还有很多其他异常,这里只列出4种常见的异常):空指针异常、数组下标越界异常、类型转换异常、算术异常。

空指针异常

        String str = null;
        System.out.println(str.length());



Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.length()" because "str" is null
	at com.gxuwz.visitor.activity.MainActivity.main(MainActivity.java:152)

数组越界异常

    int[] arr = {1,2,3,4,5};
        for (int i=0;i<=5;i++){
            System.out.println(arr[i]);
        }

运算异常

        int a =3;
        int b = 0;
        System.out.println(a/b);

RuntimeException异常会由java虚拟机自动抛出并自动捕获(就算我们没写异常捕获语句运行时也会抛出错误!!),此类异常的出现绝大数情况是代码本身有问题应该从逻辑上去解决并改进代码。

二、try-catch-finally语句

(1)try块:负责捕获异常,一旦try中发现异常,程序的控制权将被移交给catch块中的异常处理程序。

  【try语句块不可以独立存在,必须与 catch 或者 finally 块同存】

(2)catch块:如何处理?比如发出警告:提示、检查配置、网络连接,记录错误等。执行完catch块之后程序跳出catch块,继续执行后面的代码。

    编写catch块的注意事项:多个catch块处理的异常类,要按照先catch子类后catch父类的处理方式,因为会【就近处理】异常(由上自下)。

(3)finally:最终执行的代码,用于关闭和释放资源。

try{
//一些会抛出的异常操作
}catch(Exception e){
//第一个catch
//处理该异常的代码块
}catch(Exception e){
//第二个catch,可以有多个catch
//处理该异常的代码块
}finally{
//最终要执行的代码
} 

当异常出现时,程序将终止执行,交由异常处理程序(抛出提醒或记录日志等),异常代码块外代码正常执行。 try会抛出很多种类型的异常,由多个catch块捕获多钟错误并返回提示

多重异常处理代码块顺序问题:先子类再父类(顺序不对编译器会提醒错误),finally语句块处理最终将要执行的代码

int divider=10;
        int result=100;
        try{
            System.out.println("开始计算...");
            while(divider>0){
                divider--;
                result=result+100/divider;
            }
            System.out.println("为发生异常result的结果为:"+result);

        }catch(Exception e){
            e.printStackTrace();
            System.out.println("异常抛出了!!");
            result=-9999;
            System.out.println("result的值为:"+result);

        }finally{
            System.out.println("这是finally语句!!");
        }

上述代码中的执行结果为

由控制台输出可知,代码抛出了一个算数异常,并且标注了原因为by zero

执行顺序为先执行try语句后面的方法,如果发现异常,则跳过后续语句执行cach中的异常处理语句,抛出异常,最后在执行finally中的语句

如果程序正常运行,则不执行catch中的语句,且finally中的语句在程序执行完try方法中的语句后执行

 总结:

  1、不管有木有出现异常或者try和catch中有返回值return,finally块中代码都会执行;

  2、finally中最好不要包含return,否则程序会提前退出,返回会覆盖try或catch中保存的返回值。

  3.  e.printStackTrace()可以输出异常信息。

  4.  如果方法中try,catch,finally中没有返回语句,则会调用这三个语句块之外的return结果。

  5.  finally 在try中的return之后 在返回主调函数之前执行。

三、throw和throws关键字

java中的异常抛出通常使用throw和throws关键字来实现。

throw ----将产生的异常抛出,是抛出异常的一个动作

一般会用于程序出现某种逻辑时程序员主动抛出某种特定类型的异常

String s = "abc1";
            if(s.equals("abc")) {
                System.out.println(s);
                } else {
                throw new RuntimeException("这是一个用户自己抛出的异常");
                }

throws----声明将要抛出何种类型的异常(声明

语法格式:

public void 方法名(参数列表)
    throws 异常列表{
     //调用会抛出异常的方法或者:
    throw new Exception();
    throw new RuntimeException("自定义异常");
}

throw与throws的比较
1、throws出现在方法函数头;而throw出现在函数体。
2、throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常对象。
3、两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。

四,自定义异常

为什么要使用自定义异常,有什么好处

1.我们在工作的时候,项目是分模块或者分功能开发的 ,基本不会你一个人开发一整个项目,使用自定义异常类就统一了对外异常展示的方式

2.有时候我们遇到某些校验或者问题时,需要直接结束掉当前的请求,这时便可以通过抛出自定义异常来结束,如果你项目中使用了SpringMVC比较新的版本的话有控制器增强,可以通过@ControllerAdvice注解写一个控制器增强类来拦截自定义的异常并响应给前端相应的信息。

3.自定义异常可以在我们项目中某些特殊的业务逻辑时抛出异常,比如"中性".equals(sex),性别等于中性时我们要抛出异常,而Java是不会有这种异常的。系统中有些错误是符合Java语法的,但不符合我们项目的业务逻辑。

4.使用自定义异常继承相关的异常来抛出处理后的异常信息可以隐藏底层的异常,这样更安全,异常信息也更加的直观。自定义异常可以抛出我们自己想要抛出的信息,可以通过抛出的信息区分异常发生的位置,根据异常名我们就可以知道哪里有异常,根据异常提示信息进行程序修改。比如空指针异常NullPointException,我们可以抛出信息为“xxx为空”定位异常位置,而不用输出堆栈信息。

怎么使用自定义异常:

在 Java 中你可以自定义异常。编写自己的异常类时需要记住下面的几点。

  • 所有异常都必须是 Throwable 的子类。
  • 如果希望写一个检查性异常类,则需要继承 Exception 类。
  • 如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。

可以像下面这样定义自己的异常类:

public class MyException extends Exception {
    private  String message;

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

}

如何使用

String[] sexs = {"男性","女性","中性"};
            for(int i = 0; i < sexs.length; i++){
                    if("中性".equals(sexs[i])){
                             try {
                                   throw new MyException("不存在中性的人!");
                               } catch (MyException e) {
                                   e.printStackTrace();
                               }
                        }else{
                            System.out.println(sexs[i]);
                        }
               }

控制台输出结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值