Java:编写异常

时间:2013-04-29 12:20:49

标签: java error-handling

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

入门级:

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/

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

6 个答案:

答案 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

相关问题