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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张承富 中级黑马   /  2013-6-18 16:32  /  2840 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

{:soso_e101:}

15 个回复

倒序浏览
当方法中的代码出现有异常需要捕获时,用try/catch去捕获他,也可以在方法名之后用throws抛给上层调用。

在用try/catch捕获之后你需要处理,处理的方法多种多样,你可以在catch中直接处理掉,也可以将捕获到的异常throw出去,也有可能是要throw一个新的异常。需要注意的是throw是不能将异常抛出到方法之外的, 他只能抛在方法,之内,所以你又要重复上面的步骤,是在catch中从新trycatch或者在方法上用throws。当然在catch中使用try/catch并不可取

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1

查看全部评分

回复 使用道具 举报
  1. class Throw{
  2.         public void show(int a) throws Exception{//当这个方法可能会出现异常时,需要在方法声明的时候添加抛出声明,用throws
  3.                 int s=1;
  4.                 if(a>s)
  5.                         throw new Exception("a>1错误");//当符合某个异常出现的条件的时候,就要抛出异常,用throw
  6.                 else if(a==s)
  7.                         throw new Exception("a=1错误");
  8.                 System.out.println("a="+a);
  9.         }
  10. }
  11. public class ThrowDemo {
  12.         public static void main(String[] args)/*throws Exception*/{
  13.                 Throw t=new Throw();
  14.                 try {                        //当用到的这个方法可能会出现异常的时候,要么直接捕获进行处理,用try..catch..
  15.                         t.show(1);        //要么像上边声明的一样继续用throws进行抛出
  16.                 }catch(Exception e) {
  17.                         e.printStackTrace();
  18.                 }
  19.         }
  20. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1

查看全部评分

回复 使用道具 举报
try语句   
  try语句用大括号{}指定了一段代码,该段代码可能会抛弃一个或多个例外。      
throw语句 

  throw总是出现在函数体中,用来抛出一个异常。程序会在throw语句后立即终止,它后面的语句执行不到,然后在包含它的所有try块中(可能在上层调用函数中)从里向外寻找含有与其匹配的catch子句的try块。

  throws总是出现在一个函数头中,用来标明该成员函数可能抛出的各种异常。对大多数Exception子类来说,Java 编译器会强迫你声明在一个成员函数中抛出的异常的类型。如果异常的类型是Error或 RuntimeException, 或它们的子类,这个规则不起作用, 因为这在程序的正常部分中是不期待出现的。 如果你想明确地抛出一个RuntimeException,你必须用throws语句来声明它的类型。  
   
  

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1

查看全部评分

回复 使用道具 举报
简单的说 当一个程序的某一部分存在问题时就需要用到try

既然有了try虚拟机就需要去捕捉异常 这时也就自然有了catch
当然也可以直接throws 异常。这里说说throw 与throws 的区别
throw 用于抛出程序中的局部异常也就是异常对象。
throws作用于函数上用于抛出异常类。

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1

查看全部评分

回复 使用道具 举报
一般是能自己处理的尽量自己处理,这里有个外链,说的很好,你可以看看http://soft.chinabyte.com/database/333/12347833.shtml

回复 使用道具 举报
当程序有异常要处理时,
自己能处理的异常用try/catch ,throw异常处理
不能处理的,让调用者自行处理,在函数上用throws抛出异常

个人理解,仅供参考

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1

查看全部评分

回复 使用道具 举报
一般在做练习的时候,为了省事,都在函数上用throws把异常抛出去,这样try..catch..和thrwos没有什么区别。
throws相当于把异常抛给上一级处理。
但实际开发中,应该是try..catch用的比较多吧,因为遇到异常不处理,抛给上一级,一直抛,到最后肯定会出错。
但是有一种情况要注意:子类不能抛出比父类更高一级的异常。比如:

  1. <P> class Ticket extends Thread</P>
  2. <P>{
  3. private int ticket =100;
  4. public void run(){
  5.   while(true){
  6.    //同步语句块
  7.    synchronized (this) {
  8.     if(ticket>0){
  9.      try {
  10.       Thread.sleep(10);//这里就不能用throws,因为Ticket继承了Thread类,而Thread类中不能处理这个异常</P>
  11. <P>     } catch (InterruptedException e) {
  12.       e.printStackTrace();
  13.      }
  14.      System.out.println(Thread.currentThread().getName()+" sale : "+ticket--);
  15.     }else{
  16.      break;
  17.     }
  18.    }
  19.    
  20.    
  21.   }
  22. }
  23. }</P>
复制代码
以上是本人的理解,说出来供参考,有不对的请指正。呵呵

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1

查看全部评分

回复 使用道具 举报
确实不能改成已解决呀
回复 使用道具 举报
张承富 发表于 2013-6-19 10:36
确实不能改成已解决呀

好像楼主要在自己帖子中写明已解决  版主就会帮你改过来的。貌似现在都不能再编辑了。
回复 使用道具 举报
好的,美女,这个问题已经解决了
回复 使用道具 举报
throws是用来声明一个方法可能抛出的所有异常信息
throw则是指抛出的一个具体的异常类型。
通常在一个方法(类)的声明处通过throws声明方法(类)可能抛出的异常信息,而在方法(类)内部通过throw声明一个具体的异常信息。
throws通常不用显示的捕获异常,可由系统自动将所有捕获的异常信息抛给上级方法;
throw则需要用户自己捕获相关的异常,而后在对其进行相关包装,最后再将包装后的异常信息抛出。
对异常处理方式不同.throws对异常不处理,谁调用谁处理,throws的Exception的取值范围要大于方法内部异常的最大范围,而cathch的范围又要大于throws的Exception的范围;throw 主动抛出自定义异常类对象. throws抛出的是类,throw抛出的是对象.
在方法定义中表示的是陈述语气,第三人称单数,throw 显然要加s。(throws 一般用作方法定义的子句)
在函数体中要用throw,实际上是祈使句+强调,等价于DO throw ....,do +动词原形

throw 用于引发异常,可引发预定义异常和自定义异常。

I)异常中“throws”和“throw”的区别:

throw 是个“动词”,紧接在try语句块之后。
而throws 是“名词” ,用在函数方法名后 function A () throws Exception e {}
throw用在程序中明确表示这里抛出一个异常。throws用在方法声明的地方,表示这个方法可能会抛出某异常。
throw用来抛出实际的异常, 后面要跟一个异常对象(实例), 是一个实际的语句
throws是用来声明的, 加在方法声明的后面, 后面跟一个异常类的名字, 表示一般性动作而不是特指某一个动作.

使用throws是来说明,当前的函数会抛出一个异常。
在一般的情况下,你调用的一些函数会抛出一些异常。但是你又不想在当前的context中去处理它,就可以声明该函数会抛出该异常,这样你就不用去try-catch它了。当出现该异常,该函数会抛出此异常,让上一层的函数去处理。throws也称异常规范
public static h() throws
{
     try
     {
         a.g();
     }
     catch(Exception e)
     {
         throw e;
     }
}
因为你没有对这个异常处理,而是简单的抛出了。
而单纯的声明
public static h() throws
{
     a.g();
}
也会抛出这个异常
II)try catch \throws \throw

throws如果发生了对应的错误后,下边的的确不会被执行;
try catch的理解应该辩证点看:如果catch后没有再次throw出去,那会继续执行;要想不执行必须throw处理
throws   抛出异常,解决不了再向上,直道碰到能解决这个异常的处理程序,就好像你的上司让你执行一项任务,中途你遇到问题不知道如何解决,你把问题返还给你的上司,认为既然是T分配的任务就该知道如何解决这个问题,你的上司无法解决同样把它送给经理解决,依次向上,直到有人能解决这个问题为止(不想自己另外写代码处理异常时非常有用)
try catch    则是考虑到try包含这段代码可能会遇到这种异常,直接用catch捕获处理,catch包含的代码为处理代码

throws 只是把一个异常抛出去了,如果你的上层代码有处理方式,就由上层代码来处理这个异常。
而try/catch对是清楚的知道该操作可能出现什么异常,同时在catch块中应该有处理的方法。
而且还有一种方式就是try/catch/finaly的方式。

Throws是把异常返回给调用者,由调用者处理,调用者还是要try/catch,跑不掉的
catch中就一个简单的SYSTEM.OUT.PRINTLN(…………);还有,连接数据库时会连接不上,你也不知道是驱动问题、电脑问题还是网络问题,发给用户,用户也看不懂,所以统统throws给catch,提示请与管理员联系。。。。。。这就简单多了

throws 写在方法签名后,
throw 写在方法体内,可以写在if()....
也可以catch住一个exception后立刻又把他throw 出去,什么处理也不做,还可以catch住后throw new 一个你自己定义的exception ....

throws 就是把异常抛出,但是在以后要不有个catch接受,要不就抛给主函数.就是逐级往上一级抛,直到有一个接受他的

Throws抛出异常交给调用该方法的方法 处理,即:
public class Test{
    public static void main(String[] args){
        Test2 test2 = new Test2();
        try{
           System.out.println("invoke the method begin!");
           test2.method();
           System.out.println("invoke the method end!");
        }catch(Exception e){
           System.out.println("catch Exception!");
        }
    }
}

class Test2{
    public void method() throws Exception{
        System.out.println("method begin!");
        int a = 10;
        int b = 0;
        int c = a/b;
        System.out.println("method end!");
    }
}

很明显,答案出来了:
invoke the method begin!
method begin!
catch Exception!

finally语句是任选的,try语句后至少要有一个catch或一个finally,finally语句为异常处理提供一个统一的出口,不论try代码块是否发生了异常事件,finally块中的语句都会被执行
在覆盖的方法中声明异常
在子类中,如果要覆盖父类的一个方法,或父类中的方法声明了throws异常,则子类的方法也可以抛出异常,但切记子类方法抛出的异常只能是父类方法抛出的异常的同类或子类。
如:
import java.io.*;
class A {
public void methodA()throws IOException{
.....
}
}
class B1 extends A {
public void methodA()throws FileNotFoundException{
....}
}
class B2 extends A {
public void methodA()throws Exception{//Error
....}
}


public void method() throws Exception {
try {
      具体程序
} catch(Exception ex) {

}
}
如果具体程序出错的话,将处理下面程序体中catch的地方,这个时候throws Exception 其实是没有意义的。
public void method() throws Exception {
try {
      具体程序
} catch(FileNotFoundException ex) {

}
}

如果具体程序出错的话,且是FileNotFoundException 的情况下,将处理下面程序体中catch的地方处理。
这个时候FileNotFoundException 以外的Exception 将通过 throws Exception ,throw到上一层。

throw写在方法体内, throws写在方法名的后面
throw关键字的格式:throw new ArithmeticException(); 抛出一个异常,这些异常可以使unchecked exception(也就是RuntimeException),也可以是checked execption. throw必须有一个捕获该异常的try/catch语句
throws关键字的格式
private void arrayMethod(int[] arr)
           throws ArrayIndexOutOfBoundsException,
                  ArithmeticException {
     //   Body
}
throws子句列出了方法可能抛出的异常类型,除了Error和RuntimeException异常,方法中可能抛出的异常必须在throws列表中声明,否则就会出现编译错误。
例如:假如方法中可能抛出IllegalAccessException(属于checked execption)则必须在throws列表中声明。

系统异常是默认抛出的,自己定义的异常要显示抛出

还有一些是库方法只throw 没有处理的,所以表面上你看到没有throw也catch到异常
回复 使用道具 举报
哇,。,这么多,。有异常就用try,catch,catch里面throw定义异常,方法名()后面用throws抛出异常
回复 使用道具 举报
throws是用在方法外,throw用在方法内。有异常就要try catch
回复 使用道具 举报
楼主您好,由于帖子长时间没有动态,我已经讲帖子改成已解决了,如有问题,可以私聊我。
回复 使用道具 举报
楼主您好,由于帖子长时间没有动态,我已经讲帖子改成已解决了,如有问题,可以私聊我。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马