什么是异常

定义:异常指程序运行中出现的不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等

异常英文:Exception

  • Java内置了一套异常处理机制,总是使用异常来表示错误
  • 异常是一种class,因此它本身带有类型信息
  • 异常可以在任何地方抛出,但只需要在上层捕获,这样就和方法调用分离了
try {
    String s = processFile(“C:\\test.txt”);
    // ok
} catch (FileNotFoundException e) {
    // file not found
} catch (SecurityException e) {
    // no read permission
} catch (IOException e) {
    // io error
} catch (Exception e) {
    // other error
}

异常的分类

异常分为三种类型:

  • 检查性异常
  • 运行时异常
  • 错误ERROR

异常体系结构

Java把异常当作对象处理,并定义一个基类java.lang.Throwable作为所有异常的超类

Throwable是异常体系的根,它继承自Object

Throwable异常分为两大类:

  • 错误Error:表示严重的错误,程序对此一般无能为
  • 异常Exception:运行时的错误,它可以被捕获并处理

Error错误分为:

  • VirtulMachineError
  • StackOverflowError:栈溢出
  • OutOfMemoryError:内存耗尽
  • A WTError

Exception分为两大类:

  • RuntimeException
  • 非RuntimeException
  • IOException、ReflectiveOperationException…

某些异常是应用程序逻辑处理的一部分,应该捕获并处理

例如:

  • NumberFormatException:数值类型的格式错误
  • FileNotFoundException:未找到文件
  • SocketException:读取网络失败

还有一些异常是程序逻辑编写不对造成的,应该修复程序本身

例如:

  • NullPointerException:对某个null的对象调用方法或字段
  • IndexOutOfBoundsException:数组索引越界

Error

Error类对象由Java虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关

  • Java虚拟机运行时错误(VirtulMachineError
    当JVM不再有继续执行操作所需的内存资源时,将出现OutOfMemoryError;这些异常发生时,Java虚拟机(JVM)一般会选择线程终止
  • 还有发生在虚拟机试图执行应用时,如类定义错误(NoClassDefFoundError)、链接错误(LinkageError
    这些错误是不可查的,因为它们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的状况

Exception

在Exception分支中有一个重要子类:RuntimeException(运行时异常)

RuntimeException

  • ArrayIndexOutOfBoundsException:数组下标越界
  • NullPointerException:空指针异常
  • ArithmeticException:算术异常
  • MissingResourceException:丢失资源
  • ClassNotFoundException:找不到类

这些异常程序可以选择捕获处理,也可以不处理

这些错误一般都是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生

Error与Exception的区别

Error通常是灾难性的致命的错误,是程序无法控制和处理的,当出现这些异常时,Java虚拟机一般会选择终止线程

Exception痛苦情况下是可以被程序处理的,并且在程序中应该尽可能的处理这些异常

异常处理机制

int a = 1;
int b = 0;

try { //try监控区域
    System.out.println(a / b);
} catch(ArithmeticException e) { //catch(想要捕获的异常类型) 捕获异常
    System.out.println("程序出现异常");
} catch(Exception e) {
  	  e.printStackTrace(); //打印错误的栈信息
} finally { //处理善后工作
    System.out.println("finally");
}

catch捕获的异常,越大的类型需要写在越下面

在try捕捉的异常之后,还可以主动抛出异常,一般在方法中使用

try {
    if (b == 0) {
        thorw new ArithmeticException();
    }
}

public void test(int a, int b) {
    if (b == 0) {
        thorw new ArithmeticException();
    }
}

假设这个方法中,处理不了这个异常,可以在方法上抛出异常

public void test(int a, int b) thorws ArithmeticException {
    if (b == 0) {
        thorw new ArithmeticException();
    }
}

自定义异常

继承Exception