异常分类与异常的产生过程解析
异常分类
我们平常说的异常就是指Exception,因为这类异常一旦出现,我们就要对代码进行更正,修复程序。
异常(Exception)的分类:根据在编译时期还是运行时期去检查异常?
编译时期异常:checked异常。在编译时期,就会检查,如果没有处理异常,则编译失败。(如日期格式化异常)运行时期异常;:runtime异常。
运行时期异常.在编译时期,运行异常不会编译器检测(不报错)。(如数学异常)
package Demo_Exception; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; /* java.Lang .Throwable:类是Java语言中所有错误或异常的超类。 Exception:编译期异常,进行编译(写代码)java程序出现的问题 RuntimeException:运行期异常,java程序运行过程中出现的问题 异常就相当于程序得了一个小毛病(感冒,发烧),把异常处理掉,程序可以继续执行(吃点药,组续革命工作) Error:错误 错误就相当于程序得了一个无法治愈的毛病(非典,艾滋).必须修改源代码,程序才能继续执行 */ public class Demo01_Exception { public static void main(String[] args) /*throws ParseException*/ { //Exception :编译期异常,进行编译(与代码)java程序出现的问题 // SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");//用来格式化 // Date parse = null;//把字符串格式的日期,解析为Date格式日期 // try { // parse = format.parse("1999-0909"); // } catch (ParseException e) { // e.printStackTrace(); // } // System.out.println(parse); // //RuntimeException:运行期异常,java程序运行过程中出现的问题 // int[] arr = {1,2,3}; // //System.out.println(arr[0]); // try { // //可能会出现异常的代码 // System.out.println(arr[3]); // }catch (Exception e){ //// //异常的处理逻辑 // /* // Error:错误 // OutofemoryError: Java heap space // 内存溢出的错误,创建的数组太大了,超出了给VIM分配的内存 // */ // System.out.println(e); // int[] arr = new int[1024*1024*1024]; //必须修改代码,创建的数组小一点 int[] arr = new int[1024*1024]; System.out.println("后续代码"); } }
3、编译时异常和运行时异常,都是发生在运行阶段。编译阶段异常是不会发生的。
编译时异常因为什么而得名?因为编译时异常必须在编译前先处理,如果不处理编译器报错,因此得名。
4、所有异常都是在运行阶段发生的。因为只有程序运行阶段才可以new对象。因为异常的发生就是new异常对象。
编译时异常和运行时异常的区别是什么?
答:编译时异常一般发生的概率比较高。对于一些发生概率高的异常,需要在编译时预先对其处理。
运行时异常一般发生的概率很低。你可以预先处理,也可以不处理。
假设java中没有对异常进行划分,没有分编译时异常和运行时异常,所有的异常都需要在编写阶段对其预处理,将是怎样的效果?
首先,如果这样做的话,程序肯定是绝对的安全。
但是程序员就太累,到处都是处理异常的代码,显得很乱。
5、java中对异常的处理方式包括两种方式:
第一种:在方法声明的位置上,使用throws关键字,抛给上一级。谁掉用我我就抛给谁。
第二种:使用try…catch语句进行异常的捕捉。
异常发生之后,如果选择了上抛,抛给了调用者,调用者需要对这个异常继续处理,同样调用者处理这个异常也有两种方式。
注意:java中异常发生之后如果一直上抛,最终抛给了main方法,main方法继续上抛,抛给了调用者JVM,JVM知道这个异常发生,只有一个结果,终止程序执行。
异常的产生过程解析
先运行下面的程序,程序会产生一个数组索引越界异常ArrayIndexOfBoundsException。我们通过图解来解析下异常产生的过程。