java version "1.7.0_45"
您好
我正在构造函数中初始化类方法。但是,new URL(uploadUrl)
将在构造函数中引发异常。因此,如果发生这种情况,用户应该无法继续。由于构造函数无法返回任何内容,我想知道这是处理此问题的最佳方法吗?
非常感谢任何建议,
public class MultipleFileTransfer {
private static final String TAG = MultipartUtility.class.getSimpleName();
private DataOutputStream dataOutputStream;
private FileInputStream fileInputStream;
private HttpURLConnection httpURLConnection;
private URL url;
public MultipleFileTransfer(final String uploadUrl) {
dataOutputStream = null;
fileInputStream = null;
httpURLConnection = null;
try {
url = new URL(uploadUrl);
} catch (MalformedURLException e) {
Log.wtf(TAG, e.getMessage()); /* <-- How to handle a failure */
}
}
/* Factory method that initializes the class methods and returns the class object */
public static MultipleFileTransfer getInstance(final String uploadUrl) {
/* Check that a valid url has been entered correctly */
if(!URLUtil.isValidUrl(uploadUrl)) {
Log.wtf(TAG, "Invalid url: " + uploadUrl);
return null;
}
return new MultipleFileTransfer(uploadUrl);
}
}
答案 0 :(得分:5)
由于构造函数无法返回任何内容,我想知道这是处理此问题的最佳方法吗?
通常,允许异常直接传播给调用者,或者将其包装在您自己的更高级抽象异常中。 (在你的情况下,只是让它直接看起来更合适。)
public MultipleFileTransfer(final String uploadUrl) throws MalformedURLException {
// -------------------------------------------------^
dataOutputStream = null;
fileInputStream = null;
httpURLConnection = null;
url = new URL(uploadUrl);
}
由于您的实例在没有URL的情况下没用,因此构造失败是有意义的。
或者如果你想在构造函数中记录它(但如果它正在传播,通常任何记录,如果适当的话将由调用者处理):
// Logging and re-throwing, but probably not recommended
public MultipleFileTransfer(final String uploadUrl) throws MalformedURLException {
// -------------------------------------------------^
dataOutputStream = null;
fileInputStream = null;
httpURLConnection = null;
try {
url = new URL(uploadUrl);
} catch (MalformedURLException e) {
Log.wtf(TAG, e.getMessage());
throw e; // <== Rethrowing
}
}
答案 1 :(得分:3)
我能想出两种处理这种情况的好方法:
(1)让构造函数抛出异常。在记录之后重新抛出相同的异常,或者抛出不同的异常。如果它抛出的异常不是RuntimeException
(并且MalformedURLException
不是RuntimeException
),那么您需要在构造函数中添加throws
子句
(2)让构造函数无论如何创建一个对象,但将其标记为&#34;无效&#34;无法使用的对象。我添加了isValid()
或isInvalid()
方法,以便调用者可以查询它是否有效。如果他们在无效对象上调用,则其他方法应该抛出IllegalStateException
。
我不认为一个明显优于另一个。这取决于偏好,也可能取决于该计划其余部分的设计。