目录
概念:
异常的处理方式
try...catch...finally
异常中需要掌握的方法
getMessage()
toString()
printStackTrace()
抛出
概念:
异常:用咱们老家的一句话来说就是,Java程序里面跑啊跑,跑啊跑,跑到一半,pia!出问题了,强制停止了,跑不下去了,芭比Q了,附上一张表情包
而异常可以分为以下爱的几类:Throwable;Error;Exception;RuntimeException,具体的关系如下图所示
这张图,就讲解的十分完美,
Throwable是所有异常的父类
Error是一个比较,不,是十分严重的问题(打一个不恰当的例子,你约会约到一半,外星人给你捉走了,这是你不能够立马解决的问题)。所以这个问题我们暂时不研究
Exception,这个异常,我们可以研究:这个异常可以分为一下几类:
1、运行时异常:RuntimeException,这样的问题我们也不处理,因为这样类似的问题 一般情况下都是由于你的代码不够严谨导致的。
2、编译时期异常: 除了不是RuntimeException的,都是编译时期异常,必须要处理,如果你不处理 编译不通过,无法运行。
如果程序出现了一个问题,而我们没有做任何的处理,Java虚拟机JVM就会给一个默认的处理方式------------把异常类的名称,相关的原因,以及出现问题的相关信息和位置信息输出在控制台,同时 java程序会结束,后面的代码不会执行。
异常的处理方式
1、try...catch...finally
2、throws
try...catch...finally
处理格式
try{
可能会出现问题的代码;
}catch(异常的类名 变量名){
针对问题的一些处理
}finally{
不管报不报错都会执行的代码(一般情况下,这里都会放一些释放资源的代码)
}
public class Demo {
public static void main(String[] args) {
//你要想解决异常,首先你是不是得先得写一个异常,所以,宝贝们,接下来就写一个异常吧
int a = 10;
int b = 0;
//ArithmeticException: / by zero 除数不能为零异常
// System.out.println(a / b);
try {
System.out.println(a / b);
}catch (ArithmeticException e){
System.out.println("除数不能为零");
}finally {
System.out.println("不管上面是啥报错,这里的内容都是会执行的");
}
}
}
运行结果:
变形格式
try{
可能会出现问题的代码;
}catch(异常的类名 变量名){
针对问题的一些处理
}
public class Demo {
public static void main(String[] args) {
//你要想解决异常,首先你是不是得先得写一个异常,所以,宝贝们,接下来就写一个异常吧
int a = 10;
int b = 0;
//ArithmeticException: / by zero 除数不能为零异常
// System.out.println(a / b);
try {
System.out.println(a / b);
}catch (ArithmeticException e){
System.out.println("除数不能为零");
}
}
}
运行结果:
处理多个异常的格式
try{
可能会出现问题的代码1;
可能会出现问题的代码2;
}catch(异常的类名1 变量名1){
针对问题的一些处理;
}catch(异常的类名2 变量名2){
针对问题的一些处理;
}
多个异常处理中多个catch的注意事项
1、能明确异常类型的时候,尽量要明确类型、不要用父类做处理
2、catch和catch之间的异常是平级关系,多个catch异常之间没有先后顺序,一旦出现了一个父类继承关系的时候父类必须在最后面
3、一但try里面的代码出现了问题,就会去匹配catch里面的异常,继续执行程序try...catch...后面的代码,try里面的额代码就停在了报错的那一步。
public class Demo {
public static void main(String[] args) {
//你要想解决异常,首先你是不是得先得写一个异常,所以,宝贝们,接下来就写一个异常吧
int a = 10;
int b = 0;
int[] arr = {1,2,3,4};
//ArithmeticException: / by zero 除数不能为零异常
// System.out.println(a / b);
//ArrayIndexOutOfBoundsException 地址下标越界异常
// System.out.println(arr[4]);
try {
System.out.println("hello");
System.out.println(a / b);
System.out.println(arr[4]);
}catch (ArithmeticException e){
System.out.println("除数不能为零");
}catch (ArrayIndexOutOfBoundsException f){
System.out.println("地址下标不能越界");
}
}
}
运行结果:
重点来了:!!!
JDK1.7之后针对多个异常处理新的处理方式:
try{
可能会出现问题的代码;
}catch(异常类名1 | 异常类名2 | ... 变量名){
处理异常的提示;
}
注意:
1、处理方式是一致的,这个方法虽然比较简洁,但是不够好,针多种类型的问题, 只给出了一种解决方案
2、catch中多个异常类型之间的关系必须是平级关系,不能存在继承关系
public class Demo {
public static void main(String[] args) {
//你要想解决异常,首先你是不是得先得写一个异常,所以,宝贝们,接下来就写一个异常吧
int a = 10;
int b = 0;
int[] arr = {1,2,3,4};
//ArithmeticException: / by zero 除数不能为零异常
// System.out.println(a / b);
//ArrayIndexOutOfBoundsException 地址下标越界异常
// System.out.println(arr[4]);
try {
System.out.println("hello");
System.out.println(a / b);
System.out.println(arr[4]);
}catch (ArithmeticException | ArrayIndexOutOfBoundsException f){
System.out.println("有错误");
}
}
}
运行结果:
异常中需要掌握的方法
getMessage() 获取异常信息,返回字符串
toString() 获取异常类名和异常信息,返回字符串
printStackTrace() 获取异常类名和异常信息,以及异常出现在程序中的位置,返回值void
getMessage()
toString()
看结果不难看出toString()里面的输出结果含有getMessage(),所以进原码我们可以看见toString()含有getMessage()【看原码:按住Ctrl左键点击要看的东西】
printStackTrace()
抛出
在今后的开发中,有些时候我们根本没有权限去做一些异常的处理,或者说我们根本就处理不了,所以干脆就别处理了,为了解决这样的问题,并且还能保证程序正常运行的情况下,java针对这种情况,提供了另外一个解决异常的方式:throws抛出(跟在方法后面)
格式:
throws 异常类名 在哪里写呢?在方法小括号后面,左大括号之前
注意事项:
1、main方法上个尽量不要进行异常抛出,因为程序会停止,后面代码不会执行
2、编译时期的异常抛出,方法内部不需要做处理,是由将来调用该方法的调用者处理
3、运行时期异常可以不抛出,但是一旦调用,出错后,后面的代码依旧不会执行
4、最好抛出一个具体的异常类型,也是推荐这么做的,可以抛出多个异常,用逗号隔开
异常注意事项:
1、子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。(父亲坏了,儿子不能比父亲更坏)
2、如果父类抛出了多个异常,子类重写父类时, 只能抛出相同的异常或者是他的子集,子类不能单独抛出父类没有的异常
3、如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常, 如果子类方法内有编译时期异常发生,那么子类只能try,不能throws



