1.异常处理语句的格式
try{
// 有可能出现异常的语句;
}catch(异常类 异常对象){
// 出现异常后的处理语句;
}[catch(异常类 异常对象){
// 出现异常后的处理语句;
}][finally{
// 无论是否异常,都会执行到这里;
}]
catch只捕获一次,就算有多个异常错误都能捕获。
根据对象多态性,所有的子类实例可以全部使用父类接收,此时可以利用向上转型的概念,让所有的异常对象都使用Exception接收,Exception异常捕获的范围很大,开放中常用到。
为何不直接使用Throwable,Throwable是Exception Error的的父类,Error本身不需要程序处理,而程序中只需要处理Exception,所以没必要使用Throwable。
2.throws关键字
使用throws声明的方法表示此方法不处理异常,而交给方法的调用处进行处理(即将异常抛给上一层去处理)。
throws的格式如下,
public 返回值类型 方法名称(数据类型 参数) throws 异常类{}
代码示例如下,
package java_book;
public class testThrows {
public static void main(String[] args) {
Math m = new Math();
try {
System.out.println("计算结果为:" + m.div(5, 0));
}catch(Exception e) {
e.printStackTrace();
}
}
}class Math{
public int div(int i, int j) throws Exception{
int temp = i/j;
return temp;
}
}
运行结果如下,
java.lang.ArithmeticException: / by zero
at java_book/java_book.Math.div(testThrows.java:16)
at java_book/java_book.testThrows.main(testThrows.java:7)
3.throw关键字
与throws不同的是,使用throw关键字可以直接抛出一个异常,抛出时直接抛出异常类的实例化对象即可。
代码示例如下,
try {
throw new Exception("自定义异常");
}catch(Exception e) {
e.printStackTrace();
}
4.Exception与RuntimeException
两者的关系为,
使用规则,
1)Exception在程序中必须使用try/catch进行处理;
2)RuntimeException在程序中可以不使用try/catch进行处理,但是如果有异常出现,则异常将由JVM处理(因为相关静态方法中使用了throws关键字,它可以将当前的异常抛给上层,而JVM是java的最上层,但是出现异常肯定也会导致程序中断,最好用上try/catch)。
5.断言assert
断言就是肯定某一个结果的返回值是正确的,如果最终此结果的返回值是错误的,则通过断言检查肯定会提示错误信息。
断言的定义格式如下,
assert boolean表达式 [: 详细信息]
示例代码如下,
package java_book;
public class testAssert {
public static void main(String[] args) {
int x[] = {1, 2, 3};
System.out.println("开始断言,");
assert x.length == 0; // 这里没有效果,不知道java11是否取消了assert的作用
System.out.println("数组的长度为:" + x.length + ",断言结束。");
}
}
本章小结