首先看一下异常的继承关系
Throwable
Error 严重问题,JVM内部出现的问题,我们不处理。
Exception
RuntimeException 运行期异常,由于代码的不严谨,我们需要修正代码
非RuntimeException 编译期异常,不处理程序编译不通过
综上所述,我们只需处理非RuntimeException的异常
首先我们讲解try...catch...finally
举个例子吧,为了容易举例,暂且以一个运行期异常为例,我相信你能看懂
package com.hezhiying;
public class Main {
public static void main(String[] args) {
int a = 10;
int b = 0;
System.out.println("在不判断b是否为0的情况下直接运行");
System.out.println(a / b);
System.out.println("运行正常");
}
}
运行结果:
也就是说,当走到分母为0的时候就报错了,导致后面的程序无法进行,故我们需要异常处理
经过改进,虽然这个地方有报错,但是还能继续往下进行
package com.hezhiying;
public class Main {
public static void main(String[] args) {
int a = 10;
int b = 0;
System.out.println("在不判断b是否为0的情况下直接运行");
try {
System.out.println(a / b);
} catch (ArithmeticException e) {
//这里的异常时分母不为0,如果不知道什么异常,可以用其父类Exception
System.out.println("有异常");
}
System.out.println("运行正常");
}
}
运行结果:
但是这样不是太好,因为这样我们不知道异常出现在哪了,继续改进
package com.hezhiying;
public class Main {
public static void main(String[] args) {
int a = 10;
int b = 0;
System.out.println("在不判断b是否为0的情况下直接运行");
try {
System.out.println(a / b);
} catch (ArithmeticException e) {
e.printStackTrace();
// System.out.println("有异常");
}
System.out.println("运行正常");
}
}
运行结果:
这个就很好了,不仅能继续往下进行,还能告诉我们在异常的原因以及在哪异常了
对于异常的处理还有就是多个catch的
在这里只讲一下格式,用法跟一个一样
try {
...
} catch (...) {
...
}catch(...) {
...
}...
还有一个就是try…catch…finally
这里的finally下的语句,不管有没有异常都会执行,下面是一个有异常的例子
package com.hezhiying;
public class Main {
public static void main(String[] args) {
int a = 10;
int b = 0;
System.out.println("在不判断b是否为0的情况下直接运行");
try {
System.out.println(a / b);
} catch (ArithmeticException e) {
e.printStackTrace();
// System.out.println("有异常");
}finally {
System.out.println("I am finally");
}
System.out.println("运行正常");
}
}
运行结果:
再举一个没异常的例子:
package com.hezhiying;
public class Main {
public static void main(String[] args) {
int a = 10;
int b = 0;
System.out.println("在不判断b是否为0的情况下直接运行");
try {
System.out.println(a + b);
} catch (ArithmeticException e) {
e.printStackTrace();
// System.out.println("有异常");
}finally {
System.out.println("I am finally");
}
System.out.println("运行正常");
}
}
运行结果:
现在我们讲解throws和throw
throws是抛出异常的意思,把自己处理不了的,在方法上声明,告诉调用者,这里有问题,也就是抛给别人
throws在方法声明上,后面跟的是异常的类名,可以是多个
throws是声明方法有异常,是一种可能性,这个异常并不一定会产生
throw在方法体中,后面跟的是异常对象名,并且只能是一个
throw抛出的是一个异常对象,说明这里肯定有一个异常产生了
举个例子吧:
package com.hezhiying;
public class Main {
public static void show() throws Exception {//在方法上声明,我是有问题的,调用时要注意
int a = 10;
int b = 0;
System.out.println(a / b);
}
public static void main(String[] args) throws Exception {
show();//这里在调用时继续抛出,在main里抛出就抛给了JVM了
System.out.println("我能输出");
}
}
运行结果:
在这里由于是抛给了JVM故,后面那句话没有输出了,对此我们进行了优化
package com.hezhiying;
public class Main {
public static void show() throws Exception {//在方法上声明,我是有问题的,调用时要注意
int a = 10;
int b = 0;
System.out.println(a / b);
}
public static void main(String[] args) {
try {//在这里进行了处理
show();
}catch(Exception e) {
e.printStackTrace();
}
System.out.println("我能输出");
}
}
运行结果:
对于throw就是在方法体中抛出一个对象,看个例子
package com.hezhiying;
public class Main {
public static void show() throws Exception {
int a = 10;
int b = 0;
if (b == 0) {
throw new Exception();
} else {
System.out.println(a / b);
}
}
public static void main(String[] args) {
try {
show();
}catch(Exception e) {
e.printStackTrace();
}
System.out.println("我能输出");
}
}
运行结果:
这个异常处理,也就是中间出现了异常而不影响后面程序的运行。
都看到这了,希望我自己的理解也帮到了你