2013-04-29 129 views
0

是否可以扩展已存在的类以抛出异常?例如,如果条目已经存在,是否可以为以下代码创建一个例外? (我不能因此修改类,为什么我需要延长,并必须包括错误处理,而不是仅仅显示消息..)Java:写例外

Entry类:

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/

这是我需要做的吗? (java新对不起)

回答

2

第一个问题,你可能想问问自己,'我真的想为此抛出异常吗?'。一个例外只能用于不应该发生的事件,如IOException。我只会使用Validator来验证用户输入。

+1

的确如此。例外情况仅适用于特殊情况。无效的用户输入应通过正确验证来处理。 – Kai 2013-04-29 12:27:14

+0

但是有一个约束,父类不能改变(及其方法的签名),因此没有地方可以从验证器添加返回值(没有将它包装成未经检查的异常) – denis 2013-04-30 20:31:21

+0

好的抛出异常也会导致更改。例如。 '抛出异常'。这只是双重标准的推理。 – Aquillo 2013-04-30 20:52:32

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); 
    } 
} 
1

不,你不能覆盖类,并添加(检查)超级类中不存在的签名的例外情况。因此,您不能继承AddressBook并覆盖add()来声明新的检查异常。在你的情况下,我甚至不会建议覆盖add方法,因为它从根本上是错误的恕我直言。从add方法返回一个字符串(实质上是一个验证错误)不是我会推荐的。如果你真的想在这种情况下使用异常,你可以重写该方法并抛出一个RuntimeException的实例。但它真的只是对猪的口红。

+0

你说得对,谢谢你用我的答案指出问题。我已经删除了它:)是的,你不能在一个覆盖中引入检查的异常,我忘记了这一点。 :)为你+1。 – Jops 2013-04-30 03:56:43

0

首先,扩展类与抛出异常无关。如果你想知道的是你是否可以抛出一个异常,如果超级方法不抛出任何异常,那么答案是否定的。 how to override when exceptions are there

+0

分类为true。您始终可以抛出未经检查的异常 - Error或RuntimeException的子类。 – emory 2013-04-29 13:20:00

1

您可以尝试使用RuntimeException的sume子类。

在这种情况下,父类的方法签名将保持不变,但您可以在子类中引发此异常。

例如,异常代码:

public class MyException extends RuntimeException 
{ 
    public MyException(String message) 
    { 
     super(message); 
    } 
} 

然后Entry类:

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可以用类似的方法改变。

请注意,这是您无法更改父类的解决方法。如果可以更改父类,我会使用检查的异常。

0

当你扩展一个类时,你需要遵守Liskov的替代原则。

具体而言,这意味着在用户可以使用Parent类型的对象的任何情况下,他也必须能够使用Child类型的对象。

很明显你会看到添加一个(选中的)异常违反了这一点。如果客户端类正在使用Parent类,那么它没有throw子句,也没有针对您的异常的try/catch。因此,如果他要与Child类交换,代码将会失效。

所以,不,你不能。

您可以添加一个RuntimeException,但它仍然是一个坏主意。

参见http://en.wikipedia.org/wiki/Liskov_substitution_principle