Java异常泄露敏感信息_JAVA的异常处理机制

aee11da8fe91f27d10ed657db24ee861.png

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);

}

}

/**

*

*

描 述:非检查性异常(运行时异常)基类

*/

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代码

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

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

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

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

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

重复以上步骤。

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值