在方法内部throw异常,必须要同时在方法头部声明throws吗?

下面节选自类 JSONObject:

public String getString(String key) {
    this.verifyIsNull();
    Object o = this.get(key);
    if(o != null) {
        return o.toString();
    } else {
        throw new JSONException("JSONObject[" + JSONUtils.quote(key) + "] not    found.");
    }
}

以上直接抛出异常,而没有在方法头部声明throws。

但是我自己写的方法中,是同时有throw和throws的。去掉throws就会报错:

Unhundled Exception 。

这是为什么?

阅读 9.6k
2 个回答

java异常一般分为Checked异常和Runtime异常,所有RuntimeException类及其子类的实例被称为Runtime异常,不属于该范畴的异常则被称为CheckedException
Java认为Checked异常都是可以被处理的异常,所以Java程序必须显示处理Checked异常。如果程序没有处理Checked异常,该程序在编译时就会发生错误无法编译。
RuntimeException异常如果没有显示的捕获处理则由系统自动检测并将它们交给缺省的异常处理程序。
JSONException应该是RuntimeException的子类,可以不用显式的对它try...catch或者throws.如果没有对该异常的处理会交给jvm处理。
而你自己写的异常肯定是属于Checked异常,被认为是可以避免的异常,必须try...catch或者显式的抛出throws不然编译报错。如果你自定义的异常想像throw new JSONException这样处理,则你自定义的异常需要继承RuntimeException即可。

JSONException RuntimeException(继承) 是运行时异常 不用捕捉

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题