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
上写入实例字段消息
。没错,我只是复制了第一个构造函数的代码。我更新了它。