- 浏览: 235561 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
清林小篆:
引用[/col[size=xx-small][/size]or ...
tomcat ssl配置以及CAS单点登录探究 -
cyxy99:
u012534143 写道我用同样的方法,同样的节点关系,为什 ...
PageRank算法java实现版本 -
cyxy99:
schaha123 写道楼主还有一个问题想请教一下,下面这2段 ...
PageRank算法java实现版本 -
njthnet:
Participle 和 IkParticiple 这2个类找 ...
贝叶斯文本分类 java实现 -
u012534143:
我用同样的方法,同样的节点关系,为什么的得到的结果与您不一样呢 ...
PageRank算法java实现版本
异常是面向对象语言非常重要的一个特性,良好的异常设计对程序的可扩展性、可维护性、健壮性都起到至关重要。
JAVA根据用处的不同,定义两类异常
* Checked Exception: Exception的子类,方法签名上需要显示的声明throws,编译器迫使调用者处理这类异常或者声明throws继续往上抛。
* Unchecked Exception: RuntimeException的子类,方法签名不需要声明throws,编译器也不会强制调用者处理该类异常。
异常的作用和好处:
1. 分离错误代码和正常代码,代码更简洁。
2. 保护数据的正确性和完整性,程序更严谨。
3. 便于调试和排错,软件更好维护。
……
相信很多JAVA开发人员都看到或听到过“不要使用异常来控制流程”,虽然这句话非常易于记忆,但是它并未给出“流程”的定义,所以很难理解作者的本意,让人迷惑不解。
如果“流程”是包括程序的每一步执行,那异常就是用来控制流程的,它就是用来区分程序的正常流程和错误流程,为了更能明确的表达意思,上面这句话应改成“不要用异常来控制程序的正常流程”。现在带来一个新的问题:如何区分程序正常流程和异常流程?我实在想不出一个评判标准,就举例来说明,大家思维扩散下。
为了后面更方便的表达,我把异常分成两类,不妥之处请谅解
* 系统异常:软件的缺陷,客户端对此类异常是无能为力的,通常都是Unchecked Exception。
* 业务异常:用户未按正常流程操作导致的异常,都是Checked Exception
一个金币转账的例子:需求规定金币一次的转账范围是1~500,如果超过这个额度,就要提示用户金额超出单笔转账的限制。
现在有以下几种场景:
1. 转账的金额是由用户在页面随意输入的:
因为值是用户随意输入的,所以给的值超出限定的范围肯定是司空见惯。我们当然不能把它(输入的值超出限定的范围)归结于异常流程,它应该属于正常流程。
正确的实现如下:
提供一个判断转账金币数量是否超出限定范围的方法
Java代码
Action里先对值进行判断,若不合法,直接返回并提示用户
2. 转账的额度是页面单选框(100、200、300、400、500)选择的:
转账的额度用户不能轻易的更改,但是不排除有些无聊的人会借助其他工具(如,firebug)来修改。此类事件还是占少数的,我们就可以把它归结为非软件bug的异常事件—业务异常(Checked Exception)。
正确的实现如下
CoinExceedTransferLimitExcetion.java
Java代码
//金币超出限定范围的异常类
//转账方法
Java代码
3. 接口transferCoin(int coin)的规范里已经定了契约,调用transferCoin之前必须要先调用isCoinExceedTransferLimits判断值是否合法:
虽然规范人人都要遵循,但毕竟只是规范,编译器无法强制约束。此时就需要用系统异常(Unchecked Exception)来保证程序的正确性,没遵守规范的就当做软件bug处理。
正确的实现如下:
Java代码
至此,举例已经结束了,在这里再延伸下—业务异常和系统异常类在实现上的区别,该区别的根源来自于调用者捕获到异常后是如何处理的
Action对业务异常的处理:操作具体的异常类
Java代码
调用者捕获业务异常(Checked Excetion)之后,通常不会去调用getMessage()方法的,而是调用异常类里特有的方法,所以业务异常类的实现要注重特有的,跟业务相关的方法,而不是getMessage()方法。
系统异常类恰恰相反,捕获者只会调用getMessage()获取异常信息,然后记录错误日志,所以系统异常类(Uncheck Exception)的实现类对getMessage()方法返回内容比较讲究。
不管是业务异常还是系统异常,都需要提供丰富的信息。如:数据库访问异常,需要提供查询sql语句等;HTTP接口调用异常,需要给出访问的URL和参数列表(如果是post请求,参数列表不提供也可以,取决于维护人员或者开发人员拿到参数列表会如何去使用)。
1. Sql语法错误异常类(取自spring框架的异常类,Spring的异常体系很强大,值得一看):
Java代码
2. HTTP接口调用异常类
Java代码
如何选择用Unchecked Exception和Checked Exception
1.是软件bug还是业务异常,软件bug是Unchecked Exception,否则是Checked Exception
2.如果把该异常抛给用户,用户能否做出补救。如果客户端无能为力,则用Unchecked Exception,否则抛Checked Exception
结合这两点,两类异常就不会混淆使用了。
异常设计的几个原则:
如果方法遭遇了一个无法处理的意外情况,那么抛出一个异常。
避免使用异常来指出可以视为方法的常用功能的情况。
如果发现客户违反了契约(例如,传入非法输入参数),那么抛出非检查型异常。
如果方法无法履型契约,那么抛出检查型异常,也可以抛出非检查型异常。
如果你认为客户程序员需要有意识地采取措施,那么抛出检查型异常。
异常类应该给客户提供丰富的信息,异常类跟其它类一样,允许定义自己的属性和方法。
异常类名和方法遵循JAVA类名规范和方法名规范
跟JAVA其它类一样,不要定义多余的方法和变量,不会使用的变量,就不要定义。我觉得BadSqlGrammarException.getSql() 就是多余的
以下是我工作当中碰到的一些我认为不是很好的写法,我之前也犯过此类的错误
A. 整个业务层只定义了一个异常类
Java代码
理由:
1.业务异常不应该是Unchecked Exception。
2.不存在一个具体的异常类名称是“ServiceException”。
解决方法:定义一个抽象的业务异常“ServiceException”
Java代码
B. 忽略异常
Java代码
理由:
1.环境不支持UTF-8或者GBK很显然是一个非常严重的bug,不能置之不理
2.堆栈的方式记录错误信息不合理,若产品环境是不记录标准输出,这个错误信息就会丢失掉。若产品环境是记录标准输出,万一这段程序被while循环的线程调用,有可能引起硬盘容量溢出,最终导致程序的运行不正常,甚至数据的丢失。
解决方法:捕获UnsupportedEncodingException,封装成Unchecked Exception,往上抛,中断程序的执行。
Java代码
C. 捕获顶层的异常—Exception
Java代码
理由:
1. Service并不是只能抛出业务异常,Service也可以抛出其他异常
如IllegalArgumentException、ArrayIndexOutOfBoundsException或者spring框架的DataAccessException
2. 多数情况下,Dao不会抛Checked Exception给Service,假如所有代码都非常规范,Service类里不应该出现try{}catch代码。
解决方法:删除try{}catch代码
Java代码
D. 创建没有意义的异常
Java代码
1. 它除了有一个"意义明确"的名字以外没有任何有用的信息了。不要忘记Exception跟其他的Java类一样,客户端可以调用其中的方法来得到更多的信息。
解决方案:定义上捕获者需要用到的信息
Java代码
E. 把展示给用户的信息直接放在异常信息里。
Java代码
理由:展示给用户错误提示信息属于文案范畴,文案易变动,最好不要跟程序混淆一起。
解决方法:
错误提示的文案统一放在一个配置文件里,根据异常类型获取对应的错误提示信息,若需要支持国际化还可以提供多个语言的版本。
F. 方法签名声明了多余的throws
理由:代码不够精简,调用者不得不加上try{}catch代码
解决方案:若方法不可能会抛出该异常,那就删除多余的throws
G. 给每一个异常类都定义一个不会用到ErrorCode
理由:多一个功能就多一个维护成本
解决方法:不要无谓的定义ErrorCode,除非真的需要(如给别人提供接口调用的,这时,最好对异常进行规划和分类。如1xx代表金币相关的异常,2xx代表用户相关的异常…
最后推荐几篇关于异常设计原则
1.异常设计
http://www.cnblogs.com/JavaVillage/articles/384483.html(翻译)
http://www.javaworld.com/jw-07-1998/jw-07-techniques.html(原文)
2. 异常处理最佳实践
http://tech.e800.com.cn/articles/2009/79/1247105040929_1.html(翻译)
http://onjava.com/pub/a/onjava/2003/11/19/exceptions.html(原文)
JAVA根据用处的不同,定义两类异常
* Checked Exception: Exception的子类,方法签名上需要显示的声明throws,编译器迫使调用者处理这类异常或者声明throws继续往上抛。
* Unchecked Exception: RuntimeException的子类,方法签名不需要声明throws,编译器也不会强制调用者处理该类异常。
异常的作用和好处:
1. 分离错误代码和正常代码,代码更简洁。
2. 保护数据的正确性和完整性,程序更严谨。
3. 便于调试和排错,软件更好维护。
……
相信很多JAVA开发人员都看到或听到过“不要使用异常来控制流程”,虽然这句话非常易于记忆,但是它并未给出“流程”的定义,所以很难理解作者的本意,让人迷惑不解。
如果“流程”是包括程序的每一步执行,那异常就是用来控制流程的,它就是用来区分程序的正常流程和错误流程,为了更能明确的表达意思,上面这句话应改成“不要用异常来控制程序的正常流程”。现在带来一个新的问题:如何区分程序正常流程和异常流程?我实在想不出一个评判标准,就举例来说明,大家思维扩散下。
为了后面更方便的表达,我把异常分成两类,不妥之处请谅解
* 系统异常:软件的缺陷,客户端对此类异常是无能为力的,通常都是Unchecked Exception。
* 业务异常:用户未按正常流程操作导致的异常,都是Checked Exception
一个金币转账的例子:需求规定金币一次的转账范围是1~500,如果超过这个额度,就要提示用户金额超出单笔转账的限制。
现在有以下几种场景:
1. 转账的金额是由用户在页面随意输入的:
因为值是用户随意输入的,所以给的值超出限定的范围肯定是司空见惯。我们当然不能把它(输入的值超出限定的范围)归结于异常流程,它应该属于正常流程。
正确的实现如下:
提供一个判断转账金币数量是否超出限定范围的方法
Java代码
private static final int MAX_PRE_TRANSFER_COIN = 500; public boolean isCoinExceedTransferLimits(int coin) { return coin > MAX_PRE_TRANSFER_COIN; } private static final int MAX_PRE_TRANSFER_COIN = 500; public boolean isCoinExceedTransferLimits(int coin) { return coin > MAX_PRE_TRANSFER_COIN; }
Action里先对值进行判断,若不合法,直接返回并提示用户
2. 转账的额度是页面单选框(100、200、300、400、500)选择的:
转账的额度用户不能轻易的更改,但是不排除有些无聊的人会借助其他工具(如,firebug)来修改。此类事件还是占少数的,我们就可以把它归结为非软件bug的异常事件—业务异常(Checked Exception)。
正确的实现如下
CoinExceedTransferLimitExcetion.java
Java代码
//金币超出限定范围的异常类
public class CoinExceedTransferLimitExcetion extends Exception { private static final long serialVersionUID = -7867713004171563795L; private int coin; public CoinExceedTransferLimitExcetion() { } public CoinExceedTransferLimitExcetion(int coin) { this.coin = coin; } public int getCoin() { return coin; } @Override public String getMessage() { return coin + " is exceed transfer limit:500"; } } //金币超出限定范围的异常类 public class CoinExceedTransferLimitExcetion extends Exception { private static final long serialVersionUID = -7867713004171563795L; private int coin; public CoinExceedTransferLimitExcetion() { } public CoinExceedTransferLimitExcetion(int coin) { this.coin = coin; } public int getCoin() { return coin; } @Override public String getMessage() { return coin + " is exceed transfer limit:500"; } }
//转账方法
Java代码
private static final int MAX_PRE_TRANSFER_COIN = 500; public void transferCoin(int coin) throws CoinExceedTransferLimitExcetion { if (coin > MAX_PRE_TRANSFER_COIN) throw new CoinExceedTransferLimitExcetion(coin); // do transfering coin } private static final int MAX_PRE_TRANSFER_COIN = 500; public void transferCoin(int coin) throws CoinExceedTransferLimitExcetion { if (coin > MAX_PRE_TRANSFER_COIN) throw new CoinExceedTransferLimitExcetion(coin); // do transfering coin }
3. 接口transferCoin(int coin)的规范里已经定了契约,调用transferCoin之前必须要先调用isCoinExceedTransferLimits判断值是否合法:
虽然规范人人都要遵循,但毕竟只是规范,编译器无法强制约束。此时就需要用系统异常(Unchecked Exception)来保证程序的正确性,没遵守规范的就当做软件bug处理。
正确的实现如下:
Java代码
public class CoinExceedTransferLimitExcetion extends RuntimeException { private static final long serialVersionUID = -7867713004171563795L; public CoinExceedTransferLimitExcetion() { } public CoinExceedTransferLimitExcetion(int coin) { super(coin + " is exceed transfer limit:500"); } } public class CoinExceedTransferLimitExcetion extends RuntimeException { private static final long serialVersionUID = -7867713004171563795L; public CoinExceedTransferLimitExcetion() { } public CoinExceedTransferLimitExcetion(int coin) { super(coin + " is exceed transfer limit:500"); } } //转账方法 Java代码 public void transferCoin(int coin){ if (coin > MAX_PRE_TRANSFER_COIN) throw new CoinExceedTransferLimitExcetion(coin); // do transfering coin } public void transferCoin(int coin){ if (coin > MAX_PRE_TRANSFER_COIN) throw new CoinExceedTransferLimitExcetion(coin); // do transfering coin }
至此,举例已经结束了,在这里再延伸下—业务异常和系统异常类在实现上的区别,该区别的根源来自于调用者捕获到异常后是如何处理的
Action对业务异常的处理:操作具体的异常类
Java代码
public String execute() { try { userService.transferCoin(coin); } catch (CoinExceedTransferLimitExcetion e) { e.getCoin(); } return SUCCESS; } public String execute() { try { userService.transferCoin(coin); } catch (CoinExceedTransferLimitExcetion e) { e.getCoin(); } return SUCCESS; } Action对系统异常的处理:无法知道具体的异常类 Java代码 public String execute() { try { userService.transferCoin(coin); } catch (RuntimeException e) { LOG.error(e.getMessage()); } return SUCCESS; } public String execute() { try { userService.transferCoin(coin); } catch (RuntimeException e) { LOG.error(e.getMessage()); } return SUCCESS; }
调用者捕获业务异常(Checked Excetion)之后,通常不会去调用getMessage()方法的,而是调用异常类里特有的方法,所以业务异常类的实现要注重特有的,跟业务相关的方法,而不是getMessage()方法。
系统异常类恰恰相反,捕获者只会调用getMessage()获取异常信息,然后记录错误日志,所以系统异常类(Uncheck Exception)的实现类对getMessage()方法返回内容比较讲究。
不管是业务异常还是系统异常,都需要提供丰富的信息。如:数据库访问异常,需要提供查询sql语句等;HTTP接口调用异常,需要给出访问的URL和参数列表(如果是post请求,参数列表不提供也可以,取决于维护人员或者开发人员拿到参数列表会如何去使用)。
1. Sql语法错误异常类(取自spring框架的异常类,Spring的异常体系很强大,值得一看):
Java代码
public class BadSqlGrammarException extends InvalidDataAccessResourceUsageException { private String sql; public BadSqlGrammarException(String task, String sql, SQLException ex) { super(task + "; bad SQL grammar [" + sql + "]", ex); this.sql = sql; } public SQLException getSQLException() { return (SQLException) getCause(); } public String getSql() { return this.sql; } } public class BadSqlGrammarException extends InvalidDataAccessResourceUsageException { private String sql; public BadSqlGrammarException(String task, String sql, SQLException ex) { super(task + "; bad SQL grammar [" + sql + "]", ex); this.sql = sql; } public SQLException getSQLException() { return (SQLException) getCause(); } public String getSql() { return this.sql; } }
2. HTTP接口调用异常类
Java代码
public class HttpInvokeException extends RuntimeException { private static final long serialVersionUID = -6477873547070785173L; public HttpInvokeException(String url, String message) { super("http interface unavailable [" + url + "];" + message); } } public class HttpInvokeException extends RuntimeException { private static final long serialVersionUID = -6477873547070785173L; public HttpInvokeException(String url, String message) { super("http interface unavailable [" + url + "];" + message); } }
如何选择用Unchecked Exception和Checked Exception
1.是软件bug还是业务异常,软件bug是Unchecked Exception,否则是Checked Exception
2.如果把该异常抛给用户,用户能否做出补救。如果客户端无能为力,则用Unchecked Exception,否则抛Checked Exception
结合这两点,两类异常就不会混淆使用了。
异常设计的几个原则:
如果方法遭遇了一个无法处理的意外情况,那么抛出一个异常。
避免使用异常来指出可以视为方法的常用功能的情况。
如果发现客户违反了契约(例如,传入非法输入参数),那么抛出非检查型异常。
如果方法无法履型契约,那么抛出检查型异常,也可以抛出非检查型异常。
如果你认为客户程序员需要有意识地采取措施,那么抛出检查型异常。
异常类应该给客户提供丰富的信息,异常类跟其它类一样,允许定义自己的属性和方法。
异常类名和方法遵循JAVA类名规范和方法名规范
跟JAVA其它类一样,不要定义多余的方法和变量,不会使用的变量,就不要定义。我觉得BadSqlGrammarException.getSql() 就是多余的
以下是我工作当中碰到的一些我认为不是很好的写法,我之前也犯过此类的错误
A. 整个业务层只定义了一个异常类
Java代码
public class ServiceException extends RuntimeException { private static final long serialVersionUID = 8670135969660230761L; public ServiceException(Exception e) { super(e); } public ServiceException(String message) { super(message); } } public class ServiceException extends RuntimeException { private static final long serialVersionUID = 8670135969660230761L; public ServiceException(Exception e) { super(e); } public ServiceException(String message) { super(message); } }
理由:
1.业务异常不应该是Unchecked Exception。
2.不存在一个具体的异常类名称是“ServiceException”。
解决方法:定义一个抽象的业务异常“ServiceException”
Java代码
public abstract class ServiceException extends Exception { private static final long serialVersionUID = -8411541817140551506L; } public abstract class ServiceException extends Exception { private static final long serialVersionUID = -8411541817140551506L; }
B. 忽略异常
Java代码
try { new String(source.getBytes("UTF-8"), "GBK"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } try { new String(source.getBytes("UTF-8"), "GBK"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); }
理由:
1.环境不支持UTF-8或者GBK很显然是一个非常严重的bug,不能置之不理
2.堆栈的方式记录错误信息不合理,若产品环境是不记录标准输出,这个错误信息就会丢失掉。若产品环境是记录标准输出,万一这段程序被while循环的线程调用,有可能引起硬盘容量溢出,最终导致程序的运行不正常,甚至数据的丢失。
解决方法:捕获UnsupportedEncodingException,封装成Unchecked Exception,往上抛,中断程序的执行。
Java代码
try { new String(source.getBytes("UTF-8"), "GBK"); } catch (UnsupportedEncodingException e) { throw new IllegalStateException("the base runtime environment does not support 'UTF-8' or 'GBK'"); } try { new String(source.getBytes("UTF-8"), "GBK"); } catch (UnsupportedEncodingException e) { throw new IllegalStateException("the base runtime environment does not support 'UTF-8' or 'GBK'"); }
C. 捕获顶层的异常—Exception
Java代码
public void transferCoin(int outUid, int inUserUid, int coin) throws CoinNotEnoughException { final User outUser = userDao.getUser(outUid); final User inUser = userDao.getUser(inUserUid); outUser.decreaseCoin(coin); inUser.increaseCoin(coin); try { // BEGIN TRANSACTION userDao.save(outUser); userDao.save(inUser); // END TRANSACTION // log transfer operate } catch (Exception e) { throw new ServiceException(e); } } public void transferCoin(int outUid, int inUserUid, int coin) throws CoinNotEnoughException { final User outUser = userDao.getUser(outUid); final User inUser = userDao.getUser(inUserUid); outUser.decreaseCoin(coin); inUser.increaseCoin(coin); try { // BEGIN TRANSACTION userDao.save(outUser); userDao.save(inUser); // END TRANSACTION // log transfer operate } catch (Exception e) { throw new ServiceException(e); } }
理由:
1. Service并不是只能抛出业务异常,Service也可以抛出其他异常
如IllegalArgumentException、ArrayIndexOutOfBoundsException或者spring框架的DataAccessException
2. 多数情况下,Dao不会抛Checked Exception给Service,假如所有代码都非常规范,Service类里不应该出现try{}catch代码。
解决方法:删除try{}catch代码
Java代码
public void transferCoin(int outUid, int inUserUid, int coin) throws CoinNotEnoughException { final User outUser = userDao.getUser(outUid); final User inUser = userDao.getUser(inUserUid); outUser.decreaseCoin(coin); inUser.increaseCoin(coin); // BEGIN TRANSACTION userDao.save(outUser); userDao.save(inUser); // END TRANSACTION // log transfer operate } public void transferCoin(int outUid, int inUserUid, int coin) throws CoinNotEnoughException { final User outUser = userDao.getUser(outUid); final User inUser = userDao.getUser(inUserUid); outUser.decreaseCoin(coin); inUser.increaseCoin(coin); // BEGIN TRANSACTION userDao.save(outUser); userDao.save(inUser); // END TRANSACTION // log transfer operate }
D. 创建没有意义的异常
Java代码
public class DuplicateUsernameException extends Exception { } public class DuplicateUsernameException extends Exception { }理由
1. 它除了有一个"意义明确"的名字以外没有任何有用的信息了。不要忘记Exception跟其他的Java类一样,客户端可以调用其中的方法来得到更多的信息。
解决方案:定义上捕获者需要用到的信息
Java代码
public class DuplicateUsernameException extends Exception { private static final long serialVersionUID = -6113064394525919823L; private String username = null; private String[] availableNames = new String[0]; public DuplicateUsernameException(String username) { this.username = username; } public DuplicateUsernameException(String username, String[] availableNames) { this(username); this.availableNames = availableNames; } public String requestedUsername() { return this.username; } public String[] availableNames() { return this.availableNames; } } public class DuplicateUsernameException extends Exception { private static final long serialVersionUID = -6113064394525919823L; private String username = null; private String[] availableNames = new String[0]; public DuplicateUsernameException(String username) { this.username = username; } public DuplicateUsernameException(String username, String[] availableNames) { this(username); this.availableNames = availableNames; } public String requestedUsername() { return this.username; } public String[] availableNames() { return this.availableNames; } }
E. 把展示给用户的信息直接放在异常信息里。
Java代码
public class CoinNotEnoughException2 extends Exception { private static final long serialVersionUID = 4724424650547006411L; public CoinNotEnoughException2(String message) { super(message); } } public void decreaseCoin(int forTransferCoin) throws CoinNotEnoughException2 { if (this.coin < forTransferCoin) throw new CoinNotEnoughException2("金币数量不够"); this.coin -= forTransferCoin; } public class CoinNotEnoughException2 extends Exception { private static final long serialVersionUID = 4724424650547006411L; public CoinNotEnoughException2(String message) { super(message); } } public void decreaseCoin(int forTransferCoin) throws CoinNotEnoughException2 { if (this.coin < forTransferCoin) throw new CoinNotEnoughException2("金币数量不够"); this.coin -= forTransferCoin; }
理由:展示给用户错误提示信息属于文案范畴,文案易变动,最好不要跟程序混淆一起。
解决方法:
错误提示的文案统一放在一个配置文件里,根据异常类型获取对应的错误提示信息,若需要支持国际化还可以提供多个语言的版本。
F. 方法签名声明了多余的throws
理由:代码不够精简,调用者不得不加上try{}catch代码
解决方案:若方法不可能会抛出该异常,那就删除多余的throws
G. 给每一个异常类都定义一个不会用到ErrorCode
理由:多一个功能就多一个维护成本
解决方法:不要无谓的定义ErrorCode,除非真的需要(如给别人提供接口调用的,这时,最好对异常进行规划和分类。如1xx代表金币相关的异常,2xx代表用户相关的异常…
最后推荐几篇关于异常设计原则
1.异常设计
http://www.cnblogs.com/JavaVillage/articles/384483.html(翻译)
http://www.javaworld.com/jw-07-1998/jw-07-techniques.html(原文)
2. 异常处理最佳实践
http://tech.e800.com.cn/articles/2009/79/1247105040929_1.html(翻译)
http://onjava.com/pub/a/onjava/2003/11/19/exceptions.html(原文)
发表评论
-
招Java培训老师(还是论坛招人靠谱)
2015-05-10 13:39 556好久没来坛子了,一来就搞这么有目的的事儿。。。 好吧, ... -
动手开发自己的mvc-3----容器该帮我们做什么?(非常的重点)
2013-01-22 13:55 1829注解注入 我们知道,Spring只有一个角色:工厂。这个工厂可 ... -
动手开发自己的mvc-2----完善控制层,提供自动注入和注解上传等功能
2013-01-22 13:44 2597当表单提交的内容过多 ,让懒惰的程序员一个个getPara ... -
动手开发自己的mvc-1----实现初步的控制层,实现各种配置和资源获取
2013-01-22 13:28 2835mvc框架最基础的功能就是跳转,struts2支持注 ... -
动手开发自己的mvc (系列)
2013-01-22 14:08 1939到年尾了,整理了一下我Evernote藏的各种文档,打算把ys ... -
整合了一个小的爬取流程框架
2013-01-08 13:04 1334弄了一个小的爬取流程框架,把之前工作中用到的一些小经验 ... -
Mahout各种推荐器的主要特点
2012-12-06 15:17 3010Mahout有很多推荐的实现,各有特点,在这里一并记录 ... -
怎样通过词频得到这个词频的排序?
2012-12-03 14:35 2076在大规模检索中,我们怎样通过已经的词频得到词频的排序 ... -
drools实现自定义业务规则
2012-10-12 11:49 2858最近做财务相关的积分规则,由于这个功能以后涉及到方方面面 ... -
贝叶斯文本分类 java实现
2012-09-25 15:15 12712昨天实现了一个基于贝叶斯定理的的文本分类,贝叶斯定理假 ... -
前段时间做了一个小型的MVC
2012-07-20 13:23 0前端时间做了一个小型的MVC,麻雀虽小,五脏俱全,目前实现的功 ... -
聚类算法之MST算法 java实现版本
2012-07-17 14:20 2822在介绍最小生成树算法(MST)之前,简单说一下平均链接算 ... -
聚类算法之单链接算法java实现
2012-07-05 10:09 4323聚类算法中基于链接的算法大致有三种:单链接算法(s ... -
朴素贝叶斯分类器
2012-05-20 15:25 0NaiveBayes分类器的优点是能得到已知Y的条件下X的 ... -
PageRank算法java实现版本
2012-05-16 16:03 17491PageRank算法是Google的核心搜索算法,在所有 ... -
聚类算法之kmeans算法java版本
2012-04-22 21:34 20922聚类的意思很明确,物以类聚,把类似的事物放在一起。 ... -
昨天做了个小工具DB转pojo,html,sql
2012-03-21 13:15 1793做dbutils时为了方便就做了个小工具,省点小事儿吧。 -
我这儿的讨论(项目小组)区可以进来了
2012-02-28 10:38 150java项目小组群,前几天清了几个破坏气氛者,和不发言 ... -
智能web探究群组建立了
2011-11-24 12:10 1648最近群组已申请成功 ,地址是http://web.gr ... -
Cas https方式改为http方式
2011-09-24 13:02 2369最近项目要测试,来不及申请等待证书,所以先把项目改为http的 ...
相关推荐
8. **异常设计原则** - **异常应该具有明确的语义**:异常的命名和类型应清楚地表明它代表的错误情况。 - **避免在finally块中抛出异常**:这可能导致原始异常被覆盖,丢失重要信息。 - **不要滥用异常**:异常不...
Java 异常的基本概念和语法开始,讲述 Java 异常处理的基本知识,分析 Java 异常体系结构,对比 Spring 的异常处理框架,阐述异常处理的基本原则,并提出了自己处理一个大型应用系统异常的思想,并通过设计一个异常...
Java 语言在设计的当初就考虑到异常处理的框架的方案,使得所有的异常都可以用一个类型来表示,不同类型的异常对应不同的子类异常。Java 异常机制的基础知识包括异常的基础概念、异常的分类、异常的对象、异常的来源...
Java异常处理设计是Java编程中一个至关重要的环节,它直接影响到程序的稳定性和可维护性。在Java中,异常处理是通过try-catch-finally语句块来实现的,主要涉及两大类异常:编译时异常(Checked Exception)和运行时...
Java异常处理是编程中至关重要的一个环节,它关乎程序的健壮性和稳定性。在Java中,异常(Exception)被用来表示程序运行时发生的错误或不正常情况。异常并不等同于错误,它是程序设计的一部分,允许我们优雅地处理...
通过以上几点,我们可以了解到Java异常处理不仅是一种错误处理机制,而且是代码结构和设计的重要组成部分。正确使用异常处理可以提高代码的可读性,减少维护成本,同时增强程序的健壮性。在实际开发中,结合具体场景...
总的来说,理解和熟练掌握Java异常处理是编写稳定、可靠和易于维护的代码的关键技能。通过这个实验,学生不仅学习了异常处理的基本原理,还掌握了如何设计和应用异常处理程序,这对于他们的Java编程生涯至关重要。
Java异常框架是Java编程语言中处理程序运行时错误和异常的核心机制。在Java中,异常是一种特殊的对象,用于表示程序运行过程中的不正常状态。Java的异常处理模型基于\"异常处理块\",包括try、catch、finally和throw...
C++的这种设计允许更灵活的异常传播和处理,但也可能导致异常处理的复杂性增加。 继续执行(continuation)在两种语言中都有所体现,但在Java中,一旦`catch`块执行完毕,程序将继续从`catch`块之后的代码执行,...
本资源摘要信息总结了Java程序设计的真题集锦,涵盖了Java程序设计的各个方面,包括Java基础知识、Java数组、Java GUI编程、Java事件处理、Java集合框架、Java文件输入输出、Java异常处理、Java多线程编程、Java网络...
通过深入学习这个“java高端技术课程--Java异常处理详解”,开发者不仅可以掌握如何有效地处理程序中的异常,还能学习如何设计更稳定、更具弹性的代码。同时,了解和实践良好的异常处理策略也是成为一名优秀的Java...
### Java异常处理总结 #### 一、Java异常的基础知识 在Java编程中,异常处理是一项极其重要的技术。异常处理能够帮助开发者优雅地处理程序运行时遇到的问题,避免程序崩溃,并提供给用户友好的反馈信息。 **什么...
Java异常处理的9个最佳实践涵盖了开发者在进行Java编程时应当遵循的一系列规则和方法,以确保代码的健壮性和可维护性。异常处理是编程中的一个重要部分,它能够帮助我们更有效地管理和响应程序运行时的错误情况。 ...
Java异常处理通过五个关键字来实现:`try`、`catch`、`finally`、`throw`和`throws`。`try`块包含可能抛出异常的代码,`catch`块用于捕获并处理异常,`finally`块包含在任何情况下都需要执行的代码,无论是否发生...
在Java编程语言中,异常处理是一项至关重要的技能,它确保了程序在遇到错误或异常情况时能够优雅地处理,而不是突然崩溃。肖俊老师的讲解深入浅出,将帮助我们掌握这一核心概念。以下是对"JAVA 异常处理的学习"主题...
标题中的“java程序设计例题全集”意味着这份资料包含了大量关于Java编程的实践题目,这些题目可能包括基础语法、类与对象、异常处理、集合框架、多线程、网络编程等多个方面,是学习和巩固Java编程技能的理想资源。...
为了深入理解和正确实施这一机制,本文将阐述有效处理Java异常的三个重要原则,并结合JCheckbook类的示例进行讨论。 首先,Java中的异常是由Throwable类的层次结构所定义的,其中包含了Error、Exception以及...
### Java异常总结 #### 一、Java异常概述 在Java编程语言中,异常处理机制是一项非常重要的特性。它提供了一种方法来响应错误条件,并且能够有效地管理程序运行时可能出现的各种异常情况。Java中的异常主要分为两...
Java程序设计是计算机科学中的一个重要领域,主要涉及使用Java编程语言进行软件开发。Java是一种广泛应用于服务器端、桌面应用、移动应用(尤其是Android平台)的高级编程语言。天津大学计算机系提供的这门java程序...