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代码
通过以下步骤可以很容易产生内存泄露:
-
应用程序创建一个长时间运行的线程(或者使用线程池,会更快地发生内存泄露)。
-
线程通过某个类加载器(可以自定义)加载一个类。
-
该类分配了大块内存(比如
new byte[1000000]
),在某个静态变量存储一个强引用,然后在ThreadLocal中存储它自身的引用。分配额外的内存new byte[1000000]
是可选的(类实例泄露已经足够了),但是这样会使内存泄露更快。 -
线程清理自定义的类或者加载该类的类加载器。
-
重复以上步骤。
由于没有了对类和类加载器的引用,ThreadLocal中的存储就不能被访问到。ThreadLocal持有该对象的引用,它也就持有了这个类及其类加载器的引用,类加载器持有它所加载的类的所有引用,这样GC无法回收ThreadLocal中存储的内存。在很多JVM的实现中Java类和类加载器直接分配到permgen区域不执行GC,这样导致了更严重的内存泄露。
方法二:实现一个下载功能,而不关闭流;不定下载就会导致内存泄漏;