异常处理准则

210 阅读2分钟

异常中断程序问题

一旦出现,会终止程序

常见的能够终止程序的异常

一旦触发此类异常,程序将就此终止

NullPointerException: 空指针异常

异常信息

Exception in thread "main" java.lang.NullPointerException
	at com.itpm.project.ExceptionHandlingTest.nullPointerException(ExceptionHandlingTest.java:22)
	at com.itpm.project.ExceptionHandlingTest.main(ExceptionHandlingTest.java:8)

ArithmeticException: 算数异常

异常信息

Exception in thread "main" java.lang.ArithmeticException: / by zero
	at com.itpm.project.ExceptionHandlingTest.ArithmeticException(ExceptionHandlingTest.java:46)
	at com.itpm.project.ExceptionHandlingTest.main(ExceptionHandlingTest.java:11)

RuntimeException: 运行时异常

异常信息

Exception in thread "main" java.lang.RuntimeException
	at com.itpm.project.ExceptionHandlingTest.runtimeExceptionTest(ExceptionHandlingTest.java:40)
	at com.itpm.project.ExceptionHandlingTest.main(ExceptionHandlingTest.java:14)

异常处理的准则

1.释放资源必须放置到finally从句中
2.尽可能地缩小try...catch语句的监控范围
3.优先使用专用的异常类处理异常,最后再使用Exception异常来处理
4.catch从句中,尽可能地恢复异常或详细地输出异常信息

finally从句的特性

1.无论程序运行是否发生异常,发生任何异常,finally从句中的代码都会被执行,即便在trycatch中使用return也不会影响finally从句中的代码的执行;除非是trycatch中使用了System.exit
2.finally从句中,可以存放回收资源的代码,如释放数据库连接,释放IO对象,清空集合,设置大对象为null,以减少大对象上的强引用,从而提升大对象的回收时间

代码展示

public class ExceptionHandlingTest {

    public static void main(String[] args) {

        /* 无异常正常运行方法 */
        noAbnormalities();

        System.out.println("-----------------");

        /* 有异常正常运行方法 */
        thereIsAbnormal();

        System.out.println("-----------------");

        /* 有return的无异常正常运行方法 */
        haveRETURNOfNoAbnormalities();

        System.out.println("-----------------");

        /* 有return的存在异常正常运行方法 */
        haveRETURNOfThereIsAbnormal();

        System.out.println("-----------------");

        /* 执行System.exit的无异常方法 */
        useSystemExitNoAbnormalities();

        System.out.println("-----------------");

        /* 执行System.exit的无异常方法 */
        useSystemExitThereIsAbnormal();

        System.out.println("-----------------");

    }

    public static void noAbnormalities() {

        try {
            System.out.println("代码无异常 try 已运行");
        } catch (Exception e) {
            System.out.println("代码存在异常 catch 已运行");
            e.printStackTrace();
        } finally {
            System.out.println("finally 已运行");
        }
    }

    public static void thereIsAbnormal() {

        try {
            int i = 1 / 0;
            System.out.println("代码无异常 try 已运行");
        } catch (Exception e) {
            System.out.println("代码存在异常 catch 已运行");
            e.printStackTrace();
        } finally {
            System.out.println("finally 已运行");
        }
    }

    public static void haveRETURNOfNoAbnormalities() {

        try {
            System.out.println("代码无异常 try 已运行 代码块中return将运行");
            return;
        } catch (Exception e) {
            System.out.println("catch 已运行");
            e.printStackTrace();
            return;
        } finally {
            System.out.println("return运行结束 finally 已运行");
        }
    }

    public static void haveRETURNOfThereIsAbnormal() {

        try {
            int i = 1 / 0;
            System.out.println("try 已运行");
            return;
        } catch (Exception e) {
            System.out.println("代码存在异常 catch 已运行 代码块中return将运行");
            e.printStackTrace();
            return;
        } finally {
            System.out.println("return运行结束 finally 已运行");
        }
    }

    public static void useSystemExitNoAbnormalities() {

        try {
            System.out.println("try 已运行, System.exit方法将执行");
            /* 正常结束当前正在运行的Java虚拟机 */
            System.exit(0);
        } catch (Exception e) {
            System.out.println("代码存在异常 catch 已运行 System.exit方法将执行");
            e.printStackTrace();
            /* 正常结束当前正在运行的Java虚拟机 */
            System.exit(0);
        } finally {
            System.out.println("System.exit方法已执行 finally 已运行");
        }
    }

    public static void useSystemExitThereIsAbnormal() {

        try {
            int i = 1 / 0;
            System.out.println("try 已运行, System.exit方法将执行");
            /* 正常结束当前正在运行的Java虚拟机 */
            System.exit(0);
        } catch (Exception e) {
            System.out.println("代码存在异常 catch 已运行 System.exit方法将执行");
            e.printStackTrace();
            /* 正常结束当前正在运行的Java虚拟机 */
            System.exit(0);
        } finally {
            System.out.println("System.exit方法已执行 finally 已运行");
        }
    }
}

打印展示

异常处理