【问题标题】:How do I override a class method in Java and add a "throws" declaration to it?如何覆盖 Java 中的类方法并向其添加“抛出”声明?
【发布时间】:2011-01-12 03:17:39
【问题描述】:

在Android中是否有可能有一个“抛出”东西的AsyncTask?如果我不 @Override 该方法,它就不会被调用。如果我在末尾添加“抛出”,则会出现编译器错误。例如,我想做这样的事情:

class testThrows extends AsyncTask<String,Void,JSONObject> {
   @Override
   protected JSONTokener doInBackground(<String>... arguments) throws JSONException {
      String jsonString = arguments[0];
      JSONTokener json = new JSONTokener(jsonString);
      JSONObject object = json.getJSONObject("test");
      return object;
   }
}

json.getJSONObject 抛出 JSONException。有没有办法做到这一点?

【问题讨论】:

标签: java android overriding


【解决方案1】:

您需要做的是用运行时(未经检查的)异常(通常类似于IllegalArgumentException;或者如果没有与语义匹配,则为普通RuntimeException)包装异常,并将检查的异常指定为“根本原因”(通常作为构造函数参数)。

不,您不能扩大检查异常的范围:这将违反基本的 OO 原则,类似于您不能降低可见性(例如从公共到私有)。

【讨论】:

  • 不,请不要这样做。所有这一切都会使您的程序编译。它实际上不会使它工作。你需要告诉一些机构关于可以做些什么的异常。
  • 不,这是标准的做法,如果 (a) 你不能抛出已检查的异常并且 (b) 没有办法在该级别处理异常。当然,如果你能在那里处理它,那是最好的方法。由于任务接口的原因,这也可能是一些特殊情况。
  • time4tea,你的立场太绝对了。
【解决方案2】:

你不能重写和抛出更多的异常;您只能保持签名原样或抛出更少的异常。

你可以抛出未经检查的异常;那些不会改变方法签名。

【讨论】:

  • 你不想这样做。并不真地。那么异常会发生什么?它将消失在调用框架中,由谁知道如何处理。在这种情况下,您应该捕获无法抛出的异常,并通过侦听器将其报告给可以对其进行合理处理的人。
  • .NET 将未经检查的异常作为其标准。你说他们错了吗? Java 在其 API 中有未经检查的异常;你是说它们永远不应该被使用吗?我不会对应该做什么或不应该做什么做出价值判断;我只是指出可以做什么。
  • 我是说在 java 中未经检查的异常代表了不同类别的错误,并且当您使用它们时,您需要了解它们在语言上下文中的含义。在任何情况下,仅仅因为你能做某事很少意味着你应该....
  • 我想我们明白他们的意思。我不同意“很少”的部分。我再问一遍——.NET 使用未经检查的异常作为它们的默认值。你认为这种语言从根本上来说存在不可挽回的缺陷吗? (提示:答案是“不”。)
【解决方案3】:

你不能这样做。感谢 Time4Tea,我能够将回调方法添加到出现错误时调用的类。例如:

try {
   JSONTokener json = new JSONTokener(stringToJsonify);
   JSONObject object = json.getJSONObject("test");
} catch (JSONException e){
   onJsonException();
}

其中 onJsonException 是类回调方法。

【讨论】:

    【解决方案4】:

    您不能以这种方式覆盖方法。

    在您的情况下,解决方案是添加 try-catch 块并返回 false。您也可以在您的任务中添加String 字段并填写错误描述。然后就可以在onPostExecute()方法中使用了。

    【讨论】:

    • 这听起来不是让调用者处理错误的好方法。事实上,这听起来有点危险......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 2012-09-01
    相关资源
    最近更新 更多