java如何访问try块中的参数?
我有一个类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);
}
我得到一个编译时错误: “类行中的构造函数行不能应用于给定类型; 必选:矢量,矢量;发现:没有论点;原因:实际参数列表和正式参数列表长度不同”
如果我删除了异常和try/catch块,那么代码就可以正常工作
# 1 楼答案
所有没有定义显式构造函数的Java对象都有一个隐式无参数构造函数,它在任何子类构造函数之前被调用
问题是,由于对超级构造函数的调用不是子类构造函数中的第一条语句,JVM正在尝试调用超类的默认无参数构造函数,因为您在超类中创建了另一个构造函数,所以该构造函数不存在
正如其他人所说,最简单的方法是删除try-catch——如果你只是抛出了异常,它不会给你带来任何好处
# 2 楼答案
如果声明
BoundedLine
构造函数throws Exception
,则无需捕获在任何情况下,对超类构造函数的调用必须是子类构造函数中的第一行
试试这个:
我还要补充一点,抛出
Exception
是一个很大的禁忌,因为您应该抛出一个特定的异常。JDK中已经有一个未经检查的IllegalArgumentException
,您可以使用它。如果您想要一个选中的异常,我建议您创建自己的异常此外,您正在使用
Vector
,这是List
。请阅读Collections# 3 楼答案
为什么要捕获异常并再次抛出它?只需卸下try catch块
# 4 楼答案
Emma,因为异常声明构造函数调用必须是构造函数中的第一条语句,这意味着要在第一行调用基构造函数,并且不能在基构造函数之前放置其他语句
为什么会出现这种行为,这很有趣,您的示例也解释了为什么没有这样的语句可以继续基类构造函数强>
在你的例子中,如果你能把try语句放在super之前,那么你会捕获异常,什么也不做,BoundedLine的对象就会被创建,但是因为我们知道异常是从基类构造函数抛出的,所以所有的属性,基对象的值尚未创建,因此派生类的对象也应尚未初始化
希望这解释了为什么没有行或代码可以继续基类构造函数
# 5 楼答案
如果对super的调用失败,则对象未正确创建。这将导致整个对象在理论上是未定义的(如果内存不足),因此在Java中是不允许的
# 6 楼答案
您可以在使用BoundedLine()时删除try and catch块,如果出现任何异常,它最终将由throws语句拾取。。您可以提到调用函数的catch异常
希望它有用