1

在 C# .NET 领域呆了很长时间后,我将回到 Java (Android),并试图记住各种特质。

让我陷入困境的一个是这个;如果我的类未能正确初始化,我将在构造函数中抛出异常,如下所示:

    // Constructor
    public CountdownDictionary(JSONArray jsValues, ArrayList<String> returnFieldList)
{
    this.DictionaryType = getDictionaryTypeFromValues(jsValues);
    if (this.DictionaryType == CountdownDictionaryTypes.Unknown)
    {
        throw new Exception("Unknown dictionary type");
    }
}

Eclipse 给出编译时错误

未处理的异常类型Exception

这让我很困惑;因为我该如何处理异常?我不想处理此类中的异常,我希望它不被处理,以便它冒泡到调用者并且他们可以处理它!

我错过了什么?

4

9 回答 9

4

您在构造函数中抛出异常,但没有在方法签名中指定 throws 子句,这是编译时错误,这就是 eclipse 抱怨的原因。以下代码段将解决该问题。

 public CountdownDictionary(JSONArray jsValues, ArrayList<String> returnFieldList) throws Exception
于 2012-07-10T18:39:58.373 回答
2

在方法构造函数throws的头部添加子句:

public CountdownDictionary(JSONArray jsValues, ArrayList<String> returnFieldList) throws Exception
于 2012-07-10T18:40:12.273 回答
2

您需要通过附加到您的方法签名来指示您的构造函数可以抛出异常的编译器throws Exception,因此任何调用者都知道他们必须处理它。

于 2012-07-10T18:43:10.100 回答
2

另一种选择是抛出运行时异常而不是检查异常——尽管这取决于此异常是否仅由于程序员错误而引发。

如果不是程序员错误,通常是在构造函数中抛出异常的错误调用。只抛出异常类型的异常通常也是一个糟糕的调用。这是因为您应该在更高级别提供特定于应用程序的行为来处理这种不良行为。

于 2012-07-10T18:43:30.360 回答
1

只需throws Exception在您的左大括号之前添加。

于 2012-07-10T18:40:28.890 回答
1

如果您希望Exception由调用方法处理,请使用:

public CountdownDictionary(JSONArray jsValues, ArrayList<String> returnFieldList) throws Exception {
    // ...
}

这样,此方法显示为抛出Exception并强制任何调用代码处理它。

于 2012-07-10T18:40:33.017 回答
1

以下行:throw new Exception("Unknown dictionary type");抛出一个在程序中任何地方都没有被捕获的异常。

相反,请执行以下操作:

try {
    throw new Exception("Unknown dictionary type");
}catch(Exception e) {
    e.printStackTrace();
}

或者

public CountdownDictionary(JSONArray jsValues, ArrayList<String> returnFieldList) throws Exception 
于 2012-07-10T18:41:18.170 回答
0

试试这个...

我通常使用它并记住如下:

投掷和投掷的结合。

该方法抛出错误的异常

在条件内部,它会抛出新的异常对象。

例如:

public CountdownDictionary(JSONArray jsValues, ArrayList<String> returnFieldList) throws Exception
{
    this.DictionaryType = getDictionaryTypeFromValues(jsValues);
    if (this.DictionaryType == CountdownDictionaryTypes.Unknown)
    {
        throw new Exception("Unknown dictionary type");
    }
}
于 2012-07-10T18:49:44.057 回答
0

我会这样做:

// Constructor
public CountdownDictionary(JSONArray jsValues, List<String> returnFieldList)
{
    if (jsValues == null) {
        throw new IllegalArgumentException("JSON array cannot be null");
    }
    if (returnFieldList == null) {
        throw new IllegalArgumentException("Return field list cannot be null");
    }
    this.DictionaryType = getDictionaryTypeFromValues(jsValues);
    if (this.DictionaryType == CountdownDictionaryTypes.Unknown)
    {
        throw new IllegalArgumentException("Unknown dictionary type");
    }
}

不需要 throws 子句,因为它是未经检查的异常。

于 2012-07-10T19:24:10.043 回答