您的位置:首页 > 编程语言 > Java开发

java系统学习(十二) --------异常与处理及内存管理

2015-09-24 18:13 561 查看

异常的概念

在程序段中,经常会出现“try{}catch(Exception e){}”这样的语句,这就是异常处理。

异常的分类

   所谓的异常就是可以预见的错误。Java中所有的异常都从“Throwable'类中继承,不过在一般情况下,都会由“Exception"类派生出来。异常分为两个部分:一部分是错误:另一

部分是异常。对于错误来说,只能终止程序。

   对于异常,又可以分为运行期异常和非运行期异常。一个运行期异常是由程序员自身的错误造成的。例如,一个越界的数组访问、一个空指针的访问等。而这此异常被称为未检查异常,

    它们都不应该产生。除此之外,其他的都属于检查异常。

    本章主要讲述一些检查异常,因为这些异常编译器不能处理,只能通过抛出一个检查异常给异常处理器来处理,这样就可以顺利通过程序的编译。

    检查异常可以分为很多种,主要分类如下:

    ArithmeticException(算术异常)

    Nu1lPointerException(无空间对象异常)

    ArrayIndexOutofBoundsException(数组越界异常)

    NegativeArraySizeException(数组长度为负值异常)

    ArrayStoreException(数组存储异常)

    IllegalArgumentException(非法参数异常)

    SecurityException(安全性异常)

因为它们的父类都是"Exception"类.所以可以使用"Exception"来代替所有的异常。

异常的声明

方法名 throws Exception

{方法体}

public static void main(String[] args) throws Exception//主方法抛出异常

异常的抛出

所谓异常的抛出,就是将异常抛给异常处理器,暂时不去处理它。那么如何处理它昵?这就要依靠异常的捕获。

方法名throws Exception

{方法体throw Exception

  方法体

}

异常的捕获

try

{可能会出现异常的程序段}

catch(Exception e)

{捕获异常后.如何处理它}

捕获多个异常

try
{ }
catch(1)
{ };
catch(2)
{ };
catch(3)
{ };
finally
{ };

自定义异常

public class One{
//抛出异常对象ServerTimedOutException
public static void maia(Striag[]args) throws ServerTimedOutException{
try{
//抛出异常对象
throw new ServerTimedOutExceptian("Could not connect",80);
}catch(ServerTimedOutException e){//处理异常
System.out.println(”异常信息是:‘’+e.toString());
}
}
}
class ServerTimedoutExceptioa extends Exception{
//创建成员变量
private String reasoa;
private int port;
//创建构造函数
public ServerTimedOutEzception(Striag reason, iat port){
this .reason=reason;
this.port=port;
}
public String getReason()//关于变量reason的设置器
return reason;
}
public int getPort(){//关于变量port的设置器
return port;
}

}

内存的管理和回收

     使用Java语言无需担心如间销毁对象。换句话说就是Java运行时,无需负责Java对象的内存管理。在Java程序中,当不再使用某个对象时,它会自动进行垃圾回收。

    垃圾回收是一个比较复杂的过程,当程序运行时会自动检查整个内存,检查内存中哪此对象引用不再被使用。一旦检查出来后,便会安全删除这些对象同时回收这此对象所占用的系统资源。垃圾回收机制可能会影响应用程序代码的运行,即如果在执行应用程序代码的过程中,执行垃圾回收,则应用程序代码的执行时间可能延长,这会导致程序运行的延迟。由于不知道何时会进行垃圾回收,因此延迟的时间也是不可预知的。

    实时应用程序对时间的要求非常严格,即它们必须在确定的、已知的延迟条州下,执行应用程序代码,因此垃圾回收机制所引起的不可预知的延迟,就成为一个实时程序致命的问题。垃圾回收的主要问题是程序无法估计时间延迟导致程序执行的延迟。能否避免这种问题的发生呢?可以通过代码来强制垃圾回收,就可以限制最大延迟时间,使垃圾回收成为可预知的。

下面是一些Java程序设计中有关内存管理的经验:

最基本的建议就是尽旱释放无用对象的引用。大多数程序员在使用临时变量的时候,都是让引用变量在退出活动域后,自动设置为null。在使用这种方式时,必须特别注意

一些复杂的对象。例如,数组、队列、树、图等,这些对象之间的相互引用关系较为复杂。对于这类对象,GC(垃圾回收)回收它的效率一般较低,如果程序允许,尽早

将不用的引用对象赋值为null,这样可以加速GC的工作.

 但要注意,如果“a”是方法的返回值,下方不要做这样的处理,否则从该方法中得到的

返回值永远为空、而且这种错误不易被发现,这时很难及时排除"NullPointerException"异常。

尽量少用“finalize"函数,"finalize"函数是Java给程J字员提供的一个释放对象或资源  的机会,但是,它会加大GC的I:作量因此尽量少采用“finalize’方式回收资源

注意集合数据类型,包括数组、树、图、链表等数据结构,这些数据结构对cc来说,回收更为复杂。另外,注意全局的变量以及静态变量,这此变量往往容易引起悬挂对象,造成内存浪费。

尽量避免在类的默认构造器中创建、初始化大量的对象防止在调用自己类的构造器时,造成不必要的内存资源浪费。

尽量避免强制系统做垃圾内存的回收(通过显式调用方法"System.lc( )") ,增长系统做垃圾回收的最终时间,降低系统性能。

尽量避免显式申请数组空间,当不得不显式地申请数组空间时,尽量准确地估计其合理值,以免造成不必要的系统内存开销。

尽量在合适的场景下,使用对象池技术以提高系统性能,缩减系统内存开销。但是要  注意对象池的尺寸不易过大,及时清除无效对象释放内存资源。综合考虑应用运行环境的内存资源限制,避免过高估计运行环境所提供内存资源的数量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: