异常 - Exception
java里面万物皆为对象,异常也有类,每个异常都有对应的异常类,因为java是自上而下的执行,所以一旦发生异常下面的程序就不执行了,这时候我们就要学会如何处理异常了
异常的处理有两种方式
第一种:try catch
- try的意思是尝试,里面放认为会有异常的代码块,尝试去运行
- catch的意思是抓,用来捕捉异常,并解决这个异常让程序可以继续执行下去
catch可以抓取多个异常,但是最下面的异常必须要是Exception;也可以直接抓Exception异常
public class Client1 { public static void main(String[] args) { int i = 0; System.out.println(div(10, 2)); System.out.println("xxx"); } public static int div(int x, int y) { int rs = 0; try { rs = x / y; System.out.println("xxx"); } catch (NullPointerException e) { e.printStackTrace(); rs = 0; } catch (Exception e) { e.printStackTrace(); rs = 0; } return rs; }
第二种:throw
- throw的意思是抛出,就是遇到了异常但不处理,而是把它抛出去
- throw需要在方法后面显式的标记声明方法是有异常的,调用该方法的程序是要显式的处理异常,后者也可以再次抛出
自定义的创建一个异常对象。在一般的异常发生时候,虚拟机会动态的创建一个「系统异常」抛出,和自定义使用 throw 抛出是一个概念
public class Demo3 { public static void main(String[] args) throws Exception { fun1(17); System.out.println("end"); } public static void fun1(int age) throws Exception { if (age < 18) { throw new Exception("您的年龄不合法"); } else { System.out.println("您已经进入VIP房间"); } } }
finally关键字
无论是否出现异常都会被执行,特别要注意的是,如果没有写 catch ,那么 finally 是会被执行的,但是中断后的语句是不会被执行的。一般用来资源回收
public static int div(int x, int y) {
int rs = 0;
try {
rs = x / y;
System.out.println("xxx");
} catch (NullPointerException e) {
e.printStackTrace();
rs = 0;
} catch (Exception e) {
e.printStackTrace();
rs = 0;
} finally {
// 资源回收
System.out.println("finally action");
}
System.out.println("finally action");
return rs;
}
}
学会看异常的堆栈信息
在今后用到java的时候回遇到很对异常,我们学会看异常的堆栈信息会大大提高我们的工作效率,节省时间,配合debug模式来调试让程序正确运行
- 异常类
- 异常提示信息:getMessage()
- 异常所在的代码位置:自下而上是异常出现的代码所在方法的调用顺序的先后
- 通常第一行是异常的直接原因,后面都是抛出去的一层层向上调用了异常的方法
常见的几种异常
- NPE:NullPointerException 在调用对象属性或者方法的时候,对象其实是个 null,就会报此异常;通常叫空指针异常
- java.lang.ArrayIndexOutOfBoundsException:数组越界
- java.lang.IndexOutOfBoundsException: Index: 1, Size: 1:集合越界
- runtimeException:运行时异常
- 还有就是所有异常的父类:Exception