zoukankan      html  css  js  c++  java
  • java异常处理

    可直接看这篇文章即可:http://www.importnew.com/26613.html

    java异常类图

    非检查异常(unckecked exception):Error 和 RuntimeException 以及他们的子类。javac在编译时,不会提示和发现这样的异常,不要求在程序处理这些异常。所以如果愿意,我们可以编写代码处理(使用try…catch…finally)这样的异常,也可以不处理。对于这些异常,我们应该修正代码,而不是去通过异常处理器处理 。这样的异常发生的原因多半是代码写的有问题。如除0错误ArithmeticException,错误的强制类型转换错误ClassCastException,数组索引越界ArrayIndexOutOfBoundsException,使用了空对象NullPointerException等等。

    检查异常(checked exception):除了Error 和 RuntimeException的其它异常。javac强制要求程序员为这样的异常做预备处理工作(使用try…catch…finally或者throws)。在方法中要么用try-catch语句捕获它并处理,要么用throws子句声明抛出它,否则编译不会通过。这样的异常一般是由程序的运行环境导致的。因为程序可能被运行在各种未知的环境下,而程序员无法干预用户如何使用他编写的程序,于是程序员就应该为这样的异常时刻准备着。如SQLException , IOException,ClassNotFoundException 等。

    更直白的说法:

    What:什么是检查异常(checked exception)?

      就是编译器要求你必须处置的异常。不知道你编程的时候有没有遇到过,你写的某段代码,编译器要求你必须要对这段代码try...catch,或者throws exception,如果你遇见过,没错,这就是检查异常,也就是说,你代码还没运行呢,编译器就会检查你的代码,会不会出现异常,要求你对可能出现的异常必须做出相应的处理。

    What:什么是非检查异常(unchecked exceptions)?

      编译器不要求强制处置的异常,虽然你有可能出现错误,但是我不会在编译的时候检查,没必要,也不可能。

    Why:为什么有非检查异常?
      你想想非检查异常都有哪些?NullPointerException,IndexOutOfBoundsException,VirtualMachineError等,这些异常你编译的时候检查吗?再说了,明明可以运行时检查,都在编译的时候检查,你写的代码还能看吗?而且有些异常只能在运行时才能检查出来,比如空指针,堆溢出等。

      Exception异常进行划分,它可分为运行时异常和非运行时异常。

    What:什么是运行时异常?

      都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是非检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。

      运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。

      当出现RuntimeException的时候,我们可以不处理。当出现这样的异常时,总是由虚拟机接管。比如:我们从来没有人去处理过NullPointerException异常,它就是运行时异常,并且这种异常还是最常见的异常之一。 
      出现运行时异常后,如果没有捕获处理这个异常(即没有catch),系统会把异常一直往上层抛,一直到最上层,如果是多线程就由Thread.run()抛出,如果是单线程就被main()抛出。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么这整个程序也就退出了。运行时异常是Exception的子类,也有一般异常的特点,是可以被catch块处理的。只不过往往我们不对他处理罢了。也就是说,你如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。 
      如果不想终止,则必须捕获所有的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而影响下面对正常数据的处理。

    What:什么是非运行时异常?

      是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch并处理,否则程序就不能编译通过。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常。

    抛出异常有三种形式,一是throw,一个throws,还有一种系统自动抛异常。下面它们之间的异同。

    一、系统自动抛异常

    当程序语句出现一些逻辑错误、主义错误或类型转换错误时,系统会自动抛出异常:

    public static void main(String[] args) { 
        int a = 5, b =0; 
        System.out.println(5/b); 
        //function(); 
    }
    

     系统会自动抛出ArithmeticException异常

    或者

    public static void main(String[] args) { 
        String s = "abc"; 
        System.out.println(Double.parseDouble(s)); 
        //function(); 
    }
    

      系统会自动抛出NumberFormatException异常。

    二、throw

    throw是语句抛出一个异常,一般是在代码块的内部,当程序出现某种逻辑错误时由程序员主动抛出某种特定类型的异常

    public static void main(String[] args) { 
        String s = "abc"; 
        if(s.equals("abc")) { 
          throw new NumberFormatException(); 
        } else { 
          System.out.println(s); 
        } 
        //function(); 
    } 

    运行时,系统会抛出异常:Exception in thread "main" java.lang.NumberFormatException at......

    三、throws

    throws是方法可能抛出异常的声明。(用在声明方法时,表示该方法可能要抛出异常)

    public void function() throws Exception{......}
    

      当某个方法可能会抛出某种异常时用于throws 声明可能抛出的异常,然后交给上层调用它的方法程序处理

    public class testThrows {
     
        public static void function() throws NumberFormatException {
            String s = "abc";
            System.out.println(Double.parseDouble(s));
        }
     
        public static void main(String[] args) {
            try {
                function();
            } catch (NumberFormatException e) {
                System.err.println("非数据类型不能强制类型转换。");
                //e.printStackTrace(); 
            }
        }
    }
     

    运行结果:非数据类型不能强制类型转换。

    四、throw与throws的比较
      1: throws出现在方法函数头;而throw出现在函数体。
      2: throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常对象。
      3: 两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。


    五、编程习惯
      1: 在写程序时,对可能会出现异常的部分通常要用try{...}catch{...}去捕捉它并对它进行处理;
      2: 用try{...}catch{...}捕捉了异常之后一定要对在catch{...}中对其进行处理,那怕是最简单的一句输出语句,或栈输入e.printStackTrace();
      3: 如果是捕捉IO输入输出流中的异常,一定要在try{...}catch{...}后加finally{...}把输入输出流关闭;
      4: 如果在函数体内用throw抛出了某种异常,最好要在函数名中加throws抛异常声明,然后交给调用它的上层函数进行处理。

  • 相关阅读:
    【465】词干提取与词形还原
    【464】文本转字符向量bag of words
    【462】淘宝个人简介
    Docker 图形化页面管理工具使用
    Docker 简介与shell操作使用
    Spring Boot 入门案例与配置说明
    项目管理工具Maven的安装与使用
    Git(五)IDEA应用Git
    Git(四)Git的分支管理
    Git(三)Git的远程仓库
  • 原文地址:https://www.cnblogs.com/myseries/p/10146867.html
Copyright © 2011-2022 走看看