【问题标题】:Why cant I use return statement in try block [duplicate]为什么我不能在 try 块中使用 return 语句[重复]
【发布时间】:2018-02-28 03:40:02
【问题描述】:

这里给出错误,因为即使 userCreationDao 中的 registerUser 返回 Integer 本身,方法也必须返回 Integer。

public Integer registerUser(User user) {
    try{
        return userCreationDao.registerUser(user);
    } catch(Exception e){
        e.printStackTrace();
    }
}

【问题讨论】:

  • 看起来很简单。在您的 catch 中,您不会返回整数。你必须退回一个。如果catch 触发器发生异常,则会跳过原始的return
  • 等等...这个方法在 userCreationDao 是一个实例的类中吗?

标签: java


【解决方案1】:

原因是,如果您在 try 块中写入某些内容,则它是特定/仅限于尝试块的,即如果您在 try 块内初始化变量,则不能在其范围之外使用它。下面的代码会导致编译时错误。

public static void main(String[] args) {
    // TODO Auto-generated method stub
    try{
        int a=10;
    }catch(Exception e){
        System.out.println(e);
    }
    System.out.println(a);
}

以类似的方式,如果您在 try 块中返回某些内容,则其范围仅限于 try 块,但必须在方法级别。

想象一个例子,你在 try 块中的 return 语句之前写了一些东西,如下所示:

 public Integer registerUser(User user) {
        try{
         // some code
            return userCreationDao.registerUser(user);
        } catch(Exception e){
            e.printStackTrace();
        }
    }

如果//some code 导致错误,则会在异常中处理。然后??代码在哪里?它已经过了 return 语句,它无处可去。这就是您的代码另有说明的原因。

替代流程是,您需要在 catch 块中有另一个 return 语句,因此返回将在方法级别,因为代码将从 @ 返回987654331@

为什么我不能在 try 块中使用 return 语句

您可以在try 块内使用return 语句,但您也必须在try 块外放置另一个return。

public class tryBloc {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println(sayHello(false));
    }

    public static boolean sayHello(boolean i){
        try{
            if(i)
            return true;
        }catch(Exception e){
            System.out.println(e);
        }
        return false;
    }

}

如果你在调用 sayHello 方法时传递了true,它将从try 块返回。

return 语句必须在方法级别,而不是在任何其他特定级别。

【讨论】:

  • 方法只需要总是返回一些东西或抛出,这并不意味着返回必须在方法级别。 return 可以在 try 块和 catch 块中,在 try-catch 块之外没有 return
  • 嗨@Piro,即使我们在 try 和 catch 中都有 return,它也是一个错误。在我的例子中,如果你在 catch 块中重写 return false,它会抛出一个错误。试一试
  • 是的,因为只有在达到条件时才会返回。但这并不意味着您通常需要在 try-catch 之外返回。您可以在 if(i) return true; 之后再次返回并在 catch 块中返回
  • @Piro ,正确,如果它在 try 和 catch 中,那么它在方法范围内,因为它要么从 try/catch 返回。
  • @Piro,替代流程,即在解决方案中提到了在 catch 块中添加 return 语句
【解决方案2】:

即使发生异常,也可以修改方法返回值。

 public Integer registerUser(User user) {
int value =-1;
try{
    value=userCreationDao.registerUser(user);
} catch(Exception e){
    e.printStackTrace();
}
return value;

}

【讨论】:

    【解决方案3】:

    你需要做这两件事之一,因为如果抛出异常,你的方法永远不会返回值。

    public Integer registerUser(User user) {
        try{
            return userCreationDao.registerUser(user);
        } catch(Exception e){
            e.printStackTrace();
            return null;
        }
    }
    

    public Integer registerUser(User user) {
        try{
            return userCreationDao.registerUser(user);
        } catch(Exception e){
            e.printStackTrace();
        }
        return null;
    }
    

    【讨论】:

    • 你需要做这两件事中的一件……不,有很多替代品,包括throw null;return 1;while (true);。跨度>
    猜你喜欢
    • 2011-12-21
    • 2015-05-15
    • 2019-04-07
    • 2019-12-21
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    • 2018-02-12
    • 1970-01-01
    相关资源
    最近更新 更多