是否可以扩展已存在的类以抛出异常?例如,如果条目已存在,是否可以为以下代码创建例外? (我无法修改类,因此我需要扩展并且必须包含错误处理而不仅仅是显示消息..)
入门级:
public Entry(String paramString1, String paramString2, String paramString3, String paramString4, String paramString5)
{
this.firstName = paramString1;
this.lastName = paramString2;
this.street = paramString3;
this.town = paramString4;
if (paramString5.matches("[A-Z]{2}[0-9]{1,2} [0-9]{1,2}[A-Z]{2}")) {
this.postCode = paramString5;
} else {
System.err.printf("Bad postcode: '%s'\n", new Object[] { paramString5 });
this.postCode = "???";
}
}
AddressBook类:
public String add(Entry paramEntry)
{
if (paramEntry == null)
return "Error: null entry";
if (this.data.contains(paramEntry)) {
return "Error: this entry already in the book";
}
boolean bool = this.data.add(paramEntry);
if (bool) {
return " entry added";
}
return "entry could not be added";
}
我搜索了互联网,发现以下易于关注的网站: http://www.tutorialspoint.com/java/java_exceptions.htm http://www.c-sharpcorner.com/UploadFile/433c33/defining-your-own-exception-class-in-javacustom-exception/
这是我需要做的吗? (对不起,对不起)
答案 0 :(得分:2)
第一个问题你可能想问自己,“我真的想为此抛出异常吗?”。异常只应用于不应发生的事件,例如IOException
。我只想使用Validator
来验证用户输入。
答案 1 :(得分:1)
不,您不能覆盖类并向超类中不存在的签名添加(检查)异常。因此,您不能继承AddressBook
并覆盖add()
来声明新的已检查异常。在你的情况下,我甚至不建议覆盖add
方法,因为它从根本上是错误的恕我直言。从add
方法返回字符串(实质上是验证错误)不是我建议的。如果您确实想在这种情况下使用异常,则可以覆盖该方法并抛出RuntimeException
的实例。但它真的只是猪的口红。
答案 2 :(得分:1)
您可以尝试使用RunmeException的sume子类。
在这种情况下,父类的方法签名将保持不变,但您可以在子类中抛出此异常。
例如,异常代码:
public class MyException extends RuntimeException
{
public MyException(String message)
{
super(message);
}
}
然后是入门课程:
public Entry(String paramString1, String paramString2, String paramString3, String paramString4, String paramString5)
{
this.firstName = paramString1;
this.lastName = paramString2;
this.street = paramString3;
this.town = paramString4;
if (paramString5.matches("[A-Z]{2}[0-9]{1,2} [0-9]{1,2}[A-Z]{2}")) {
this.postCode = paramString5;
} else {
throw new MyException(String.format("Bad postcode: '%s'\n", new Object[] { paramString5 }));
}
}
您需要在某处处理异常:
try
{
/* create entry etc. */
}
catch(MyException e)
{
/* ... */
}
由于样本中的Entry和AddressBook都没有实际扩展,我认为你的Entry是一个子类。
可以用类似的方式更改AddressBook。
请注意,这是无法更改父类的解决方法。如果可以更改父类,我会使用已检查的异常。
答案 3 :(得分:0)
扩展类并覆盖所需方法后,您可以检查返回值或更新字段,以便在抛出异常时做出决定,例如:
public String add(Entry paramEntry) //overridden
{
String val = super.add(paramEntry); //call actual method
if(val.equals("entry could not be added")) //check for exception condition
throw new OperationException(val);//runtime exception
return val;
}
public class OperationException extends RuntimeException {
public OperationException() {
super();
}
public OperationException(String message, Throwable cause) {
super(message, cause);
}
public OperationException(String message){
super(message);
}
public OperationException(Throwable cause) {
super(cause);
}
}
答案 4 :(得分:0)
首先,扩展类与抛出异常无关。如果你想知道的是你是否可以抛出一个异常,其中super方法不会抛出任何异常,那么答案是否定的。how to override when exceptions are there
答案 5 :(得分:0)
扩展课程时,您需要遵守Liskov的替代原则。
具体地说,这意味着在用户可以使用Parent类型的对象的任何情况下,他也必须能够使用Child类型的对象。
显然,您会看到添加(已检查)异常会违反此规则。如果客户端类使用的是Parent类,则它没有throw子句,也没有try / catch用于您的异常。因此,如果他要与Child类交换,代码将变为无效。
所以,不,你不能。
你可以添加一个RuntimeException,但这仍然是一个坏主意。
请参阅http://en.wikipedia.org/wiki/Liskov_substitution_principle