我在C#.NET -land中经过很长一段时间后回到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发出编译时错误
未处理的异常类型异常
这令我感到困惑;既然如何处理异常呢?我不希望想要来处理这个类中的异常,我希望它不被处理,以便它可以冒泡到调用者并且可以处理它!
我错过了什么?
答案 0 :(得分:4)
你在构造函数中抛出异常,但没有在方法签名中指定throws子句,这是编译时错误,这就是eclipse抱怨的原因。以下代码段将解决此问题。
public CountdownDictionary(JSONArray jsValues, ArrayList<String> returnFieldList) throws Exception
答案 1 :(得分:2)
将throws
子句添加到方法构造函数的标题中:
public CountdownDictionary(JSONArray jsValues, ArrayList<String> returnFieldList) throws Exception
答案 2 :(得分:2)
您需要通过将throws Exception
附加到方法签名来指示构造函数可以抛出异常的编译器,因此任何调用者都知道他们必须处理它。
答案 3 :(得分:2)
另一个选项是抛出运行时异常而不是检查异常 - 尽管这取决于是否只会因程序员错误而抛出此异常。
如果它不是程序员错误它通常是一个错误的调用在构造函数中抛出异常。通常只是抛出异常类型的异常,这通常是一个糟糕的调用。这是因为您应该在更高级别提供特定于应用程序的行为来处理这种不良行为。
答案 4 :(得分:1)
只需在左大括号前添加throws Exception
。
答案 5 :(得分:1)
如果您希望调用方法处理Exception
,请使用:
public CountdownDictionary(JSONArray jsValues, ArrayList<String> returnFieldList) throws Exception {
// ...
}
这样,这个方法会抛出Exception
并强制任何调用代码来处理它。
答案 6 :(得分: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
答案 7 :(得分: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");
}
}
答案 8 :(得分: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子句,因为它是一个未经检查的异常。