有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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块,那么代码就可以正常工作


共 (6) 个答案

  1. # 1 楼答案

    所有没有定义显式构造函数的Java对象都有一个隐式无参数构造函数,它在任何子类构造函数之前被调用

    问题是,由于对超级构造函数的调用不是子类构造函数中的第一条语句,JVM正在尝试调用超类的默认无参数构造函数,因为您在超类中创建了另一个构造函数,所以该构造函数不存在

    正如其他人所说,最简单的方法是删除try-catch——如果你只是抛出了异常,它不会给你带来任何好处

  2. # 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,这是

    1. rawtype-请阅读Generics
    2. 对于已过时的集合类型,请使用List。请阅读Collections
  3. # 3 楼答案

    为什么要捕获异常并再次抛出它?只需卸下try catch块

  4. # 4 楼答案

    Emma,因为异常声明构造函数调用必须是构造函数中的第一条语句,这意味着要在第一行调用基构造函数,并且不能在基构造函数之前放置其他语句

    为什么会出现这种行为,这很有趣,您的示例也解释了为什么没有这样的语句可以继续基类构造函数

    在你的例子中,如果你能把try语句放在super之前,那么你会捕获异常,什么也不做,BoundedLine的对象就会被创建,但是因为我们知道异常是从基类构造函数抛出的,所以所有的属性,基对象的值尚未创建,因此派生类的对象也应尚未初始化
    希望这解释了为什么没有行或代码可以继续基类构造函数

  5. # 5 楼答案

    如果对super的调用失败,则对象未正确创建。这将导致整个对象在理论上是未定义的(如果内存不足),因此在Java中是不允许的

  6. # 6 楼答案

    您可以在使用BoundedLine()时删除try and catch块,如果出现任何异常,它最终将由throws语句拾取。。您可以提到调用函数的catch异常

    希望它有用