在java中使用Throws和Throw语句

想像一下,你被安排去找一本指定的书这样一个任务,然后去阅读它并将其内容解释给班里面的学生们听。这个顺序可能是:

1.获得指定的书。

2.读它的内容。

3。将内容解释给班里的学生听。

但是,如果你不能够找到指定的书的话,接下来将会发生什么了?你接下来的工作将无法进展,因此你需要将你这一情况反馈给安排你任务的那个人。这个不希望的事件(书找不到)使你无法完成你的工作。通过将这一事件反馈出来,你想让这个请求的发起者采取补救或可选的措施。

接下来,让我们将上面的任务用代码来实现,我们定义一个teachClass,如下所示:

 void teachClass() throws BookNotFoundException{
  boolean bookFound = locateBook();
  if(!bookFound)
   throw new BookNotFoundException();
  else{
   readBook();
   explainContents();
  }
 }

这个例子是用来比较throw 与 throws的语句。当执行throw new BookNotFoundException时, teachClass()终止执行。JVM将会创建BookNotFoundException的实力并且将它发送给teachClass()的调用者以便作出合理的处理。

throw语句被用于抛出exception的一个实例——BookNotFoundException. throws语句被用于标识teachClass可以抛出BookNotFoundException异常。

为什么一个方法选择抛出一个异常而不是自己处理这个异常呢? 这是方法的调用者和被调用者之间的一种契约。回到上面讲的teachClass方法,如果teachClass不能够找到指定的书的话,teachClass的调用者希望得到通知。teachClass方法自身不处理BookNotFoundException异常是因为他的责任不包括处理书找不到这一异常。

创建一个方法,使之抛出一个受控的异常(checked exception)

让我们来创建一个简单的方法,通过使用关键字throw和throws,它不能处理它自身抛出的checked exception。类DemoThrowsException定义了方法readFile,它包含了一个throws语句。真正抛出异常的是通过throw 语句完成的。

throws语句用于表明该方法能够抛出一个FileNotFoundException类型的异常,

throw语句创建并抛出了FileNotFoundException类型的异常的对象。

一个方法可以包括多个用throws语句,但并不要求在throws语句中包含运行时异常和错误。一个方法仍能抛出抛出运行时异常或错误的实例而不需将他们包含在throws语句中。

使用一个方法来抛出一个checked exception

当你使用一个方法来抛出一个checked exception ,你能够 :

1.将那段代码放在try catch子块中并且捕获被抛出的异常。

2.在方法头中声明异常被重新抛出。

3.实现以上的组合。

在下面的例子中,方法useReadFile 将readFile方法的调用语句放在了try-catch块中。方法readFile抛出了FileNotFoundException(a checked exception):

 

你可以对上面的恶写法做出一点修改,如下:

如果你在useReadFile方法中使用了以上的两种方法,useReadFile能够自己处理FileNotFoundException并且声明了他被抛出的异常,这种场景下,编译器也不会报错,如下所示:

 

这个时候当readFile抛出FileNotFoundException时,将会使得这个异常有useReadFile中的catch块来捕获。

使用throw和throws语句的注意点:

1.没有必要在throws语句中包含runtime exception和错误。

如下代码所示:

A处throws语句指定了这个方法可能抛出FileNotFoundException。

B处代码抛出了NullPointerException,但是他不包含在throws语句中。

C处代码创建并抛出FileNotFoundException实例。

将runtime exception 放在trows语句中也是有效的。如下代码所示:

public void readFile(String  file) throws NullPointerException,FileNotFoundException {

};

 不管你是否在throws语句中包含运行时异常和错误,一个方法总能够抛出运行时异常和错误。

2. 一个方法能够抛出throws语句中的异常的子类异常而不能抛出父类型的异常

因为IOException 是FileNotFoundException的弗雷,readFile不能抛出IOException类型的对象 。以下代码不正确,编译器将会报错:

 

class DemoThrowsException {

      public  void  readFile(String file) throws FileNotFoundException {

            boolean  found = findFile(file);

            if(!found)

                throw new IOException("Missing file");

           else {

            }

           boolean findFile(String  file){

           }

}

让我们对上面的代码做出正确性的修改 :

class DemoThrowsException {

      public  void  readFile(String file) throws IOException {

            boolean  found = findFile(file);

            if(!found)

                throw new FileNotFoundException("Missing file");

           else {

            }

           boolean findFile(String  file){

           }

}

一个方法即能够处理异常,同样也能够声明抛出的异常:

 

从java7开始,在catch块中 你重新抛出异常所使用的变量类型可以是更加的通用,如下所示:

class GenericVariableTypeToRethrowException {
    public static void main(String args[]) 
                          throws IOException, SQLException {    #A
        String source = "DBMS";
        try {
            if (source.equals("DBMS")) throw new SQLException();
            else throw new IOException();
        }
        catch (Exception e) {            #B
            throw e;                    #C
        }
    }
}

在A处方法声明了IOException 和 SQLException。

在B处 变量e的类型是Exception比IOException 和 SQLException更通用。

在C处 catch块出重新抛出了捕获的异常 。

在try块中,代码throws要么有条件的抛出SQLException要么抛出IOException。在java7中,编译器能够决定catch块中所抛出的异常的具体类型并且能够重新的抛出它,即使是异常类型变量在异常的处理处是Exception——SQLException和IOException的父类。这在java7版本以前是不被允许的。

 

总之,通过throw能够抛出一个你定制的异常对象,这个异常对象由谁来处理,可以通过与throws和catch配合来处理。throws用来将这个异常抛出给调用它的上一层方法来处理。catch则可以在本方法内来对这个异常进行处理,同样也能够在catch块中将这个异常抛出,抛给上一层调用方法来处理。

 

### 回答1: Javathrowthrows是两个关键字,用于处理异常。 throw用于在代码块抛出一个异常对象,可以是Java内置的异常类,也可以是自定义的异常类。例如: throw new IllegalArgumentException("参数错误"); throws用于在方法声明声明可能抛出的异常类,可以是Java内置的异常类,也可以是自定义的异常类。例如: public void readFile(String fileName) throws FileNotFoundException { // ... } 当方法可能会抛出异常时,需要在方法声明使用throws关键字声明可能抛出的异常类,以便调用该方法的代码能够正确处理异常。如果方法抛出了未声明的异常类,编译器会报错。 总之,throw用于抛出异常,而throws用于声明可能抛出的异常类。两者都是Java处理异常的重要关键字。 ### 回答2: 在Java,`throw`和`throws`是用于处理异常的关键字。 `throw`关键字用于手动抛出一个异常。当我们在程序遇到一个特殊情况,希望能够断程序的正常流程并抛出一个异常时,我们可以使用`throw`关键字。通过`throw`关键字,我们可以抛出任何类的异常,包括Java内置的异常类或自定义的异常类。例如,我们可以使用`throw`关键字抛出一个`NullPointerException`异常,当某个变量为空时。 `throws`关键字用于声明一个方法可能会抛出的异常。当我们定义一个方法时,如果该方法可能会产生一个或多个异常,但是不想在方法内部进行异常处理,我们可以使用`throws`关键字在方法的声明部分声明这些异常。使用`throws`关键字声明异常,意味着我们将该异常的处理责任交给该方法的调用者。在方法调用链的上层方法可以选择处理这些异常或者继续将其向上抛出。例如,我们可以使用`throws`关键字声明一个方法可能会抛出`IOException`异常,当方法涉及到文件读写操作时。 需要注意的是,使用`throw`或`throws`关键字都是会断方法的正常执行流程。一旦异常被抛出,并且没有在当前方法被处理,程序将会停止执行当前方法,继而去寻找当前方法的上层方法,看是否有合适的异常处理机制存在。 综上所述,`throw`关键字用于手动抛出异常,用来断程序的正常执行流程;而`throws`关键字用于声明方法可能会抛出的异常,将异常的处理责任交给方法的调用者。这两个关键字在Java异常处理起到了不可替代的作用。 ### 回答3: Java的"throw"和"throws"都与异常处理相关。 "throw"关键字用于手动抛出异常。它可以用于任何地方,例如在方法体内或在try-catch块使用throw关键字,我们可以将指定的异常抛给调用者,暗示方法可能会遇到特定的错误。 例如,我们可以使用throw关键字抛出一个自定义的异常: ```java public void divide(int dividend, int divisor) { if (divisor == 0) { throw new ArithmeticException("除数不能为零"); } int result = dividend / divisor; } ``` 在上面的例子,如果除数为零,我们抛出一个算术异常,并把"除数不能为零"作为异常消息。 另一方面,"throws"关键字用于在方法签名声明可能抛出的异常类。它告诉调用者该方法可能会引发指定的异常,需要在调用该方法时进行适当的异常处理。 例如,我们可以声明一个方法可能抛出未找到文件异常IOException: ```java public void readFile() throws IOException { // ... 读取文件的代码 ... } ``` 在这个例子,如果在读取文件时发生了IOException异常,该方法不会处理它,而是向调用者表明可能会出现这种异常。 总而言之,"throw"关键字用于手动抛出异常,而"throws"关键字用于在方法签名声明可能抛出的异常类。通过使用这两个关键字,我们可以更好地处理和传递异常,以保持程序的健壮性和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值