处理的异常分为编译异常和运行异常(编译异常,必须处理<try-catch-finally或是throws二选一>,而对于运行异常,可以不处理,默认throws)
![](https://i-blog.csdnimg.cn/blog_migrate/cd1f69ba1edf556cd1b2c46cc4edc68c.png)
1、先来介绍try-catch-finally,代码语法如下:
try{
异常代码;
}catch(Exception e){
1、系统将异常代码封装为e,传入catch代码块中执行,若没有异常代码,catch代码块不执行
2、程序员自己可加入代码逻辑
}finally{
不管代码是否异常,catch是否执行,finally都会执行
}
温馨其实:如果有异常 但是没处理 也就是try-finally,程序会在执行完finally后直接崩溃 不执行之后的语句
示例
public class SS {
public static void main(String[] args){
try {
int a = 30;
int b = 0;
int c = a/b;
System.out.println(c);
}
catch (Exception e) {
System.out.println("异常处理:" + e.getMessage());
}
finally {
System.out.println("第一个异常结束");
}
try {
int c = 18;
int d = 2;
int e = c/d;
System.out.println(e);
} catch (Exception exception) {
System.out.println("异常处理:" + exception.getMessage());
} finally {
System.out.println("第2个异常结束 ");
}
try {
Person p = new Person();
p = null;
System.out.println(p.getClass());
} finally {
System.out.println("第3个异常 程序还在执行");
}
System.out.println("程序还执行吗");
}
}
class Person{
}
运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/a3b0a5694778913e07709ebaa1385e22.png)
最后一个异常为空指针异常,没有用catch处理,则执行完finally程序崩溃,不执行下面的代码,所以最后一个输出语句没有输出
2、throws:
假设代码运行时 调用关系如图所示
![](https://i-blog.csdnimg.cn/blog_migrate/bb808778260a6cf97503550a20c5b7d0.png)
throws运行机制如下:
程序从上往下运行,运行到4步发现有异常,这时有两种选择 一种是try-catch-finally,另外一种是throws,选t-c-f就会解决异常,但选择throws时会将异常抛出到上一步也就是第3步,同样地,第3 步也会有上述两种选择,以此类推,一直抛到jvm,这时jvm发现异常抛回他会选择不进行处理,终止程序。
示例:
public class SS {
public static void main(String[] args) {
A a = new A();
a.f1();
}
}
class A {
public void f1() throws ArithmeticException{//方法内为运行异常,可以不处理,程序会自动throws
int a = 16;
int b = 4;
int c = a/b;
System.out.println(c);
}
}
class F extends A{
public void f1() throws ArithmeticException{//这里要么和父类一样,要么是父类的子类
}
}
温馨提示:子类的异常类型必须和父类的异常类型一致,或是父类异常类型的子类
当然也可以不写