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

    一、异常概述:

        程序在运行过程中,并不一定会按照程序开发人员预想的步骤来执行,因为实际情况千变万化,可能会出现各种各样不可预测的情况,例如用户输入了错误的数据、程序要打开的文件并不存在、程序需要访问网络中的某个资源时网络却不通畅等。这些情况出现时,如果没有处理好,就会导致程序出错或崩溃。因此,这些可预见的情况必须得到正确的处理,也就是要使用异常处理机制,以保证程序的稳定性和健壮性。

    二、异常类的层次结构

    在程序的执行过程中,可能会出现各种各样的异常情况,java语言用不同的异常类对象来表示它们,如下图是java语言中提供的异常类层次结构。

    为了方便对Java程序中出现的异常情况的管理,Java SE API专门设计了java.lang.Throwable类,只有该类的子对象才可以在系统的异常传播体系中进行传递,该类有两个重要的子类,分别是:Error类和Exception类。

    三、异常处理的情况

    1.数学运算异常( java.lang.arithmeticexception)

    程序中出现了除以零这样的运算就会出这样的异常,对这种异常,大家就要好好检查一下自己程序中涉及到数学运算的地方,公式是不是有不妥了。

    2.数组下标越界(java.lang.arrayindexoutofboundsexception

    程序中大多都有对数组的操作,因此在调用数组的时候一定要认真检查,看自己调用的下标是不是超出了数组的范围,一般来说,显示(即直接用常数当下标)调用不太容易出这样的错,但隐式(即用变量表示下标)调用就经常出错了,还有一种情况,是程序中定义的数组的长度是通过某些特定方法决定的,不是事先声明的,这个时候,最好先查看一下数组的length,以免出现这个异常。

    3.内存溢出异常(java.lang.OutOfMemoryError

    内存溢出分为Java堆溢出 、虚拟机栈和本地方法栈溢出 、方法区和运行常量池溢出、本机直接内存溢出

    1.Java堆溢出 heap space: 
    Java堆溢出是因为Java堆容量不足导致的,可以通过设置虚拟机参数-Xms和-Xmx分别设定Java堆的最小容量和最大容量。

    public class RuntimeConstantPoolOOM { 
    public static void main(String[] args) { 
    List list = new ArrayList (); 
    int i=0; 
    while(true){ 
    list.add(String.valueOf(i++).intern()); 
    //会产生java.lang.OutOfMemoryError:PermGen space 


    2.永久代容量不足 PermGen space: 
    永久代是记录常量,静态变量,类信息等,常见使用String.intern()方法导致常量过多;还有一种情况是使用CGlib动态创建类的代理过多,也会导致类信息膨胀;还有一种是Java Web中,Jsp文件过多导致,因为JSP其实也是一个Java类,可通过设置虚拟机参数-XX:PermSize和-XX:MaxPermSize分别设定永久代的最小容量和最大容量。 
    3,本级直接内存溢出DirectMemory: 
    通常是操作系统内存不足的情况下,Java应用程序还向操作系统申请本地内存导致,可通过设置-XX:MaxDirectMemorySize设定Java虚拟机可申请本地内存的最大容量。 
    4,创建线程过多(unable to create new native thread):由于每个线程都会分配一定的栈空间,申请线程过多,会导致栈空间不足,从而导致栈溢出,但Java虚拟机抛出异常信息的是 “java.lang.OutOfMemoryError:unable to create new native thread”这个异常在Windows系统上可能运行很久都不会抛出,而是会导致系统假死

    4.程序遇上空指针(java.lang.nullpointerexception

    调用了未经初始化的对象或者是不存在的对象,这个错误经常出现在创建图片,调用数组这些操作中,比如图片未经初始化,或者图片创建时的路径错误等等。对数组操作中出现空指针,很多情况下是一些刚开始学习编程的朋友常犯的错误,即把数组的初始化和数组元素的初始化混淆起来了。数组的初始化是对数组分配需要的空间,而初始化后的数组,其中的元素并没有实例化,依然是空的,所以还需要对每个要进行调用的元素都进行初始化

    5.指定的类不存在(java.lang.classnotfoundexception

    这个异常是很多原本在jb等开发环境中开发的程序员,把jb下的程序包放在wtk下编译经常出现的问题,这里主要考虑一下类的名称和路径是否正确即可,如果是在jb下做的程序包,一般都是默认加上package的,所以转到wtk下后要注意把package的路径加上

    6.方法参数错误(java.lang.illegalaccessexception

    很多j2me的类库中的方法在一些情况下都会引发这样的错误,比如音量调节方法中的音量参数如果写成负数就会出现这个异常,再比如g.setcolor(int red,int green,int blue)这个方法中的三个值,如果有超过255的也会出现这个异常,因此一旦发现这个异常,我们要做的,就是赶紧去检查一下方法调用中的参数传递是不是出现了错误。

    7.没有访问权限(java.lang.illegalaccessexception

    当应用程序要调用一个类,但当前的方法即没有对该类的访问权限便会出现这个异常。对程序中用了package的情况下要注意这个异常。

    8.错误(java.lang.Error

    错误,是所有错误的基类,用于标识严重的程序运行问题,这些问题通常描述一些不应该被应用程序捕获的反常情况。

    原因:对系统所访问外部资源,未执行关闭操作,导致外部资源大量浪费,最终可能导致系统无法正常运行;对系统所访问的外部资源关闭次数太多,外部系统无法正常处理;系统访问的外部资源出现异常情况。

    解决方法:访问外部资源之前,首先检查该资源(如数据库)是否可正常连接或操作;访问外部资源时,如果进行了连接,一定要关闭操作,并且仅进行一次关闭操作;尽量在同一操作中共享外部资源,以减少该操作对资源的浪费,提高程序的执行效率。

    例如初始化程序错误、违法访问错误、不兼容的类变化错误、实例化错误、内部错误、链接错误、未找到类定义错误、域不存在错误、方法不存在错误等等。

  • 相关阅读:
    TCP源码—连接建立
    TCP系列02—连接管理—1、三次握手与四次挥手
    TCP系列01—概述及协议头格式
    ubuntu软件管理apt与dpkg
    318. Maximum Product of Word Lengths
    317. Shortest Distance from All Buildings
    316. Remove Duplicate Letters
    315. Count of Smaller Numbers After Self
    314. Binary Tree Vertical Order Traversal
    313. Super Ugly Number
  • 原文地址:https://www.cnblogs.com/qianmo123/p/9941386.html
Copyright © 2011-2022 走看看