Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 新的异常类扩展了异常类并有两个构造函数_Java_Exception_Custom Exceptions - Fatal编程技术网

Java 新的异常类扩展了异常类并有两个构造函数

Java 新的异常类扩展了异常类并有两个构造函数,java,exception,custom-exceptions,Java,Exception,Custom Exceptions,创建一个新的异常类IllegalDimensionException,它扩展了exception类。它将有两个构造函数,一个是默认值,另一个是显式值,它使用消息“对于您指定的图形,维度非法” 这似乎是正确的方法吗 public class IllegalDimensionException extends Exception { String message; //the message that will be used String Eplicitm = "Illegal d

创建一个新的异常类
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;
    }

}

我在创建两个构造函数时遇到了问题,但没有一个是空的?关于如何使其正确工作,有什么建议吗???

构造函数不应该有返回类型,所以您的第二个“构造函数”“实际上不是构造函数,而是具有类似构造函数名称的方法。我想知道为什么它没有给你任何错误,因为你没有从这里返回任何东西。 如果您只是从第二个构造函数中删除void,那么它将不起作用,因为两个构造函数都将具有相同类型的参数,因此不会覆盖constructor,而是重复的。在这种情况下,您将再次出现错误。 请查看此链接以获得问题的真正答案,

任何两个构造函数(或任何方法)必须具有不同的方法指纹(也称为签名)。指纹包括:

  • 方法名
  • 方法返回类型
  • 方法参数(按类型)
您正在尝试创建两个具有相同指纹的构造函数,这是不允许的。毕竟,编译器如何知道您试图调用哪个方法

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

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

实际上没有任何效果,您正在用实例变量
message
覆盖局部变量
m
的值。我只能假设您打算以另一种方式执行此操作?

可能类似于此回答您的问题:

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

public IllegalDimensionException(){
    this(Eplicitm);
}
因此,您实际上有两个构造函数:一个具有默认值,另一个具有自定义消息。 如果这是您所期望的,那么Eplicitm应该是一个常量(静态final)。

这可能就是您所寻找的。你回答的问题不清楚,所以我不确定:

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()
将异常消息正确传递给super类

它将有两个构造函数,一个是默认值,另一个是显式值,它使用消息“对于您指定的图形,维度非法”

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

public IllegalDimensionException() {
    super(Eplicitm);
}

public IllegalDimensionException(String m) {
    message = m;
}
默认构造函数中的
super()
调用将调用
Exception
的构造函数,该构造函数接受
字符串
,并将
Eplicitm
传递给它

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

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

  • 对于
    异常
    来说,拥有
    main(String[])
    方法是没有意义的本质上是整个程序的启动,而
    异常是当程序中出现错误时创建的。当您创建更复杂的项目时,您将希望每个类的功能基本上保持独立、不同和逻辑性

  • 诸如默认值之类的常量应声明为
    private static final
    。根据您的代码,任何可以获取
    IllegalDimensionException
    实例的代码都可以通过调用
    theException.Eplicitm=“Yo-Yo-Yo,wassup”更改默认消息。“
    。这不是一条非常有用的错误消息。这是因为变量的默认隐私是
    public
    。幸运的是,您还没有将其声明为static,因此这样的更改只会影响异常的一个实例。。。但更好的做法是,在创建的所有可能的异常中,只有一个不可变的版本

  • 变量名应采用驼峰格式(
    variableName
    ),而类名应以所有大写字母开头(
    MyClass
    )。常量应全部大写,并以分隔符作为下划线(
    MY\u CONSTANT\u VALUE


  • 上面提到的一些可能听起来有点吹毛求疵,但事实并非如此。以上所有这些要么弥补了代码中的漏洞(其中一些相当危险),要么使代码更具可读性(你会发现这是一个很大的好处——因为即使你在三个月后回头看代码时,也会忘记为什么要写代码的某些部分)。例如,我确信我不是唯一一个花了一段时间才明白您所说的
    Eplicitm
    (除了拼写)是什么意思的专业程序员,因为它看起来像一个复杂的自定义对象的名称。。。不是
    字符串

    你回答的例外问题几乎没有意义。你能确保你从任何一本书/讲座中正确地复制了它吗?这不是你实现自定义异常的方式(调用
    super()
    ?)。此外,您还在参数
    m
    上写入实例字段
    消息
    。没错,我只是复制了第一个构造函数的代码。我更新了它。