0

创建一个IllegalDimensionException扩展类的新异常Exception类。它将有两个构造函数,一个默认值和一个显式值,它使用消息“您指定的图形的尺寸非法。

这似乎是这样做的正确方法吗?

public class IllegalDimensionException extends Exception {
    String message; //the message that will be used
    String Eplicitm = "Illegal dimension for the figure you specified";

    //constructor one
    public IllegalDimensionException (String m){
        m = message;
    }
     //constructor two
    public IllegalDimensionException(String E){
        E = Eplicitm;

    }
    public static void main(String[] args){
        return E;
    }

}

我无法创建两个构造函数而没有一个是无效的?关于如何让它正常工作的任何建议?

4

5 回答 5

0

也许像这样回答你的问题:

public IllegalDimensionException (String m) {
    super(m); // you may use the exception message member instead of defining yours
    message = m; 
}

public IllegalDimensionException(){
    this(Eplicitm);
}

因此,您确实有两个构造函数:一个具有默认值,一个具有自定义消息。如果这是您所期望的,Eplicitm 应该是一个常量(静态最终)。

于 2012-10-08T17:30:19.700 回答
0

可能是您正在寻找的。您要回答的问题不清楚,所以我不确定:

public final class IllegalDimensionException extends Exception {
  private static final String DEFAULT = 
      "Illegal dimension for the figure you specified";

  //constructor one
  public IllegalDimensionException(){
    super(DEFAULT);
  }

  //constructor two
  public IllegalDimensionException(String message){
    super(message);
  }
}

super()请注意将异常消息正确传递给超类的用法。

于 2012-10-08T17:30:24.243 回答
0

构造函数不应该有返回类型,所以你的第二个“构造函数”实际上不是构造函数,而是一个名称类似构造函数的方法。我想知道为什么它没有给你任何错误,因为你没有从这里返回任何东西。如果你只是从第二个中删除 void ,它将不起作用,因为两个构造函数都会有相同类型的争论,所以不会被过度构造函数,而是重复。在这种情况下,您将再次收到错误。请查看此链接以获得您问题的真正答案,如何在 Java 中定义自定义异常类,最简单的方法?

于 2012-10-08T17:23:58.587 回答
0

它将有两个构造函数,一个默认值和一个显式值,它使用消息“您指定的图形的尺寸非法。

听起来您的两个构造函数真正需要的是一个默认(无参数)以及一个接受String参数的构造函数。例如,

public IllegalDimensionException() {
    super(Eplicitm);
}

public IllegalDimensionException(String m) {
    message = m;
}

默认构造函数中的super()调用将调用Exception的构造函数,它接受 a String,并将你的传递Eplicitm给它。

但是,您在上面的代码片段的逻辑中存在几个基本缺陷,我想向您指出:

  1. 您不能为构造函数指定额外的返回类型(就像在“构造函数二”中所做的那样public void IllegalDimensionException)。这是因为IllegalDimensionException本质上返回类型,因为您正在使用它创建对象的新实例。您上面的签名将改为创建一个名为的新方法IllegalDimensionException,该方法返回void并且必须由此异常的实例调用......因此您实际上创建了一个名称过于复杂(且格式错误)的 setter 方法。

  2. Exception拥有一个main(String[])方法是没有意义的。Amain()本质上是整个程序的启动,而 an是Exception程序中出现问题时创建的东西。当您创建更复杂的项目时,您将希望使每个类的功能从根本上保持独立、独特和合乎逻辑。

  3. 应将诸如默认值之类的常量声明为private static final. 正如您的代码所代表的那样,任何可以获取您的实例的代码都可以IllegalDimensionException通过简单地调用来更改默认消息theException.Eplicitm = "Yo yo yo, wassup."。不是很有帮助的错误信息。这是因为变量的默认隐私是public. 幸运的是,您还没有声明它static,所以这样的更改只会影响异常的一个实例......但是更好的做法是在创建的所有可能的异常中只有一个不可变的版本。

  4. 变量名应采用驼峰式 ( variableName),而类名应以大写字母 ( ) 开头MyClass。常量应全部大写,下划线 ( MY_CONSTANT_VALUE) 分隔。

上面的一些可能听起来很挑剔,但事实并非如此。以上所有内容要么关闭代码​​中的漏洞(其中一些非常危险),要么使您的代码更具可读性(您会发现这是一个很大的好处 - 因为即使您也会忘记为什么您写了一些部分三个月后你回去看它的代码)。例如,我确信我不是唯一一个花了一段时间才弄清楚你的意思的专业程序员Eplicitm(除了拼写),因为它看起来像一个复杂的自定义对象的名称......不是String

于 2012-10-08T17:42:02.063 回答
0

任何两个构造函数(或与此相关的任何方法)都必须具有不同的方法指纹(又名签名)。指纹包括:

  • 方法名称
  • 方法返回类型
  • 方法参数(按类型)

您正在尝试创建两个具有相同指纹的构造函数,这是不允许的。毕竟,编译器怎么知道你试图调用哪个方法呢?

作为旁注;您的代码毫无意义:

public IllegalDimensionException (String m){
    m = message;
}

从字面上看没有任何效果,您正在m用您的实例变量覆盖局部变量的值message......我只能假设您打算以相反的方式执行此操作?

于 2012-10-08T17:27:13.857 回答