疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

java培训:异常解决的技巧


 

  在我们的开发过程中,经常会因为这样那样的问题造成一些错误,在我们的软件开发中,我们经常称之为异常,这些异常占据我们开发的各个过程,异常处理就是要防止出现这样的异常情况。广州java培训的老师就为大家介绍一下六种常见的处理异常的方法!希望能对你有帮助!

  1. 使用一个单一的、系统范围的异常类

  不要针对每种异常类型创建单独的类,而是只创建一个,并使它继承RuntimeException。这可以减少类的数量,并移除你不会去处理的需要声明的异常。

  我知道你在想什么:如何告诉异常处理程序,这些是否是同一类型?如何跟踪特定类型的属性?继续读下去。

  2. 为错误代码使用枚举

  大多数开发者会把导致异常的原因放到消息中,出现异常时,查看日志文件即可。但是这也有一些缺点:

  · 消息不能被翻译

  · 消息不能很容易地映射为易读的文本

  · 无法从程序方面对消息进行检查

  由于每个开发者的语言习惯不一样,同样的错误可能有不同的描述形式。

 

  更好的办法是使用枚举来表示异常的类型。针对每种错误创建一个枚举,并使枚举实现一个ErrorCode接口,然后将它引用为异常中的一个字段。

  当抛出异常时,只需在适当的枚举中传递即可。

  Java代码

  1. throw new SystemException(PaymentCode.CREDIT_CARD_EXPIRED);

  现在,当你需要测试具体情况时,只需比较异常代码即可。

  Java代码

  1. catch (SystemException e) {

  2. if (e.getErrorCode() == PaymentCode.CREDIT_CARD_EXPIRED) {

  3. ...

  4. }

  5. }

  在资源包中使用错误代码作为关键字进行检索,即可取回易读的、国际化的文本。

  Java代码

  1. public class SystemExceptionExample3 {

  2.

  3. public static void main(String[] args) {

  4. System.out.println(getUserText(ValidationCode.VALUE_TOO_SHORT));

  5. }

  6.

  7. public static String getUserText(ErrorCode errorCode) {

  8. if (errorCode == null) {

  9. return null;

  10. }

  11. String key = errorCode.getClass().getSimpleName() + "__" + errorCode;

  12. ResourceBundle bundle = ResourceBundle.getBundle("com.northconcepts.exception.example.exceptions");

  13. return bundle.getString(key);

  14. }

  15.

  16. }

  3. 在枚举类型中添加错误代码

  在某些情况下,一个数字形式的错误代码可以对应一个异常,例如HTTP响应。在这种情况下,在ErrorCode接口中添加一个getNumber方法,并在每个枚举类型中实现它。

  Java代码

  1. public enum PaymentCode implements ErrorCode {

  2. SERVICE_TIMEOUT(101),

  3. CREDIT_CARD_EXPIRED(102),

  4. AMOUNT_TOO_HIGH(103),

  5. INSUFFICIENT_FUNDS(104);

  6.

  7. private final int number;

  8.

  9. private PaymentCode(int number) {

  10. this.number = number;

  11. }

  12.

  13. @Override

  14. public int getNumber() {

  15. return number;

  16. }

  17.

  18. }

  这些数字可以是全局唯一的,或者每个枚举类型只对应一个数字。你甚至可以使用隐式ordinal()方法,或者从一个文件/数据库中加载一些数字。

  4. 将动态字段添加到异常处理中

  好的异常处理也意味着记录相关数据,而不仅仅是堆栈跟踪。这样做会节省你大量用于诊断和重现错误的时间。当你的程序停止工作时,也无需客户告诉你,他们做了什么。

  做到这一点最简单的方法是在异常处理中增加一个java.util.Map字段。该字段主要作用是保留所有异常相关的数据。如果你使用fluent interface(连贯接口)模式,你还需要添加一个通用的setter方法。

  抛出异常,并带有相关的数据,类似于下面的形式:

  Java代码

  1. throw new SystemException(ValidationCode.VALUE_TOO_SHORT)

  2. .set("field", field)

  3. .set("value", value)

  4. .set("min-length", MIN_LENGTH);

  5. 防止不必要的嵌套

  长且多余的堆栈跟踪,对谁都没有好处。更糟的是,它们浪费你的时间和资源。当重新抛出异常时,调用一个静态封装方法,而不是异常的构造函数。封装方法将决定何时嵌套异常,以及何时返回原来的实例。

  Java代码

  1. public static SystemException wrap(Throwable exception, ErrorCode errorCode) {

  2. if (exception instanceof SystemException) {

  3. SystemException se = (SystemException)exception;

  4. if (errorCode != null && errorCode != se.getErrorCode()) {

  5. return new SystemException(exception.getMessage(), exception, errorCode);

  6. }

  7. return se;

  8. } else {

  9. return new SystemException(exception.getMessage(), exception, errorCode);

  10. }

  11. }

  12.

  13. public static SystemException wrap(Throwable exception) {

  14. return wrap(exception, null);

  15. }

  重新抛出异常的代码类似于:

  Java代码

  1. } catch (IOException e) {

  2. throw SystemException.wrap(e).set("fileName", fileName);

  3. }

  6. 使用一个有Web控制面板的中央记录器

  根据你的情况,访问产品日志可能会相当麻烦。因为这可能会涉及到多个中间人。

  如果你在一个多服务器环境中,事情会更糟。找到出问题的服务器,并确定该问题只影响这一台服务器,这可能相当令人头痛。

  我的建议是:

  · 将日志聚合到某一位置,最好是数据库

  · 允许从Web浏览器访问该数据库

  如果你能做到这些,那么你将很容易解决开发过程中遇到的异常问题,只要懂得一些技巧,开发人员可以无需他人帮助就可以确定异常的原因,能为企业节省资金。java要怎样学习呢?对于刚入门的人来说,学习java最重要的就是能找到好的java培训机构,好的java培训能让你节省很多时间,如果你还想学习更多知识,欢迎到疯狂java官网下载java视频教程!