Java异常之简述

何为异常,根据表面意思就是不正常的称为异常,异常会导致程序中断,或者是出现难以想象的结果。

那么今天就总结一下什么是异常,怎么处理异常,异常处理的作用与意义,还有return 语句与finally块的顺序

一、什么是异常

java中所有的异常都继承自Throwable类,称为异常的始祖,它有两个儿子,error和Exception 。error是错误的意思,当error出现的时候,那么便出现了不可修复的错误,就好比工厂停电、停水、不可修复的问题.error就是系统级的错误或者是程序不必处理的异常,是java运行环境中的内部错误或者是硬件的问题,对于这种错误程序一般无能为力,只能退出程序重新运行,有可能的话,它会在系统层被捕获,是不可控的;Exception是程序的问题,程序可以进行捕获并处理,可以是可控的或者不可控的,可控的指的是会编译器发现的错误,不可控的是编译器允许通过但是在运行时会抛出异常的错误。

以上便是部分的继承关系,由于写的比较乱,所以在这里稍微说一下,Throwable 是最高级的类,它有两个子类是error和Exception ,error 主要有两个儿子是虚拟机错误和线程死锁,当这些错误出现时程序便会崩溃,出现不可控的错误;Exception 主要是环境、编码和用户输入错误等,可以控制的,它主要是 RuntimeException 和 其他的异常 ,其中RuntimeException( 运行时异常),称为非检查异常(Unchecked Exception),编译器不会对其进行处理,它主要是: 类型转换异常、数组越界异常、空指针异常、数值计算异常等,这些异常在运行的时候才会被JVM捕获进行处理;而其他的异常被称为检查异常(Checked Exception),在编译的时候编译器会对其进行警告,需要程序员对其手动添加处理块,它主要是IO流异常和SQL语句异常,前者主要是在文件读或者写的时候出现,后者是在执行SQL时出现。当然,也有其他的异常,这里便不一一列举了。

小结:异常就是Java程序抛出的错误,分为可处理和不可处理的,可处理的又分为检查和非检查的,检查的在编译器时便会提示解决,非检查的在运行时才会被抛出需要程序员手动处理。

二、怎么处理异常

为了让程序能按照程序员的想法正常执行,我们必须要对可能出现的异常进行处理,利用try-catch块或者try-catch-finally去解决,其中具体的用法是:

try{
    //可能会出现异常的语句
   }catch(Exception e){ //捕获的异常
        //对异常进行处理
}
try{
    //可能会出现的错误
   }catch(Exception e) {//抛出的异常
    //对异常进行相应的处理
}finally{
    //最终会执行的一些操作,比如释放资源,关闭链接等
}

举个例子如下:

try{
            while(divider > -1){
                divider--;
                result=result+100/divider;
            }
            return result;
        }catch (Exception e){
            e.printStackTrace();
            System.out.println("循环抛出异常了!!!");
            return -1;
        }

上面的代码可能会出现除数为0的错误,抛出一个ArithmeticException,接着catch便捕获这个异常在其内部对其进行处理,上面的仅仅是对其进行堆栈内的错误信息的打印,并且输出一句话、返回-1,这就是一个简单的异常处理

finally的例子:

try{
            while(divider > -1){
                divider--;
                result=result+100/divider;
            }
            return result;
        }catch (Exception e){
            e.printStackTrace();
            System.out.println("循环抛出异常了!!!");
            return 999;
        }finally {
            System.out.println("我是finally语句,我执行完了");
            System.out.println("我的返回值是:"+result);
        }

上面的例子中在try-catch的基础上再执行一下finall中的内容,输出两句话,当然一般的finally中一般是会进行资源的释放或者close链接

现在,我们的重点来了,关于try-catch中含有return 时try-catch-finally的执行顺序的问题,这段代码是我拷的一位大神的,因为具有典型性,所以用来举例再合适不过,大神的链接:http://blog.csdn.net/hguisu/article/details/6155636

public class TestException {

public  TestException() {}

boolean testEx()  throws Exception {

boolean ret =  true;
try{
           ret =  testEx1();
     }catch(Exception e) {
           System.out.println("testEx, catch exception");
           ret =  false;
          throw e;
      }finally{
          System.out.println("testEx, finally; return value=" + ret);
          return ret;
    }
}

boolean  testEx1() throws Exception {

boolean ret =  true;
try{
         ret =  testEx2();
        if(!ret) {
              return false ;
        }
       System.out.println("testEx1, at the end of try");
      return ret;
  }catch(Exception e) {
      System.out.println("testEx1, catch exception");
      ret =  false;
      throw e;
 }finally{
       System.out.println("testEx1, finally; return value=" + ret);
        return ret;
    }
}

boolean  testEx2()  throws Exception {
boolean ret =  true;
try{
int b = 12 ;
int c;
for(int i = 2; i >= -2; i--) {
          c = b / i;
          System.out.println("i=" + i);
  }
return true;
}catch(Exception e) {
        System.out.println("testEx2, catch exception");
        ret =  false;
        throw e;
  }finally{
                System.out.println("testEx2, finally; return value=" + ret);
      return ret;
   }
}
public static void main(String[] args) {
            TestException testException1  =  new TestException();
            try{
                testException1.testEx();
            }catch(Exception e) {
                e.printStackTrace();
            }
        }
    }

上面的代码的返回值是什么呢?

运行结果

没错,就是上面的结果,接下来我们来讨论讨论为什么会出现这样的结果

首先,在testEx2中输出i=2,i=1. ret的值为true,try中抛出一个异常(这里的return 便不会再被执行),被catch捕获,输出
testEx2, catch exception, ret=false,并且向调用者抛出一个异常,接着去执行finally语句,输出“

 testEx2, finally; return value=false

接着执行return ret;然后我们来到调用者testEx1中,ret得到testEx2的返回值false,然后去执行if语句,return false,由于没有抛出异常,则直接执行finally语句,输出

testEx1, finally; return value= false",

这里有两个问题:1.在try中为什么没有顺序执行return 后的语句?2.为什么testEx2中抛出的异常没有了???

a.在try中如果有return 语句,当没有异常抛出时,执行到了return ,return 后面的语句便不会再被执行,并且直接跳过catch语句,执行finally(当然如果有的话),然后再接着执行下面的语句

b.在try中如果有return 语句,当有异常抛出的时候,便不会再执行抛出异常语句后面的语句,异常被catch捕获,执行catch中的语句,不会再返回执行try中的return ,而是接着向下执行

c.在catch中如果有return语句,当catch中没有异常抛出的时候,执行了return ,不会再执行catch中return 后面的语句,而是接着执行后面的语句,包括finally语句

d.在catch中如果有return 语句,并且有异常抛出且在return 语句之前,则抛出异常,不会再执行return 语句包括catch 中return 其后的语句,而是去执行finally或者后面的语句

e.当catch中有异常抛出,并且finally中有return 语句,那么catch中的异常会被return 语句吃掉,不会抛出

f.当catch中有异常抛出,finally中没有return 语句,那么catch中的异常会被抛出给它的调用者

finally是无论如何都会被执行的!!!

接着跟前边的一样,执行testEx1的调用者testEx输出"

testEx, finally; return value= false

三、异常处理的作用与意义

处理异常的作用与意义:

a.处理一些小的异常可能会使整个程序避免出现更大的错误,防微杜渐

b.代码组织更清晰了,且更容易实现了,因为把真正的工作和异常分开来处理了

c.给用户一个改错的机会,如果用户不小心输入错误,程序要作出错误提示,交互性比较好

d.可以有一个更可靠的执行流,return 语句可以跳转到调用者一些返回值

f.如果被调用者处理不了可以抛给调用者,让调用者去处理,如果直到main还处理不了,那就抛给JVM去处理

总之,异常处理是Java中的一个非常重要的机制,防止程序崩溃,在以后的程序中我们要多多使用。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,571评论 18 399
  • 通俗编程——白话JAVA异常机制 - 代码之道,编程之法 - 博客频道 - CSDN.NEThttp://blog...
    葡萄喃喃呓语阅读 3,161评论 0 25
  • 初识异常(Exception) 比如我们在取数组里面的某个值得时候,经常会出现定义的取值范围超过了数组的大小,那么...
    iDaniel阅读 1,863评论 1 2
  • “哇,大片的感觉!” “太专业啦,你们都不用去照相馆给孩子拍照啦!” “哇,这照片拍的比专业摄影师都牛。” “菜苗...
    李凤玲_默契阅读 819评论 5 6
  • 文/菽麦 《成功心理学 - 发现工作与生活的意义》。这本书的外观设计,简约大气,纸张设计的手感挺好,书很厚,而且书...
    菽麦阅读 3,496评论 12 84