当前位置: 首页 > 知识库问答 >
问题:

Java编译器是否有方法返回路径检测问题[重复]

桑成荫
2023-03-14

由于我在html" target="_blank">编译器设计方面的研究,最近我开始用不同的语言编译器做一些实验,

我发现Java中发生了一件非常奇怪的事情

也就是说,您可能知道,如果我们有一个没有返回路径的方法,就不需要返回任何值

如果我有下一个方法,这完全可以,因为这是一个无限循环

   private int Run(){
        while (true){
        }
    }

但一旦我在任何地方,即使在不可能的条件下,在不可到达的区域,我却中断了语句

所以下一个java代码不会编译

  private int Run(){
        while (true){
            if(false){
             break;
            }
        }
    }

但与c相比#

 int Run()
    {
        while (true)
        {
            if (true == false)
            {
                break;
            }
        }
    }

或c

int Run() {
    while (true)
    {
        if (false) {
            break;
        }
    }
}

两者都可以很好地编译,即使是在c语言中#大多数重构工具都说代码是多余的,因为编译器最终会消除它,因为它是一个编译时常量

我认为这个问题在某种程度上与停顿问题有关,但无法确切找出问题所在。

所以如果有人知道java发生了什么,请告诉我,谢谢。

共有1个答案

杜俊楚
2023-03-14

如果代码

private int Run(){
    while (true){
        if(false){
             break;
        }
    }
}

是编译错误与否在Java语言规范中定义,特别是在第14章。块和语句。语句可以“正常完成”或“突然完成”。基于这些信息,其他语句的执行会受到影响。

第14.15章。打破语句定义打破语句将正常完成“打破目标”:

不带标签的中断语句试图将控制权转移到最里面的封闭开关dofor立即封闭方法或初始化程序的语句;此语句称为中断目标,然后立即正常完成。

还有第14.21章。不可达语句定义如下:

>

  • 如果以下至少一项为真,while语句可以正常完成:

    • while语句是可访问的,条件表达式不是值为true的常量表达式(§15.28)。
    • 有一个可达的中断语句退出while语句。

    (“iff”指“当且仅当”,如第14.21章所定义,并在https://en.wikipedia.org/wiki/If_and_only_if)

    在我们的例子中,第一个条件为false,因为我们有while循环的条件表达式true。请注意,本节定义了带有while(true){...}while循环没有任何中断语句将不会“正常完成”。

    现在,我们需要检查是否存在“可访问的”break语句。由于以下链,break语句是“可访问的”:

    • 可以访问作为构造函数、方法、实例初始值设定项或静态初始值设定项主体的块

    方法的{...}块。

    如果该块可达,则非交换块的非空块中的第一条语句是可达的。

    因此可以访问while循环。

    包含的语句是可达的,前提条件表达式不是值为false常量表达式。

    由于while循环是可访问的,并且条件表达式不是false,因此内部块{…} {…}中的if()语句 块再次可访问,因为它是可访问块中的第一条语句(见上文)。

    如果可以访问if-then语句,则可以访问then语句。

    <代码>{…}块是可访问的,该块的第一条语句也是可访问的(见上文)。

    请注意,在此分析编译器期间不会检查if()语句的条件(如第14.21章底部的非规范性部分所示)。

    整个“可达”检查意味着循环可以正常完成。这意味着方法的{...}块可以正常完成,参见第14.2章。块:

    如果所有这些块语句都正常完成,则块正常完成

    这意味着需要一个返回语句,如第8.4.7章所述。方法体定义它:

    如果一个方法被声明为具有返回类型(§8.4.5),那么如果该方法的主体可以正常完成(§14.1),则会发生编译时错误。

    因此,您需要一个return语句,即使您有一个break语句无法执行。但是有了可访问的break语句,一切都会改变。无论C#或C在做什么,这都是“java正在发生的事情”。

  •  类似资料:
    • 问题内容: 我想知道Java中是否有这样的方法。以以下代码段为例: 问题答案: 这涉及Java版本7及更早版本。 引用同一问题的好答案: 如果以后希望将其作为字符串返回,则可以调用getPath()。确实,如果您真的想模仿Path.Combine,则可以编写如下内容:

    • 我是一名新的程序员,正在学习Java入门课程。我的操作系统是Windows 10。大约4-5个月前,我们最初设置了类路径,从命令行运行了我们的“Hello World”程序,然后再也没有使用过它。 现在我们正在做一个输入/输出重定向到文件的练习,我必须忘记我的类路径是什么,所以我试图重新设置它。 我已经使用以下命令设置了我的类路径: 然后我尝试运行我的程序,它位于目录C:\Users\grant\

    • 我正在创建一个Java程序,在该程序中,我将文件上传到特定路径上的服务器。我将用于。 所以,在上传文件之前,我想检查给定的目录是否存在于服务器上。 如何检查路径是否存在? 注意:我正在客户端上执行代码,该客户端将检查服务器上是否存在远程目录。所以请不要建议使用。

    • 我正在皮尔逊我的编程实验室做一项学校作业,顺便说一句,这完全糟透了,我的程序没有输出。然而,在netbean上,我的应用程序是可靠的,编译并给出所需的输出。我浏览了论坛,发现了一个类似的问题,但修复建议对我的应用程序不起作用。 以下是作业: 设计一个名为Person的类,其中包含用于保存人名、地址和电话号码的字段(全部作为字符串)。编写一个构造函数来初始化所有这些值,以及每个字段的mutator和

    • 当我在vscode的集成终端中运行java程序时,完整的java路径显示为一大框文本。有没有什么办法可以把它带走? /library/java/javavirtualmachines/jdk-13.0.1.jdk/contents/home/bin/java--enable-preview-dfile.encoding=utf-8-cp“/users/myusername/library/appl

    • 问题内容: 我有两节课: MyApplication 库 该库已被编译为Library.class,并且源代码不再可用。我现在正在尝试从源代码编译MyApplication。MyApplication取决于库。该库的软件包名称为org.myCompany。我尝试将我的类路径设置为以下内容: 产生以下javac编译器错误消息: 所以我将类路径更改为: 产生完全相同的错误消息。 如何设置Windows