异常处理的结构
try{ 可能出现异常的语句 }[catch(异常类型 对象){ //进行异常处理 }][catch(异常类型 对象){ //进行异常处理 }][catch(异常类型 对象){ //进行异常处理 }][finally]{ 无论是否出现异常都要执行的语句 }
案例:编写一个简单的异常
public class Test{ public static void main(String args[]){ System.out.println("进行计算"); try{ System.out.println(10/0); }catch(ArithmeticException e){ e.printStackTrace();//进行异常输出的方法 } System.out.println("计算结束"); } }
运行结果
进行计算 java.lang.ArithmeticException: / by zero at Test.main(Test.java:6) 计算结束
Throwable是所有异常的父类,其中有Error,和Exception
Error:指的是jvm异常,此时程序还没有执行;
Exception:指的是程序运行过程中产生的异常
throws关键字:
当程序出现异常之后交给调用处处理,而且调用的时候必须进行异常处理
class MathUtil{ public static int div(int x,int y) throws Exception{ return x/y; } } public class Test{ public static void main(String args[]){ try{ System.out.println(MathUtil.div(10,2));//由于throws的存在,所以此处必须进行异常的处理 }catch(Exception e){ e.printStackTrace(); } } }
当某一个方法通过throws抛出异常,那么在调用的时候必须使用try{}catch{}进行处理,如果在主方法上面继续抛出异常则异常交给jvm进行处理
throw关键字:throw可以主动抛出一个异常,然后利用try{}catch{}进行处理
public class Test{ public static void main(String args[]){ try{ throw new Exception("自定义异常"); }catch(Exception e){ e.printStackTrace(); } } }
throws和throw之间的区别
throw:指的是在方法中人为的抛出一个异常,这个异常可以是自己定义的也可以是系统定义的异常
throws:指的是在方法定义定义的时候进行异常的抛出,在该方法被调用的时候必须进行异常的处理
范例:简单的异常代码模型
class MyMath{ public static int div(int x,int y) throws Exception{ //此处抛出异常交给调用处处理 System.out.println("计算开始"); int result = x/y; System.out.println("计算结束"); return result; } } public class Test{ public static void main(String args[]){ try{ MyMath.div(10,0); //此处出现异常,想让后面的语句也能继续执行,需要在MyMath类中处理x/y这条语句 }catch(Exception e){ e.printStackTrace(); } } }
执行结果
计算开始 java.lang.ArithmeticException: / by zero at MyMath.div(Test.java:5) at Test.main(Test.java:13)
出现异常之后,后面的语句将不再执行,这样的代码不利于程序的运行
范例:改善以上程序
class MyMath{ public static int div(int x,int y) throws Exception{ //此处抛出异常交给调用处处理 int result = 0; System.out.println("计算开始"); try{ result = x/y; //如果出现异常,这句代买不执行 }catch(Exception e){ throw e;//抛出异常给方法,方法中因为存在throws,就会把throw抛出异常交给被调用处处理 }finally{//表示无论是否出现异常都要执行 System.out.println("计算结束"); } return result; } } public class Test{ public static void main(String args[]){ try{ MyMath.div(10,0); //此处出现异常,想让后面的语句也能继续执行,需要在MyMath类中处理x/y这条语句 }catch(Exception e){ e.printStackTrace(); } } }
计算开始 计算结束 java.lang.ArithmeticException: / by zero at MyMath.div(Test.java:6) at Test.main(Test.java:18)
RuntimeException类
如果在方法上面通过throws抛出了RuntimeException类或者子类异常,用户可以根据需要尽心选择性处理,如果用户不处理则交给jvm进行处理
问? Exception和RuntimeException类的区别;
Exception是RuntimeException的父类,throws抛出Exception异常用户必须处理,RuntimeException可以选择性进行处理
RuntimeException常见的子类:NullPointerException,ClassCastException ArithmeticException
assert关键字(断言)
两种形式
1. assert boolean表达式;
2. assert boolean表达式: 基本类型/表达式/object类型; 这里和三目运算符比较相似
在进行程序编译的时候需要手动启用assertion功能