哈喽~~~~~~今天给大家写了点关于Java中异常的一些知识~
有不足指正鸭~~~~~
异常在Java中是必不可少的~~~~~
java中异常是以什么形式存在的呢?
(1)异常在java中以类的形式存在,每一个异常类都可以创建异常对象
通过异常类实例化异常对象
NumberFormatException nfe=new NumberFormatException("数字格式化异常!");
System.out.println(nfe);
//输出:java.lang.NumberFormatException:数字格式化异常!
异常类创建对象
int a=10;
int b=0;
实际上jvm在执行到这里时,会new异常对象:new ArithmeticException: (”/by zero“)
int c=a/b;
System.out.println(c);
异常对应的现实生活?
类是模板
对象是实际存在的个体
钱包丢了(异常类):
2月8日,小明钱包丢了(异常对象)
2月5日,小红钱包丢了(异常对象)
!!!!java中异常类以类和对象形式存在
异常分类
1.Object下游Throwable(可抛出的)
Throwable下有两个分支:Error(不可处理,直接退出JVM)和Exception(可处理的)
Exception下有两个分支:
Exception的直接子类:编译时异常ExceptionSubClass(必须对这些异常进行处理)
RuntimeException 运行时异常
所有Exception的直接子类,都叫做编译时异常
2.所有异常都是在运行阶段发生的。因为只有程序运行阶段才可以new对象
异常的发生就是new异常对象
3.编译时异常(又叫受控异常或者受检异常)发生的概率比较高,运行时异常(又叫非受控异常或者未受检异常)发生的概率比较低
java语言中对异常的处理包括两种方式:
1.第一种方式:在方法声明的位置上,使用throws关键字,抛给上一级
第二种方式:使用try....catch语句进行异常的捕捉
2.注意,java中异常发生之后如果一直上抛,最终抛给了main方法,main方法继续向上抛,抛给了调用者jvm,jvm知道这个异常发生,只有一个结果,终止java程序的执行
3.public staitc void main(String【】 args){
//程序执行到此时发生了ArithmeticException异常,底层new了一个ArithmeticException异常对象,然后抛出了,由于main方法调用了100/0,所以这个异常ArithmeticException抛给了main方法,main方法没有处理,将这个异常自动抛给了jvm,jvm最终终止程序的执行
System.out.println(100/0);
//这里的hello没有输出,没有执行
System.out.println("hello");
4.上抛类似于推卸责任(继续把异常传递给调用者)
捕捉等于把异常拦下了,异常真的解决了(调用者是不知道的)
5.throws 后面也可以写多个异常,可以使用逗号隔开
6.一般不建议在main方法上使用throws,因为这个异常如果真的发生了,一定会抛给JVM,Jvm只有终止
异常处理机制的作用就是增强程序的健壮性。怎么能做到,异常发生了也不影响程序的执行。所以一般main方法
中的异常建议使用try....catch进行捕捉,main就不要继续上抛了
7.catch(FileNotFoundException e){}
e引用保存的内存地址是那个new出来异常对象的内存地址
8.注意:只要异常没有捕捉,采用上报的方式,此方法的后续代码不会执行
try语句块中的某一行出现异常,该行后面的代码不会执行
try....catch捕捉后可执行
9.深入try...catch
)1.catch后面的小括号中的类型可以是具体的异常类型,也可以是该异常类型的父类型
—)2.catch可以写多个,建议写catch的时候,精确的一个一个处理,这样有利于程序的调试
)3.catch写多个的时候,从上到下,必须遵守从小到大
10.JDK8新特性:catch(FileNotFoundException|NullPointerException e|ArithmeticException){}
11.Error所有的错误只要发生,java程序只有一个结果就是终止程序的执行,推出JVM,错误不能处理
12.无论是错误还是异常,都是可以抛出的
异常对象有两个二非常重要的方法:
获取异常简单的描述信息(这个信息实际上就是构造方法上面的String参数):String msg=exception.getMessage();
打印异常追踪的堆栈信息:exception.printStackTrace();一般使用这个
java后台打印异常堆栈追踪信息的时候,采用了异步线程的方式打印的
NullPointerException msg=new NullPointerException("空指针异常啊");
String s=msg.getMessage();
System.out.println(s);
msg.printStackTrace();
//空指针异常啊
//java.lang.NullPointerException: 空指针异常啊
at yicahng.main(yicahng.java:3)
关于try...catch中的finally子句
(1)在finally子句中的代码是最后执行的,并且一定会执行,即使try语句块中的代码出现了异常
finally子句必须和try一块儿出现,不能单独
(2)finally语句通常使用在哪些情况下呢
通常在finally语句块中完成资源的释放/关闭
因为finally中的代码比较有保障
即使try中的代码出现异常,finally中代码也会正常执行
2.try不能单独使用,try finally可以联合使用
以下代码执行顺序:先执行try。。。再执行finally。。。最后执行return(return语句只要执行方法必然结束)
try{
System.out.println("nihao");
return;
}finally {
System.out.println("finally");
}return后执行finally一定执行
//这里不能写语句执行不到因为有return System.out.println("sawd");//执行不到
3.退出JVM语句System.exit(0)
退出jvm的话finally语句不执行
try{
System.out.println("nihao");
System.exit(0);//退出JVM
}finally {
System.out.println("finally");
}
4.final(关键字)、finally(关键字)、finalize(标识符)的区别
final是关键字表示最终的不变的
修饰的类无法继承 修饰的方法无法覆盖 修饰的变量不能重新赋值
final int i=100;
finally和try联合使用
finalize()是object中的一个方法,作为方法名出现,所以finalize是标识符
由GC垃圾回收器调用
自定义异常
(1)SUN提供的JDK内置的异常肯定是不够用的。在实际开发中,有很多业务,这些业务出现异常后
JDK中都是没有的,和业务挂钩,就需要我们自定义了
(2)如何自定义异常
第一步:编写一个类继承Exception或者RuntimeException
第二步:提供两个构造方法,一个无参的,一个带有String的参数
public class MyException extends Exception {
public MyException() {
}
public MyException(String message) {
super(message);
}
}
-------
1.重写之后的方法不能比重写之前的方法抛出更多的异常,可以更少
2.总结异常中的关键字:
异常捕捉:try、catch、finally
throws在方法声明位置上使用,表示上报异常信息给调用者
throw手动抛出异常
感谢观看~~