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( )") ,增长系统做垃圾回收的最终时间,降低系统性能。
尽量避免显式申请数组空间,当不得不显式地申请数组空间时,尽量准确地估计其合理值,以免造成不必要的系统内存开销。
尽量在合适的场景下,使用对象池技术以提高系统性能,缩减系统内存开销。但是要 注意对象池的尺寸不易过大,及时清除无效对象释放内存资源。综合考虑应用运行环境的内存资源限制,避免过高估计运行环境所提供内存资源的数量。
相关文章推荐
- java系统学习(十二) --------异常与处理及内存管理
- 深入了解Java虚拟机
- javassist用法
- java多线程之初级探索线程池,线程队列
- Java(2)--单例模式
- Java之旅Spring框架学习(1)——掀起你的盖头来
- JAVA中常用的正则的一些案例分析
- Java的四种引用,强弱软虚,用到的场景
- [Spring]Spring AOP学习笔记(4)--Spring 事务
- JAVA中注解的简单使用
- Java中的反射机制 一个利用反射进行对象拷贝的例子
- 第一章 Java Web工作原理
- java get,post 请求
- java中的split函数用法
- jd -eclipse 放到eclipse 中进行自动反编译
- java线性查找、二分查找(2015年9月23日)
- SSH整合 简单的增删改查
- 第12章 Java内存模型与线程
- Ubuntu14.04安装JDK与配置环境变量
- 数字可以为正数或负数(可以含有小数点) java