0

是否可以扩展已经存在的类以引发异常?例如,如果条目已经存在,是否可以为以下代码创建异常?(我无法修改类,因此我需要扩展并且必须包含错误处理,而不仅仅是显示消息..)

入职类:

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 = "???";
    }
  }

地址簿类:

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 -java中的异常类自定义异常/

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

4

6 回答 6

2

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

于 2013-04-29T12:25:13.217 回答
1

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

于 2013-04-29T12:31:40.997 回答
1

您可以尝试使用 RuntimeException 的 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 是一个子类。

可以以类似的方式更改地址簿。

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

于 2013-04-29T12:40:32.723 回答
0

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

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

显然,您会看到添加(已检查)异常违反了这一点。如果客户端类正在使用 Parent 类,则它没有 throw 子句,也没有针对您的异常的 try/catch。因此,如果他要与 Child 类交换,代码将变得无效。

所以,不,你不能。

您可以添加一个 RuntimeException,但这仍然不是一个好主意。

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

于 2013-04-29T12:47:06.067 回答
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);
    }
}
于 2013-04-29T12:30:38.910 回答
0

首先扩展类与抛出异常无关。如果您想知道是否可以在超级方法不抛出任何异常的情况下抛出异常,那么答案是否定的。出现异常时如何覆盖

于 2013-04-29T12:36:58.187 回答