课程咨询 :186 8716 1620      qq:2066486918

昆明Java培训 > 达内新闻 > java程序里面异常只为异常服务
  • java程序里面异常只为异常服务

    发布:昆明Java培训      来源:达内新闻      时间:2016-10-24

  • 异常只为异常服务,这是何解?难道异常还能为其它服务不成?昆明Java培训机构的老师告诉你确实能,异常原本是正常逻辑的一个补充,但是有时候会被当做主逻辑使用,看如下代码:

    //判断一个枚举是否包含String枚举项

    public static <T extends Enum<T>> boolean Contain(Class<T> clz,String name){

    boolean result = false;

    try{

    Enum.valueOf(clz, name);

    result = true;

    }catch(RuntimeException e){

    //只要是抛出异常,则认为不包含

    }

    return result;

    }

    判断一个枚举是否包含指定的枚举项,这里会根据valueOf方法是否抛出异常来进行判断,如果抛出异常(一般是IllegalArgumentException异常),则认为是不包含,若不抛出异常则可以认为包含该枚举项,看上去这段代码很正常,但是其 有是哪个错误:

    异常判断降低了系统的性能

    降低了代码的可读性,只有详细了解valueOf方法的人才能读懂这样的代码,因为valueOf抛出的是一个非受检异常

    隐藏了运行期可能产生的错误,catch到异常,但没有做任何处理。

    昆明Java培训机构的老师这段代码是用一段异常实现了一个正常的业务逻辑,这导致代码产生了坏味道。要解决从问题也很容易,即不在主逻辑中实使用异常,代码如下:

    //判断一个枚举是否包含String枚举项

    public static <T extends Enum<T>> boolean Contain(Class<T> clz, String name) {

    //遍历枚举项

    for (T t : clz.getEnumConstants()) {

    //枚举项名称是否相等

    if (t.name().equals(name)) {

    return true;

    }

    }

    return false;

    }

    异常只能用在非正常的情况下,不能成为正常情况下的主逻辑,也就是说,异常是是主逻辑的辅助场景,不能喧宾夺主。

    而且,异常虽然是描述例外事件的,但能避免则避免之,除非是确实无法避免的异常,例如:

    public static void main(String[] args) {

    File file = new File("a.txt");

    try {

    FileInputStream fis = new FileInputStream(file);

    //其它业务处理

    } catch (FileNotFoundException e) {

    e.printStackTrace();

    //异常处理

    }

    }

    这样一段代码经常在我们的项目中出现,但经常写并不代表不可优化,这里的异常类FileNotFoundException完全可以在它诞生前就消除掉:先判断文件是否存在,然后再生成FileInputStream对象,这也是项目中常见的代码:

    public static void main(String[] args) {

    File file = new File("a.txt");

    //经常出现的异常,可以先做判断

    if (file.exists() && !file.isDirectory()) {

    try {

    FileInputStream fis = new FileInputStream(file);

    //其它业务处理

    } catch (FileNotFoundException e) {

    e.printStackTrace();

    //异常处理

    }

    }

    }

    昆明Java培训机构的老师提醒大家注意,虽然增加了if判断语句,增加了代码量,但是却减少了FileNotFoundException异常出现的几率,提高了程序的性能和稳定性。

    推荐文章

上一篇:java程序:使用Throwable获得栈信息

下一篇:多使用异常,把性能问题放一边

最新开班日期  |  更多

Java--零基础全日制班

Java--零基础全日制班

开班日期:11/30

Java--零基础业余班

Java--零基础业余班

开班日期:11/30

Java--周末提升班

Java--周末提升班

开班日期:11/30

Java--零基础周末班

Java--零基础周末班

开班日期:11/30

  • 网址:http://km .java.tedu.cn      地址:昆明市官渡区春城路62号证券大厦附楼6楼
  • 课程培训电话:186 8716 1620      qq:2066486918    全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内国际公司(TARENA INTERNATIONAL,INC.) 版权所有 京ICP证08000853号-56