A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郑雪 中级黑马   /  2013-4-25 20:08  /  1831 人查看  /  7 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

一直搞不懂,try{}catch{}是如何处理异常的,毕老师的视频中总是在方法上抛出Exception异常,即使有时在catch语句中处理了,也是throw XXException,难道这就是开发中处理异常的方式吗?实在不懂。

点评

鼓励鼓励  发表于 2013-4-25 23:08

评分

参与人数 1技术分 +2 收起 理由
黄玉昆 + 2

查看全部评分

7 个回复

倒序浏览
异常机制:程序出现错误后程序如何处理,控制权交给异常处理器。(异常都是在运行中的,不是编译时的)

异常处理流程:遇到错误,方法立即结束,同时抛出一个异常对象。调用该方法的程序停止,并搜索一个可以处理该异常的,并执行其中的代码。

Error及RunTimeException及其子类为未检测异常,及自己会跑出不需要程序员抛出;而其他为已检测异常,需要程序员抛出。

     异常处理:

1、既然捕获了异常,就要对它进行适当的处理。不要捕获异常之后又把它丢弃,不予理睬。
2、在catch语句中尽可能指定具体的异常类型,必要时使用多个catch。不要试图处理所有可能出现的异常。
3、保证所有资源都被正确释放。充分运用finally关键词。
4、在异常处理模块中提供适量的错误原因信息,组织错误信息使其易于理解和阅读。例如当前正在执行的类、方法和其他状态信息,包括以一种更适合阅读的方式整理和组
织printStackTrace提供的信息。
5、尽量减小try块的体积。
6、全面考虑可能出现的异常以及这些异常对执行流程的影响。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 袁梦希 于 2013-4-25 20:33 编辑

异常处理原则:功能抛出几个异常,功能调用如果进行try处理,需要与之对应的catch处理代码块,这样的处理有针对性,抛几个就处理几个。
特殊情况:try对应多个catch时,如果有父类的catch语句块,一定要放在下面。
throw 和throws关键字的区别:
throw用于抛出异常对象,后面跟的是异常对象;throw用在函数内。
throws用于抛出异常类,后面跟的异常类名,可以跟多个,用逗号隔开。throws用在函数上。
通常情况:函数内容如果有throw,抛出异常对象,并没有进行处理,那么函数上一定要声明,否则编译失败。但是也有特殊情况。
异常分两种:
1:编译时被检查的异常,只要是Exception及其子类都是编译时被检测的异常。
2:运行时异常,其中Exception有一个特殊的子类RuntimeException,以及RuntimeException的子类是运行异常,也就说这个异常是编译时不被检查的异常。
编译时被检查的异常和运行时异常的区别:
编译被检查的异常在函数内被抛出,函数必须要声明,否编译失败。
声明的原因:是需要调用者对该异常进行处理。
运行时异常如果在函数内被抛出,在函数上不需要声明。
不声明的原因:不需要调用者处理,运行时异常发生,已经无法再让程序继续运行,所以,不让调用处理的,直接让程序停止,由调用者对代码进行修正。
定义异常处理时,什么时候定义try,什么时候定义throws呢?
功能内部如果出现异常,如果内部可以处理,就用try;
如果功能内部处理不了,就必须声明出来,让调用者处理。
自定义异常:当开发时,项目中出现了java中没有定义过的问题时,这时就需要我们按照java异常建立思想,将项目的中的特有问题也进行对象的封装。这个异常,称为自定义异常。
对于除法运算,0作为除数是不可以的。java中对这种问题用ArithmeticException类进行描述。对于这个功能,在我们项目中,除数除了不可以为0外,还不可以为负数。可是负数的部分java并没有针对描述。所以我们就需要自定义这个异常。
自定义异常的步骤:
1:定义一个子类继承Exception或RuntimeException,让该类具备可抛性。
2:通过throw 或者throws进行操作。
记住:finally很有用,主要用户关闭资源。无论是否发生异常,资源都必须进行关闭。
System.exit(0); //退出jvm,只有这种情况finally不执行。
当异常出现后,在子父类进行覆盖时,有了一些新的特点:
1:当子类覆盖父类的方法时,如果父类的方法抛出了异常,那么子类的方法要么不抛出异常要么抛出父类异常或者该异常的子类,不能抛出其他异常。
2:如果父类抛出了多个异常,那么子类在覆盖时只能抛出父类的异常的子集。
注意:
如果父类或者接口中的方法没有抛出过异常,那么子类是不可以抛出异常的,如果子类的覆盖的方法中出现了异常,只能try不能throws。
如果这个异常子类无法处理,已经影响了子类方法的具体运算,这时可以在子类方法中,通过throw抛出RuntimeException异常或者其子类,这样,子类的方法上是不需要throws声明的。
常见异常:
1、脚标越界异常(IndexOutOfBoundsException)包括数组、字符串;
空指针异常(NullPointerException)
2、类型转换异常:ClassCastException
3、没有这个元素异常:NullPointerException
4、不支持操作异常;

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 总结的不错,但是还是简练些比较好的.

查看全部评分

回复 使用道具 举报
异常处理机制:
(1)捕获异常:通过try...catch...finally语句实现。
try{
//可能出现异常的语句
}
catch(对应的异常类可以是多个用‘|’隔开){
//异常处理语句
}....
finally
{//finally通常用于回收资源
//一定会执行的语句
}
(2)声明抛出异常:如果一个方法中发生了异常,但该方法不知道怎么处理该异常,此时该方法
就声明抛出异常,使得异常对象沿着方法的调用栈向后传播,直到有合适的方法捕捉它为止。
声明抛出异常关键字throws,throws语句后可跟多个异常类。
常用异常类
Exception  --->1、SQLException
           --->2、IOException
           --->3、RuntimeException(运行时异常)
1、编译时异常(checked异常):必须处理(1)要么捕捉(2)要么抛出   
2、RuntimeException(运行时异常)有:
(1)NullPointerException(空指针异常)                                                              
(2)ArrayIndexOutOfBoundsException(数组索引越界异常)                                                                     
(3)ClassCastException(类型转换异常)                                                               
(4)ArithmethicException(算术异常 如:除0)
(5)NumberFormatException(转换格式异常)                                                                  
(6)IllegalArgumentException(非法参数异常)
(7)NegativeArraySizeException(指定数组维数为负值异常)

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
异常就是在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序.使用try/catch块捕获异常,分三种情况:
第一种情况:
public void method(){    try {
         //代码段(此处不会产生异常)
  } catch(异常类型 ex){
         //对异常进行处理的代码段
  }
     //代码段
}
如图:

第二种情况:
public void method(){
   try{
         //代码段1
         //产生异常的代码段2
         // 代码段3
    } catch(异常类型 ex){
         //对异常进行处理的代码段4
    }
     //代码段5
}
如图:

第三种情况:
public  void method(){
   try{
         //代码段1
         //产生异常的代码段2
         //代码段3
   }catch(异常类型 ex){
         //对异常进行处理的代码段4
   }
     //代码段5
}
如图:

通过看图,就可以很明了了。



评分

参与人数 1技术分 +2 收起 理由
黄玉昆 + 2

查看全部评分

回复 使用道具 举报
异常的处理原则:
                a.处理方式有两种:try 或者 throws
                b.调用到抛出异常的功能时,抛出几个,就处理几个
                  一个try对应多个catch
                c.多个catch,父类的catch放到最下面
                d.catch内,需要定义针对性的处理方式,不要简单的定义printStackTrace,输出语句,也不要不写
                  当捕获到的异常,本办能处理不了时,可以继续在catch中抛出
                  try
                  {
                        throw new AException();
                  }
                  catch(AException e)
                  {
                        throw e;
                  }
                  如果该异常处理不了,但并不属于该功能出现的异常
                  可以将异常转换后,再抛出和该功能相关的异常

                  或者异常可以处理,当需要将异常产生的和本功能相关的问题提供出去
                  当调用者知道,并处理,也可以将捕获异常处理后转换新的异常
                  try
                  {
                        throw new AException();
                  }
                  catch(AException e)
                  {
                        //对AException处理
                        throw new BException;
                  }

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
如果一个异常没有在当前的try-catch模块中得到处理,则它会抛出到它的调用方法。
如果一个异常回到了main()方法,仍没有得到处理,则程序会异常终止。
ava程序的执行过程中如出现异常,会自动生成一个异常类对象,该异常对象将被提交给Java运行时系统,这个过程称为抛出(throw)异常。
当Java运行时系统接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交给其处理,这一过程称为捕获(catch)异常。
如果Java运行时系统找不到可以捕获异常的方法,则运行时系统将终止,相应的Java程序也将退出。
程序员通常只能处理违例(Exception),而对错误(Error)无能为力。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
黄玉昆 黑马帝 2013-4-26 23:32:19
8#
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马