深入浅出详细介绍Java异常

概述
 
正如“人无完人”一样,程序也不是完美的,它总会存在这样那样的问题,而有些问题并不是能够通过程序员开发更好的代码来解决的,如果我们忽视它,可能就会造成程序的终止,甚至是系统的崩溃。因此,我们需要想办法来合理的解决它,这就是Java中异常的由来。
 
异常是指程序在执行过程中,出现的非正常情况。比如:空的引用、数组下标越界、内存溢出错误、读取文件不存在、网络断开等
 
一般来说有两种方法来处理异常:
 
遇到错误就终止程序运行;
 
开发人员在编写程序的时候考虑到可能出现的非正常情况,提前做好处理(这个是最好的,不过也是不容易的);
 
那究竟异常有哪些?常见的处理方法是什么?我想通过下面的文章,你一定可以得到想要的答案!
 
基本介绍
 
在Java这样一个面向对象的语言中,异常被当成了一个对象来处理。其根类是java.lang.Throwable类,Throwable类有分成了两个类,即Error和Exception。这是异常的两个大类,他们分别代表了两种情况:
 
Error:不能处理的错误,这是系统内部的错误,运行时报错,属于系统问题。一般发生这种异常,JVM会选择终止程序,开发人员需要提前避免。
 
Exception:可以处理的异常,这是比较常见的异常,开发人员可以根据Java提供的类和问题对这类异常进行处理。
 
Error和Execption包括很多种情况,这才是我们需要考虑的,下面对它们进行分别介绍。
 
Error
 
对于严重错误Error,没有办法处理,只能做到提前避免。常见的Error有:StackOverflowError(内栈溢出错误)和OutOfMemoryError (内存溢出错误)。
 
代码示例
 
OutOfMemoryError
 
Java中堆是用来存储对象实例的,因此如果我们不断地创建对象, 并且对象没有被垃圾回收, 那么当创建的对象过多时, 会导致 heap 内存不足, 进而引发 OutOfMemoryError 异常。
 
/**
 
* 内存溢出
 
*/
 
public class Heap{
 
    public static void main(String[] args){
 
//创建数组list,用来保存对象
 
        List<Integer> list = new ArryList<>();
 
        int i=0;
 
        while(true){
 
       
//不断创建对象
 
            list.add(i++);
 
        }
 
    }
 
}
 
StackOverflowError
 
JVM 的运行时数据区中有一个叫做栈的内存区域, 此区域的作用是: 每个方法在执行时都会创建一个栈帧, 用于存储局部变量表、操作数栈、方法出口等信息。因此当创建一个无限递归的递归调用, 当递归深度过大时, 就会耗尽栈空间, 进而导致了 StackOverflowError 异常。
 
/**
 
* 栈溢出
 
*/
 
public class Stack{
 
    public static void main(String[] args){
 
   
//调用方法
 
        new Stack()。test();
 
    }
 
//创建测试方法
 
    public void test() {
 
    //自己调用自己(递归调用)
 
        test();
 
    }
 
}
 
Exception
 
一般来说,我们所说的异常就是指Exception,因为这类异常一旦出现,我们就要对代码进行更正,修复程序进行处理。根据在编译时期还是运行时期去检查异常,可以将Exception分为:
 
编译时期异常:checked异常。在编译时期,就会检查,如果没有处理异常,则编译失败(开发工具会提示),如文件找不到异常等。
 
运行时期异常:runtime异常。在运行时期,检查异常。在编译时期,运行异常不会被编译器检测到(不开发工具不会提示),如空指针异常,类型转换异常,数字操作异常,类型不匹配异常等。

如需转载,请注明文章出处和来源网址:http://www.divcss5.com/html/h64775.shtml

张贴在3