异常体系以及try..catch,finally,throw,throws的使用
文章目录
前言
首先,我们今天一起聊一下java中的异常体系
一、什么是异常机制
首先,在Java中,当所写代码不符合某些逻辑思想上规定,进而在JVM运行期间系统会自动将不符合逻辑的代码进行一系列的处理,从而使用户可以及时去确定出现问题的位置,这就是异常机制。
(换句话来说,当我们发现代码出现逻辑思想上的不规范时,我们是不是可以通过添加一些条件使逻辑不出错,但会性能会降低,消耗也会增大,从而我们可以借助异常类对其进行逻辑上的判断和检测)。
Throwable类中包含了异常(Exception类),和错误(Error类)
二、异常的分类
1.RuntimeException类 和 继承Exception的其他子类
首先,所有的异常子类都继承Exception父类
Java机制中,可分为RuntimeException类 和 继承Exception的其他子类
常见的RuntimeException类的异常子类:
1.NullPointerException(空指针异常)
2.IndexOutOfBoundsException(下标超出异常)
3.IllegalArgumentException(参数不合法异常)
4.NumberFormatException(数字格式化异常)
5.ClassCastException(类型转换异常)
6.ArithemticException(算术逻辑异常)
常见的继承Exception类的其他子类:
1.SQLException
2.IOException
2.No Checked异常 和 Checked异常
No Checked异常:JVM可以进行简单的处理,使得该类异常可以使用try…catch捕获,throw抛出异常,也可以不用
No Checked异常:RuntimeException异常
Checked异常:该类异常必须要进行 throw抛出异常和try…catch捕获。
Checked异常:SQLException类 IOException类
三、try…catch , finally;throw;throws
1.try…catch 和 finally
try:用于保存可能出现异常的代码
运行时,如果jvm检测到代码异常,则创建一个和该异常相关的对象,并且代码的执行流程会跳过后面的try中的代码,进入catch块中执行。
catch:进行捕获异常,根据jvm创建的异常对象和catch块中的异常类型进行匹配,成功则执行代码块的内容。(利用 instanceof 运算符进行类型匹配)
finally:无论是否出现异常或return,都执行,除非在之前有System.exit(0)=>虚拟机退出
在try…catch之外的代码,若没有reuturn语句,则执行其代码;
public class Demo05 {
public static void main(String[] args) {
try {
int num1=12,num2=6;
int result=num1/num2;
System.out.printf("%d÷%d=%f\n",num1,num2,result);
String str=null;
System.out.println(str.length());
}catch(ArithmeticException ex){
System.out.println("除数不能为零");
ex.printStackTrace(); //打印当前异常的堆栈信息
}catch(NullPointerException ex) {
System.out.println("不能访问一个Null对象的方法哦");
//return;
//System.exit( 0);
}catch(IllegalFormatConversionException ex) {
System.out.println("注意格式化占位符的对应关系鸭!");
}catch(Exception ex) {
System.out.println("哎哟,出错了鸭!!!");
}finally {
System.out.println("finally.............");
}
System.out.println("程序结束");
}
}
2.throw 和 throws
快捷键:Alt+Shift+z
throws:将声明异常类型抛出到该方法名之后
throw:用于创建抛出的异常对象,放于方法体内。
若抛出的异常对象为No Checked异常,可以使用try…catch捕获,throw抛出异常,也可以不用
若抛出的异常对象为Checked异常,必须使用try…catch捕获,throw抛出异常
public class Demo07 {
public static void main(String[] args) {
try {
dosth();
} catch (FileNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
public static void dosth() throws FileNotFoundException{
int a=23,b=3;
if(a>b) {
throw new FileNotFoundException(); //No Checked异常
}
}
四 自定义抛出
当系统的异常类不足以按照自己的想法去实现,则自定义抛出可以解决这个问题
步骤:
1.创建一个自定义的异常类,并继承某个父类,这里继承RuntimeException类,利用 super关键字,将参数传入到父类进行一系列操作
2.利用throw创建一个自定义的异常类型对象,可以传入参数,
3.使用throws将异常类型抛出到该方法外
4.在主函数进行对异常的捕获
注意:
1.若是自定义异常类继承Exception,(No Check异常),可以处理该异常
2.若是自定义异常类继承RuntimeException(Check异常),必须处理也可以不处理该异常
package com.apesource.exception;
public class Demo08 {
public static void main(String[] args) {
try {
donothing();
} catch (CountTooLargeException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
//自定义异常
public static void donothing() throws CountTooLargeException {
int count=9999;
if(count>999) {
//创建并抛出自定义异常对象
//throw new CountTooLargeException(); //使用无参构造方法创建,采用默认提示信息
throw new CountTooLargeException("商品数量过大"); //使用有参构造方法创建,采用自定义提示信息
}
}
}
class CountTooLargeException extends RuntimeException{
public CountTooLargeException(String message) {
super(message);
}
上述就是今天的内容,让我们一起学习,要是有不对的地方,还请大家帮忙指正呀。加油,兄弟们。
推荐阅读
-
异常类的了解、异常的处理方案、编译时期异常和运行时期异常区别、throws和throw的区别、自定义异常类 、捕获异常的标准格式、final、finally、finalize的区别
-
自定义异常和throw、throws的使用
-
异常的使用,try-catch-finally的使用,自定义异常,throws和throw的区别
-
Java的异常处理:try-catch-finally throws throw
-
java的异常处理try, catch,throw,throws和finally
-
异常(try……catch……finally、throws和throw的区别、自定义异常)
-
JAVA异常的处理try...catch,finally,throw,throws
-
Java中的try,catch,throw,throws,finally与异常类
-
异常体系以及try..catch,finally,throw,throws的使用
-
异常处理的那些事——try catch finally、throw、throws\自定义异常