在计算机程序运行的过程中,总是会出现各种各样的错误。
    有一些错误是用户造成的,比如,希望用户输入一个int类型的年龄,但是用户的输入是abc

    1. // 假设用户输入了abc:
    2. String s = "abc";
    3. int n = Integer.parseInt(s); // NumberFormatException!

    程序想要读写某个文件的内容,但是用户已经把它删除了:

    1. // 用户删除了该文件:
    2. String t = readFile("C:\\abc.txt"); // FileNotFoundException!

    所以,一个健壮的程序必须处理各种各样的错误。
    所谓错误,就是程序调用某个函数的时候,如果失败了,就表示出错。
    调用方如何获知调用失败的信息?有两种方法:
    方法一:约定返回错误码。
    例如,处理一个文件,如果返回0,表示成功,返回其他整数,表示约定的错误码:
    因为使用int类型的错误码,想要处理就非常麻烦。这种方式常见于底层C函数

    1. int code = processFile("C:\\test.txt");
    2. if (code == 0) {
    3. // ok:
    4. } else {
    5. // error:
    6. switch (code) {
    7. case 1:
    8. // file not found:
    9. case 2:
    10. // no read permission:
    11. default:
    12. // unknown error:
    13. }
    14. }

    方法二:在语言层面上提供一个异常处理机制。
    Java内置了一套异常处理机制,总是使用异常来表示错误。
    异常是一种class,因此它本身带有类型信息。异常可以在任何地方抛出,但只需要在上层捕获,这样就和方法调用分离了:

    1. try {
    2. String s = processFile(“C:\\test.txt”);
    3. // ok:
    4. } catch (FileNotFoundException e) {
    5. // file not found:
    6. } catch (SecurityException e) {
    7. // no read permission:
    8. } catch (IOException e) {
    9. // io error:
    10. } catch (Exception e) {
    11. // other error:
    12. }