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,这样导致了更严重的内存泄露。
方法二:实现一个下载功能,而不关闭流;不定下载就会导致内存泄漏;