1. 异常

2. throws声明异常

在方法定义处 声明 要捕获的异常

使用throws关键字 加 异常名

  1. public static void method() throws NullPointerException{
  2. int[] arr =null;
  3. System.out.println(arr[2]);
  4. }

运行时异常可以省略,但编译时异常不能省略声明,否则不能正常执行

3. throw抛出异常

使用 thorw new 关键字 加 异常 可以在代码块中直接抛出一个异常

  1. System.out.println("接下来要new一个异常");
  2. throw new NullPointerException();

4. try catch

  1. try {
  2. pringArr(arr); // 可能会发生异常的代码块
  3. System.out.println("发生异常后异常语句try后面的代码不会继续执行");
  4. } catch (NullPointerException a){
  5. System.out.println("捕获到异常"); // 如果捕获到异常执行的代码块
  6. }
  7. System.out.println("捕获到异常后并不会结束虚拟机");

4.1. 多个catch

  1. try {
  2. System.out.println(Integer.parseInt("123"));
  3. System.out.println(2 / 0);
  4. //catch 可以有多个 ,用来捕获多个异常
  5. } catch (NumberFormatException err) {
  6. System.out.println("格式化异常");
  7. } catch (ArithmeticException err) {
  8. System.out.println("数字运算异常");
  9. }

如果多个异常中存在子父类,那么父类异常应该写在最后,因为如果写在最前面会捕抓到所有的子类异常,后面的子类异常语句并没有任何效果.

4.2. 捕抓所有异常 Exception

  1. try {
  2. System.out.println(Integer.parseInt("123"));
  3. System.out.println(2 / 0);
  4. } catch (Exception err) {
  5. System.out.println("捕抓所有异常");
  6. //不推荐使用,因为我们捕获不同异常可能会有不同的处理方式
  7. }

4.3. error中的内部方法

  • getMessage() 返回异常的信息
  • toString() 返回异常的类型 和信息
  • printStackTrace() 将异常信息以红色字体呈现在控制台中,与默认异常报错不同,这些方法并不会结束虚拟机
  1. try {
  2. int[] arr ={1,2,3,4};
  3. System.out.println(arr[10]);
  4. } catch (ArrayIndexOutOfBoundsException e) {
  5. String message = e.getMessage(); // 返回异常的信息
  6. System.out.println(message);
  7. String s = e.toString(); //返回异常的类型 和信息
  8. System.out.println(s);
  9. e.printStackTrace(); // 将异常信息以红色字体呈现在控制台中,与默认异常报错不同,这些方法并不会结束虚拟机
  10. System.out.println("123");
  11. }

5. 自定义异常

自定义异常 只需要给予一个 无参构造方法 和 带参构造方法 并且继承运行时异常或编译时异常即可

  1. public class AgeOutofBoundsException extends RuntimeException {
  2. public AgeOutofBoundsException() {
  3. }
  4. public AgeOutofBoundsException(String message) {
  5. super(message);
  6. }
  7. }