1

在我的教科书中提到,每当你想立即结束一个 void 方法时,你可以引入 return;但是,我尝试在 eclipse 上实现它,它似乎不起作用。我试图在可变日结束该方法。我收到一条错误消息,指出我的其余代码无法访问。

public void readInput(){
    Scanner myKeyboard = new Scanner(System.in);
    System.out.println("Enter the day");
    day = myKeyboard.nextInt();
    return; //error is here
    System.out.println("Enter the year");
    year = myKeyboard.nextInt();
    System.out.println("Enter the month");
    month = myKeyboard.next();
}

我的教科书有没有忘记提到的东西!?

4

4 回答 4

10

在 Java 中,包含永远不可能执行的代码是非法的(因为这几乎总是一个错误)。在您的代码中,您return无条件地调用,然后您有额外的代码 - 这称为unreachable code,它会导致编译器错误。

方法中间的使用return是当你有条件的时候,比如

if(exitNow) { 
    return;
}

否则程序可能会继续执行剩余的代码。要对此进行测试,请尝试以下操作:

if(day == 0) {
    return;
}

正如@fdreger 提到的,JLS 明确指出,即使if语句的条件是编译时常量,编译器也会将条件视为if不确定(这仅适用于if,而不适用于dowhilefor循环),所以这将使您的代码编译:

if(true) {
    return;
}
于 2013-11-04T22:00:49.360 回答
5

您将在返回后立即在线路上收到一条错误消息,因为您永远无法到达那里。尝试类似:

if(some condition)
{
   return;
}
于 2013-11-04T22:01:03.720 回答
2

其他答案是正确且完整的- javac 不会编译无法访问的代码,因此您不能只将breakorthrow语句放在代码中间。但是,由于有时这正是您想要做的(例如,因为您正在测试某些东西),您可以从测试不是很彻底的事实中受益。这样的事情会做:

if (2+2==4) return;
于 2013-11-04T22:06:12.290 回答
0

错误信息是正确的。您的其余代码无法访问。特别是本节:

System.out.println("Enter the year");
year = myKeyboard.nextInt();
System.out.println("Enter the month");
month = myKeyboard.next();

它是“无法访问的”,因为 return 语句会导致它从函数中返回。

如果您希望在之后测试从该方法返回

day = myKeyboard.nextInt();

只需删除返回并注释掉其他部分。

public void readInput(){
    Scanner myKeyboard = new Scanner(System.in);
    System.out.println("Enter the day");
    day = myKeyboard.nextInt();
    // System.out.println("Enter the year");
    // year = myKeyboard.nextInt();
    // System.out.println("Enter the month");
    // month = myKeyboard.next();
}

或者完全删除它。我假设您想输入回报是因为您正在测试某些东西,或者还想在一年/一个月后进行。

于 2013-11-04T22:06:30.517 回答