新的异常类是extends异常类,有两个构造函数

时间:2012-10-08 17:20:40

标签: java exception custom-exceptions

创建一个扩展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;
    }

}

我在创建两个没有一个构造函数的构造函数时遇到了麻烦吗?有关如何使其正确工作的任何建议吗?

5 个答案:

答案 0 :(得分:0)

构造函数不应该有返回类型,所以你的第二个“构造函数”实际上不是构造函数,而是一个像name这样的构造函数的方法。我想知道为什么它没有给你任何错误,因为你没有从这里返回任何东西。 如果你只是从第二个中移除void,它将无法工作,因为两个构造函数将具有相同类型的争论,因此不会是重叠的consturctor,而是重复。在这种情况下,您将再次收到错误。 请查看此链接以获取问题的真实答案How to define custom exception class in Java, the easiest way?

答案 1 :(得分:0)

任何两个构造函数(或任何相关方法)必须具有不同的方法指纹(即签名)。指纹由;

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

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

作为旁注;你的代码没什么意义:

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

实际上没有效果,你用你的实例变量m覆盖你的局部变量message的值......我只能假设你的意思是反过来这样做?< / p>

答案 2 :(得分: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应该是一个常数(静态最终)。

答案 3 :(得分: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()将异常消息正确传递给超类。

答案 4 :(得分:0)

  

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

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

public IllegalDimensionException() {
    super(Eplicitm);
}

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

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

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

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

  2. Exception使用main(String[])方法没有意义。 main()基本上是整个程序的开始,而Exception是在 程序中出现错误时创建的。当您创建更复杂的项目时,您将希望保持每个类的功能从根本上分离,区分和逻辑。

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

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

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