我有一个类Line
,它将两个点(以矢量形式给出)作为参数,并模拟它们之间传递的无限线。第二类BoundedLine
采用两点并模拟连接它们的有限线。
Line
如果两个点相同则抛出异常,这意味着BoundedLine
中对超级构造函数的调用需要包装在try catch块中。不幸的是,似乎try块内没有参数;我将如何访问它们?
// Constructor in Line
public Line (Vector start, Vector end) throws Exception {
if (start.equals (end)) {
throw new Exception ( "Points are the same" );
}
else {
this.start = start;
this.end = end;
modelLine (start, end);
}
}
// Constructor in BoundedLine
public BoundedLine (Vector start, Vector end) throws Exception {
try {
super (start, end);
}
catch (Exception e) {
throw e;
}
applyBoundaries (start, end);
}
我的编译时错误是: "构造函数Line中的Line不能应用于给定的类型; 必需:矢量,矢量;发现:没有争论;原因:实际和正式的参数列表长度不同"。
如果我删除了异常和try / catch块,那么代码工作正常。
答案 0 :(得分:2)
如果您声明BoundedLine
构造函数throws Exception
无需捕获。
在任何情况下,对超类构造函数的调用必须是子类构造函数中的第一行。
试试这个:
public BoundedLine (Vector start, Vector end) throws Exception {
super (start, end);
applyBoundaries (start, end);
}
我还要补充一点,抛出Exception
是一个很大的禁忌,因为你应该抛出一个特定的异常。您可以使用JDK中已经未经检查的IllegalArgumentException
。如果您想要检查异常,我建议您创建自己的异常。
public Line (final Vector start, final Vector end) {
if (start.equals (end)) {
throw new IllegalArgumentException( "Points are the same" );
}
this.start = start;
this.end = end;
modelLine (start, end);
}
此外,您使用的是Vector
List
。请阅读Collections 答案 1 :(得分:1)
为什么你会抓住Exception并再次扔掉它?只需删除try catch块。
答案 2 :(得分:1)
你可以在使用BoundedLine()时删除try和catch块,如果发生任何异常,它最终会被throws语句选中。你可以提到捕获调用函数的异常。
希望它有用。
答案 3 :(得分:1)
如果对super的调用失败,则无法正确创建Object。这将导致整个Object在理论上未定义(如果i.E.内存不足),因此Java中不允许这样做。
答案 4 :(得分:1)
为什么会出现这种行为,有趣的是,您的示例也解释了为什么没有这样的语句可以继续基类构造函数。
在您的示例中,如果您能够在super之前放置try语句,那么您将捕获异常并且什么都不做,并且BoundedLine的对象将被创建但是因为我们知道异常已经从基类构造函数抛出所以所有属性,基础对象的值尚未创建,因此派生类的对象也应该没有初始化。
希望这能解释为什么没有行或代码可以继续进行基类构造。
答案 5 :(得分:1)
没有定义显式构造函数的所有Java对象都有一个隐式的无参数构造函数,它在任何子类构造函数之前被调用。
问题在于,由于对超级构造函数的调用不是子类构造函数中的第一个语句,因此JVM正在尝试调用超类的默认无参数构造函数,该构造函数不存在,因为您已经存在在超类中创建了另一个构造函数。
正如其他人所说的那样,最容易做的就是删除尝试捕获 - 如果你只是重新抛出异常,它就不会给你买任何东西。