java编译中的意外错误顺序

     2023-03-30     279

关键词:

【中文标题】java编译中的意外错误顺序【英文标题】:Unexpected order of errors in java compilation 【发布时间】:2015-06-29 18:07:25 【问题描述】:

在在线解决挑战时,我观察到 java 的以下行为,我觉得有点奇怪。我首先按照以下大纲编译了一个程序:

import java.io.*;

class WeirdJava

    public static void main (String[] args) 
    
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String input = br.readLine();
        HashMap<Integer, Integer> map = new HashMap<Integer,Integer>();
        System.out.println("Weird Java");
    

注意,在上面的程序中,有两个错误:

我没有处理BufferedReader 可能抛出的异常。 我没有导入包含HashMap 的标准util 库。

现在,当我尝试编译上述程序时,java 编译器给出了找不到符号HashMap 的错误。请注意,涉及HashMap 的声明位于BufferedReader 之后。接下来,我将以下导入语句添加到程序中:

import java.util.HashMap;

当我再次编译程序时,这次编译器显示错误

未报告的异常IOException;必须被抓获或被宣布为 扔了

我的问题:

    为什么在之前的编译尝试中没有抛出这个错误? 编译错误出现的顺序似乎不自然。在这个例程中发挥作用的编译器设计原则是什么?

【问题讨论】:

【参考方案1】:

这只是编译器检查源代码的顺序。特别是,编译器会在检查调用可能引发检查异常的方法的代码之前检查导入并解析它们。

如果您使用-verbose 运行javac,您会注意到编译器会加载导入的类,在本例中为BufferedReaderInputStreamReader,然后它会加载公共API 类,如Object 和@987654328 @:

[loading ZipFileIndexFileObject[C:\Dev\Java\jdk1.7.0_75\lib\ct.sym(META-INF/sym/rt.jar/java/io/BufferedReader.class)]]
[loading ZipFileIndexFileObject[C:\Dev\Java\jdk1.7.0_75\lib\ct.sym(META-INF/sym/rt.jar/java/io/InputStreamReader.class)]
]    
[loading ZipFileIndexFileObject[C:\Dev\Java\jdk1.7.0_75\lib\ct.sym(META-INF/sym/rt.jar/java/lang/Object.class)]]
[loading ZipFileIndexFileObject[C:\Dev\Java\jdk1.7.0_75\lib\ct.sym(META-INF/sym/rt.jar/java/lang/String.class)]]
[checking test.Test]
[loading ZipFileIndexFileObject[C:\Dev\Java\jdk1.7.0_75\lib\ct.sym(META-INF/sym/rt.jar/java/lang/AutoCloseable.class)]]
[loading ZipFileIndexFileObject[C:\Dev\Java\jdk1.7.0_75\lib\ct.sym(META-INF/sym/rt.jar/java/lang/System.class)]]
[loading ZipFileIndexFileObject[C:\Dev\Java\jdk1.7.0_75\lib\ct.sym(META-INF/sym/rt.jar/java/io/InputStream.class)]]
[loading ZipFileIndexFileObject[C:\Dev\Java\jdk1.7.0_75\lib\ct.sym(META-INF/sym/rt.jar/java/io/Reader.class)]]
Test.java:11: error: cannot find symbol
    HashMap<Integer, Integer> map = new HashMap<Integer,Integer>();

通过查看this link 中的概述,加载使用的类本身是称为“Parse and Enter”的第一阶段编译的一部分:

每棵树都被传递给 Enter,它会将遇到的所有定义的符号输入到符号中。这必须在分析可能引用这些符号的树之前完成。此阶段的输出是一个待办事项列表,其中包含需要分析并生成类文件的树。

【讨论】:

为什么编译器不告诉这个 pass 本身的未捕获异常? @Bhoot 我能想到的唯一原因是它还没有达到检查未捕获异常的阶段。遇到没有导入的类型时立即返回。 我不同意这个理由,但似乎不自然。我将欣赏任何涉及该主题(或与之相关的任何内容)的文献。 @Bhoot 这是关于编译阶段的overview。 感谢您的链接。我现在不接受你的回答,因为我还不满意。仍然需要进行一些挖掘工作。

jsp中java代码htmlcssjs的运行顺序是?

  jsp中是先编译“java代码”为静态代码,之后从代码第一行开始一直扫描到到代码最后一行;  jsp是可以动态加载的,也就是说jsp变更不需要重启项目,如果里面有java代码的话,加载jsp的时候先编译java代码,如果有错误,... 查看详情

java_异常处理

...辑错误和系统错误。错误在编写程序中会时常出现,包括编译期间错误和运行期间的错误。编译期间的错误编译器会帮助我们一起修正,但是运行期间的错误编译器就无能为力了。如果程序在运行期间出了错误我们置之不理,程... 查看详情

`mvn jgitflow:release-finish` 多模块构建中的错误(由于错误的编译顺序)

...`mvnjgitflow:release-finish`多模块构建中的错误(由于错误的编译顺序)【英文标题】:Errorin`mvnjgitflow:release-finish`mutli-modulebuild(duetowrongcompilationorder)【发布时间】:2015-06-0916:31:02【问题描述】:我正在尝试使用JGitflow为我的项目创建... 查看详情

按顺序加载“xlsx”和“插入符号”时,R 因分段错误而意外死亡

】按顺序加载“xlsx”和“插入符号”时,R因分段错误而意外死亡【英文标题】:Rdiesunexpectedlywithsegmentationfaultwhenloading\'xlsx\'and\'caret\'inthatorder【发布时间】:2017-12-1414:01:14【问题描述】:当我加载xlsx后跟caret时,R与segmentationfaul... 查看详情

SQL 编译错误:位置 6 处的语法错误第 2 行意外'R'

】SQL编译错误:位置6处的语法错误第2行意外\\\'R\\\'【英文标题】:SQLcompilationerror:syntaxerrorline2atposition6unexpected\'R\'SQL编译错误:位置6处的语法错误第2行意外\'R\'【发布时间】:2021-08-1119:12:07【问题描述】:我在where子句中使用... 查看详情

Snowflake SQL 编译错误:位置 XX 处的语法错误行 XX 意外 '('

】SnowflakeSQL编译错误:位置XX处的语法错误行XX意外\\\'(\\\'【英文标题】:SnowflakeSQLcompilationerror:syntaxerrorlineXXatpositionXXunexpected\'(\'SnowflakeSQL编译错误:位置XX处的语法错误行XX意外\'(\'【发布时间】:2019-12-1715:16:17【问题描述】:... 查看详情

IBM-Mobilefirst 意外错误中的推送通知

】IBM-Mobilefirst意外错误中的推送通知【英文标题】:PushnotificationinIBM-Mobilefirstunexpectederror【发布时间】:2016-11-2506:57:04【问题描述】:我在设备中运行IBM-MobileFirst提供的推送通知示例。我收到错误“意外错误”。请查看随附的屏... 查看详情

SQL 编译错误:位置 157 的语法错误第 5 行意外'<EOF>'

】SQL编译错误:位置157的语法错误第5行意外\\\'<EOF>\\\'【英文标题】:SQLcompilationerror:syntaxerrorline5atposition157unexpected\'<EOF>\'SQL编译错误:位置157的语法错误第5行意外\'<EOF>\'【发布时间】:2020-08-2801:22:04【问题描述】... 查看详情

C# CodeDom 编译器。错误 CS1056:意外字符“$”

】C#CodeDom编译器。错误CS1056:意外字符“$”【英文标题】:C#CodeDomCompiler.errorCS1056:Unexpectedcharacter\'$\'【发布时间】:2021-04-2109:50:54【问题描述】:我的代码是这样的:publicstaticboolCompileClient(outstring[]errors)using(CodeDomProviderprovider=Co... 查看详情

Xcode 8.2,Swift 编译器错误:错误:意外的输入文件

】Xcode8.2,Swift编译器错误:错误:意外的输入文件【英文标题】:Xcode8.2,SwiftCompilerError:error:unexpectedinputfile【发布时间】:2016-12-1613:58:55【问题描述】:从Xcode8.1更新到8.2后,我的项目中遇到了Swift编译器错误。我正在使用最新... 查看详情

Access 2007:意外错误 (40230)

...Access2007中表单的VBA代码时遇到意外错误(40230)。我尝试反编译,结果发现项目已损坏。反编译时收到如下信息:"TheVisualBasicforApplicationsprojectinthedatabaseiscorru 查看详情

UCanAccess 中的“语句意外结束”错误

】UCanAccess中的“语句意外结束”错误【英文标题】:"Unexpectedendofstatement"errorinUCanAccess【发布时间】:2015-05-0708:43:27【问题描述】:我使用下面的代码来更新或编辑我的Access数据库中的数据,但每次单击按钮时都会出现此... 查看详情

编译器错误信息:cs1056:意外的字符的处理办法

错误产生:?????在使用VS2015编译一个之前存在的程序代码时,总是会报错。莫名的在某些类文件的末尾添加一些[][][][],提示Unexpectedcharacter‘,程序出错。原因分析:???由于C#代码中出现特殊全角字符,从而产生标题所示编译错... 查看详情

休眠错误消息:意外令牌:NULLS(脚本文件行中的错误:13 意外令牌:NULLS)

】休眠错误消息:意外令牌:NULLS(脚本文件行中的错误:13意外令牌:NULLS)【英文标题】:Hibernateerrormessage:unexpectedtoken:NULLS(errorinscriptfileline:13unexpectedtoken:NULLS)【发布时间】:2012-02-0408:18:43【问题描述】:在学习Hibernate的过程... 查看详情

范围运算符中的错字导致 Visual Studio 2012 中的意外编译和递归

】范围运算符中的错字导致VisualStudio2012中的意外编译和递归【英文标题】:TypoinscopeoperatorleadstounexpectedcompileandrecursioninVisualStudio2012【发布时间】:2015-08-0419:50:51【问题描述】:我有一个这样的类结构:classApublic:voidfoo();;classB:pub... 查看详情

测试目标中的程序中出现意外的“@”

...:57:35【问题描述】:我有如下声明的字符串常量。此代码编译器在正常的应用程序调试和发布目标中。但是在应用程序的测试目标(Ctrl+U)中,我在测试目标的程序中遇到了意外的“@”错误。使用xcode7。模块已启用,如thisquestio... 查看详情

代码未在 nodejs 中编译,抛出意外错误(Web3.js)

】代码未在nodejs中编译,抛出意外错误(Web3.js)【英文标题】:Codenotcompilinginnodejs,throwsoutanunexpectederror(Web3.js)【发布时间】:2019-04-2319:40:31【问题描述】:我试过关注这个repo:-但是我在编译代码时遇到以下错误:-code=fs.readFileSyn... 查看详情

eslint“解析错误:JSX中的意外令牌”

】eslint“解析错误:JSX中的意外令牌”【英文标题】:eslint"parsingerror:Unexpectedtoken"inJSXeslint“解析错误:JSX中的意外令牌”【发布时间】:2019-05-0516:10:39【问题描述】:consttitle=\'MyMinimalReactWebpackBabelSetups\';constApp=()=>(<... 查看详情