Java异常

异常

概述

异常就是java程序在运行过程中出现的错误

异常由来:问题也是现实生活中一个具体事务,也可以通过java的类的形式进行描述,并封装成对象。其实就是java对不正常情况进行描述后的对象体现

JVM的默认处理方案

把异常的名称,错误原因以及异常出现的位置等信息输出在了控制台

程序停止执行

/*
    jvm发现运算是已经违反了数学运算规则,java将这种常见的问题进行描述,并封装成了对象叫做                  ArithmeticException
    当除0运算发生后,jvm将该问题打包成了一个异常对象.
    并将对象抛给调用者main函数,new ArithmeticException("/by zero");
​
    main函数收到这个问题时,有两种处理方式:
    1,自己将该问题处理,然后继续运行
    2,自己没有针对的处理方式,只有交给调用main的jvm来处理
    jvm有一个默认的异常处理机制,就将该异常进行处理.并将该异常的名称,异常的信息.异常出现的位置打印在了控制台上同时将程序停止运行
​
*/

异常分类

                        Throwable

                Error                        Exception

                子类                   子类              RuntimeException

                                                                         子类

Error:一般情况下,我们不处理,这样的问题一般都是很严重的

比如OOM(内存溢出问题)

Exception:

运行时异常:RuntimeException,这样的问题我们也不处理,因为这种问题一般都是你自己写代码出现的问题比如代码不够严谨

编译时异常:除了不是RuntimeException都是编译时异常,必须要进行处理,如果你不处理,程序编译就不通过,无法运行

如果程序出了问题,我们没有做任何处理,最终JVM会给出一个默认的处理把异常的名称,相关的原因,以及出现问题的相关信息,包括位置输出在控制台,同时程序会结束,后面的代码不会运行

异常处理格式

1、try...catch...finally

try{

可能会出现问题的代码;

}catch(异常的类名 变量名){

针对问题的一些处理;

}finally{

释放资源的代码;

}

注意事项:

try...catch...finally可以使用

try...catch...也可以使用

try...finally也可以使用

但,catch...finally不能单独使用

1、一种异常

try{

可能会出现问题的代码;

}catch(异常的类名 变量名){

针对问题的一些处理;

}

2、多种异常

1.每个异常都写个trycatch

2.写一个try,多个catch

try{

可能会出现问题的代码;

}catch(异常的类名 变量名){

针对问题的一些处理;

}catch(异常的类名 变量名){

针对问题的一些处理;

}...

注意事项:

1、能明确异常的类型的时候尽量明确,不要用父类大的作处理

2、平级的关系,多个catch异常没有前后顺序关系,谁在前谁在后无所谓,一旦出现了父类继承的俄关系,父必须在后

3、一旦try里面的代码出现了问题,就会去匹配catch里面的异常,继续执行程序后面的代码,但是try里面的代码就停在了出现问题的那一步

3、JDK7新特性处理多个异常

try{

可能会出现问题的代码;

}catch(异常的类名1|异常的类名1|... 变量名){

针对问题的一些处理;

}

注意事项:

1、处理方式必须是一致的,这个方法虽然比较简洁,但是不够好,针对多种类型的问题,只给了一种解决方案

2、多个异常的类型之间必须是平级关系

4、throws,throw

编译时异常与运行时异常的区别

1、编译时异常:java程序必须显示处理,否则程序就会发生错误,无法通过编译

2、运行时期异常:无需显示处理,也可以和编译时异常一样处理

异常中需要掌握的方法

getMessage()

获取异常信息,返回字符串

toString()

获取异常类名和异常信息,返回字符串

返回此刻抛出的简短描述。结果是

这个对象的类的name+": "+调用这个对象的getLocalizedMessage()方法的结果

对于不重写此方法的子类,默认实现返回相同的结果为getMessage()

printStackTrace()

获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void

Throws抛出异常

有些时候,我们可以针对一些异常来进行处理,但是呢有些时候,我们根本没有权限去处理异常

或者说,我们根本就处理不了,干脆就不处理

为了解决这样的问题,并且还能保证程序正常运行的情况下

Java针对这种情况,提供了另外一种处理方案:throws 抛出

格式

throws 异常类名

注意:这个格式必须跟在方法的小括号后面,大括号前面

public static void fun() Throws ArithmeticException{
        int a=2;
        int b=0;
        System.out.println(a/b);
        
        System.out.println("hi我在么");
    }

注意事项

1、编译时期异常抛出,方法内可以不做处理,但是将来调用者调用该方法的时候必须做处理

2、运行时期异常抛出,将来调用者可以不做任何处理

但是一旦调用出错,后面的代码程序可以不做任何处理

3、最好抛出的是详细的异常类型,也是推荐的做法,可以抛出大的异常类型,但是处理的时候要对应上

4、尽量不要在main方法上抛出,如果在main方法上抛出,程序就会停止,后面的代码就不会执行

Throw抛出异常

在功能方法内部出现某种情况,程序不能继续运行

需要进行跳转时,就用throw把异常对象抛出

public static void fun(){
        int a=2;
        int b=0;
​
        if(b==0){
            throw new ArithmeticException();
        }
        System.out.println("hi我在么");
    }

Throw和Throws的区别

throws:

用在方法声明的后面,跟的是异常的类名

可以跟多个异常类名,用逗号隔开

throws表示的是出现异常的一种可能性,为了程序的正常运行,我们选择抛出给调用者处理

不一定会发生这种异常

throw:

用在方法体内,跟着的是异常的对象

只能抛出一个异常对象

表示的时候抛出异常,由方法体内的语句做处理

throw表示的是一定出现了某种异常

finally执行语句

在try..catch处理异常的时候,末尾通常会加一个finally

被他控制的语句体,一定会执行,一般情况下,里面放的是释放资源的代码

final,finally和finalize的区别

final:

最终的意思,可以修饰类,成员变量,成员方法

修饰类:类不能被继承

修饰成员变量:变量就是常量

修饰成员方法,方法不能被重写

finally:

是处理异常的一部分,一般情况下用于释放资源的作用,一般来说都会执行

特殊情况下:在执行finally之前JVM就停了(System.exit(0))

finalize:

是Object类中的一个方法,用于手动垃圾回收,但是不一定会立即回收

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值