JAVA的异常处理机制

Java异常处理与内存泄漏

Throwable是所有类的超类

Error类是指java运行时系统的内部错误和资源耗尽错误。应用程序不会抛出该类对象。如果出现了这样的错误,除了告知用户,剩下的就是尽力使程序安全的终止

Exception又有两个分支,一个是运行时异常RuntimeException(不需要声明抛出),如:NullPointerException、ClassCastException;一个是检查异常CheckedException(需要声明抛出什么异常),如I/O错误导致的IOException、SQLException。

异常处理方式:

throws 是抛出去方法之外,表示出现异常的一种可能性,并不一定会发生之类异常;throw是(throw new NumberFormatException();)是主动抛出一个异常;

针对性处理方式:捕获异常

Try{
//有可能发生异常的代码
}
 Catch(异常类 变量)
{
// 处理异常的代码,捕获
}
finally{
//一定会被执行的代码
}
/**
 * 自定义异常类
* @author zhongyq
* @version 1.0.0, 2015-5-27
*/
public class ZdnstException extends BaseRuntimeException{
   private static final long serialVersionUID = -8211729708677743232L;
   public ZdnstException(String code) {
      super();
      this.setCode(code);
   }

   public ZdnstException(Throwable cause) {
      super(cause);
      if (cause instanceof ZdnstException) {
         this.setCode(((ZdnstException) cause).getCode());
      }
   }

   public ZdnstException(String code, Throwable cause) {     
      super(code,cause);
   }

   public ZdnstException(String code, String message) {
      super(code, message);
   }

   public ZdnstException(String code, String message, Throwable cause) {
      super(code, message, cause);
   }
}
/**
 * 
 * <p>描        述:非检查性异常(运行时异常)基类</p>
 */
public class BaseRuntimeException extends RuntimeException {
   private static final long serialVersionUID = 3666558969950546685L;

   /**
    * 错误代码
    */
   private String code = null;

   public BaseRuntimeException() {
        super();
    }
   
   public BaseRuntimeException(String message) {
      super(message);
   }

   public BaseRuntimeException(Throwable cause) {
      super(cause);
   }
   
   public BaseRuntimeException(String code, Throwable cause) {
      super(cause);
      this.code = code;
   }

   public BaseRuntimeException(String code, String message) {
      this(message);
      this.code = code;
   }
   
   public BaseRuntimeException(String code, String message, Throwable cause) {
      super(message,cause);
      this.code = code;
   }

   public String getCode() {
      return code;
   }

   public void setCode(String code) {
      this.code = code;
   }

   @Override
   public String toString() {
      return "[code=" + code + "," + super.toString() + "]";
   }

}

你在代码中,都是怎样对待异常情况的?

答:三类情况:一类是服务器崩溃等情况,是最严重的异常了,没有什么可以挽救的余地,返回给用户“服务器维护中,暂时无法使用”;一类是数据库操作失败等情况,比如JDBC连接数据库失败、Hibernate正常删除数据失败等,是属于意外情况,严重程度稍微低一些,返回给用户“刚才由于网路不畅,导致操作失败,请重新操作”,同时,需要回滚的及时回滚;再一类在实现有所准备的、业务操作异常的情况,比如登录密码错误、新用户注册重名现象等等,这些异常都是在意料之中、有所准备的。此时可以返回相关的提示,严重程度相对比较的低。

1.10 如何写出会发生内存泄露的Java代码

通过以下步骤可以很容易产生内存泄露:

  1. 应用程序创建一个长时间运行的线程(或者使用线程池,会更快地发生内存泄露)。

  2. 线程通过某个类加载器(可以自定义)加载一个类。

  3. 该类分配了大块内存(比如new byte[1000000]),在某个静态变量存储一个强引用,然后在ThreadLocal中存储它自身的引用。分配额外的内存new byte[1000000]是可选的(类实例泄露已经足够了),但是这样会使内存泄露更快。

  4. 线程清理自定义的类或者加载该类的类加载器。

  5. 重复以上步骤。

由于没有了对类和类加载器的引用,ThreadLocal中的存储就不能被访问到。ThreadLocal持有该对象的引用,它也就持有了这个类及其类加载器的引用,类加载器持有它所加载的类的所有引用,这样GC无法回收ThreadLocal中存储的内存。在很多JVM的实现中Java类和类加载器直接分配到permgen区域不执行GC,这样导致了更严重的内存泄露。

方法二:实现一个下载功能,而不关闭流;不定下载就会导致内存泄漏;

转载于:https://my.oschina.net/u/2322635/blog/1922320

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值