什么时候应该宣布“投掷”,什么时候不宣布?

时间:2013-10-22 11:43:53

标签: java exception try-catch throw

我注意到,例如,这两个都在起作用:

public void func(int a) throws IllegalArgumentException {
    if(a < 0) 
        throw new IllegalArgumentException("a should be greater than 0.");
}

public void func(int a) {
    if(a < 0) 
        throw new IllegalArgumentException("a should be greater than 0.");
}

这让我问:

我什么时候应该宣布throws anException,什么时候不宣布,只是扔掉它而不宣布它?

7 个答案:

答案 0 :(得分:4)

必须始终在方法签名throws中写入已检查的例外。

如果例外 extend RuntimeException,您不必在方法名称中写throws,但强烈推荐它,因为它更清晰,并且会在方法的文件。

/**
 * @throws This won't appear if you don't write `throws` and this might
 * mislead the programmer.
 */
public void func(int a) throws IllegalArgumentException {
    if(a < 0) 
        throw new IllegalArgumentException("a should be greater than 0.");
}

答案 1 :(得分:2)

来自JLS section 11.2

  

Java编程语言要求程序包含   检查异常的处理程序,可能由执行a导致   方法或构造函数。对于每个已检查的异常,这是可能的   结果,方法(第8.4.6节)或构造函数的throws子句   (§8.8.5)必须提到该例外的类别或其中一个   该异常类的超类(第11.2.3节)。

如此简单,如果选中,则需要throws语句。如果您有Exception,并且它不是RuntimeException的子类,则会进行检查。

IllegalArgumentExceptionRuntimeException的子类,因此未经检查,您不需要在throws语句中声明它。对于大多数例外情况(IllegalArgumentExceptionNullPtrException等)都是如此,因为您无法合理地预期会轻易处理这些异常情况。

答案 2 :(得分:2)

抛出的美妙之处在于Exception会转换为Checked Exception,因此每当任何开发人员尝试使用第一种方法时,他都会被警告放置一个try-catch块,然后再调用签名中出现抛出的方法。 / p>

答案 3 :(得分:1)

检查异常时,编译器必须要么捕获异常,要么宣布抛出声明 查看this帖子,了解已检查与未检查的例外情况的比较。

答案 4 :(得分:1)

这是因为IllegalArgumentException extends RuntimeException。你不能在下面留下抛出条款。

public void func(int a) {
    if(a == 0) 
        throw new Exception("a should be greater than 0.");
}

答案 5 :(得分:1)

有许多技术答案 JLS第1.2节,检查异常等解释了它的使用。
但是你的问题

  

我什么时候应该宣布抛出一个异常,什么时候不抛出,抛出它而不声明它?

如果您的代码生成了一些明确的异常并抛出它,那么应该总是添加 throws子句,你应该生成文档,只需在函数上面写/ **这将为您生成文档标签。 这将帮助使用您的库或函数的所有其他用户,如果在调用此函数之前尚未初始化某些无效参数或某些值,则某些函数或构造函数必然会抛出异常。

示例

/**
 * 
 * @param filePath File path for the file which is to be read   
 * @throws FileNotFoundException In case there exists no file at specified location
 * @throws IllegalArgumentException In case when supplied string is null or whitespace
 */
public static void ReadFile(String filePath) throws FileNotFoundException, IllegalArgumentException 
{
    if(filePath == null || filePath == "")
     throw new IllegalArgumentException(" Invalid arguments are supplied ");
    File fil = new File(filePath);
    if(!fil.exists()|| fil.isDirectory())
        throw new FileNotFoundException(" No file exist at specified location " + filePath);
    //..... Rest of code to read file and perform necessay operation
}

此外,这些文档标记和抛出使程序员生活更轻松,他们将重用您的代码并且事先知道如果使用错误的参数调用函数或在指定位置无法使用文件,则抛出IllegalArgumentException,FileNotFoundException。 / p>

因此,如果您希望您的代码和函数具有自我解释性并提供所有必要的案例,那么会抛出异常,然后添加以下条款,否则它是您的选择。
请记住,如果您在30天之后使用(我相信您将来会重新使用它)那些功能那么它将会更有帮助您将完全了解那些我在该职能中做了什么。

答案 6 :(得分:0)

虽然您需要声明已检查的例外, 如果可以通过执行方法或构造函数抛出未经检查的异常,则不需要在方法或构造函数的throws子句中声明..来自 - http://docs.oracle.com/javase/7/docs/api/java/lang/RuntimeException.html