Tag: javac

不同的Java编译器(供应商不同)会产生不同的字节码

给定相同的主要版本,比如Java 7,做不同的Java编译器(例如,Oracle的热点,JRockit或IBM的J9等……)将给定的java源代码文件编译成相同的bytcode? 扫描Java 7语言规范似乎正在讨论的是语言的语义,而不是将代码转换为字节码。 这个问题与不同的major.minor版本不同,给定供应商生成相同的字节码。 这个问题已在这里得到解答 – 可能是 。 从以下答案到Java类文件的创建是否确定? 并且对这个答案的评论引用了这个问题以及对于1和2上面的major.minor问题的两个答案,我认为我的问题的答案是肯定的 。 上述摘录如下: JLS留下了许多实现细节,从一个实现到另一个实现。 和 但是,JLS没有指定从源代码到生成的字节代码的1:1映射,因此您不应该依赖于生成完全相同的字节代码。 然而, 这里的评论意味着不同: 它是编译器,即javac,使用BLAH BLAH BLAH创建代码。 这与HotSpot无关。 这意味着给定代码X所有javac实现(相同版本/不同供应商)必须生成相同的Y字节码。 我不明白这是怎么回事,但我无法证实它不是(或者我认为,见上文)是正确的。 能给出明确的答案吗?

当名义类需要访问修改时,无法使用交集类型

接口: interface PublicCloneable { Object clone(); } interface HasPosition { // doesn’t matter } 尝试使用交集类型: @SuppressWarnings(“unchecked”) E cloneAndIncrementPosition(E elem) { final E clone = (E)elem.clone(); // rest omitted } 尝试使用javac 1.8.0_60进行编译: $ javac xx.java xx.java:13: error: clone() in Object cannot implement clone() in PublicCloneable E cloneAndIncrementPosition(E elem) { ^ attempting to assign weaker access privileges; […]

javac生成的$$中的$$是什么意思?

当转移由DependencyFinder和java-callgraph等库生成的java调用图时,我发现java编译器为匿名函数,内部类等生成名称。 我已经发现了其中几个的含义(如果我错了,请更正): org.example.Bar$Foo引用Foo ,它是org.example.Bar的内部类。 org.example.Bar$1引用在org.example.Bar$1一个方法中声明的匿名类。 org.example.Bar.lambda$spam$1()是指在org.example.Bar.spam()方法中声明的lambda。 但是,我还发现: org.example.Bar$$Lambda$2.args$1 org.example.Bar$$Lambda$2.call() org.example.Bar$$Lambda$7.lambdaFactory$() org.example.Bar$$Lambda$7.get$Lambda() 上面的四个名字是指什么? 双美元( $$ )是什么意思?

IntelliJ 2018.1首选项中的“使用’ – release’选项”是什么?

在IntelliJ 2018.1(构建,执行,部署>编译器> Java编译器)的首选项中,有一个标记为的复选框: 使用’–release’选项进行交叉编译(Java 9及更高版本) 我在网上搜索时找到了相关信息。 “?” 单击帮助图标时出现404错误。 这个选项的目的/function是什么?

创建批处理文件,用于简单的javac和java命令执行

这是一件非常简单的事情,但我无法理解它。 我看过很多StackOverFlowpost以及互联网。 我的目标是创建一个.bat,它将打开cmd并将我的Main.java执行到命令提示符。 容易不是,但我对如何感到困惑? 下面我正在编写我的批处理文件应该执行的步骤 打开cmd javac Main.java java主要 我的文件将驻留在我的所有.java旁边,所以我假设我不需要给出明确的路径。 到目前为止我对研究的理解: 打开文本编辑器 写一个代码来打开cmd(我不知道怎么做) echo javac Main.java(对我来说仍然是模糊的概念) echo java Main 另存为:name.bat 任何帮助将不胜感激。 谢谢。

为什么Java编译器有时允许取消装箱为空?

例如: int anInt = null; 在编译时失败但是 public static void main(String[] args) { for (int i = 0; i < 10; i++) { System.out.println("" + getSomeVal()); } } public static int getSomeVal() { return new Random().nextBoolean() ? 1 : null; } 在运行时(通常)失败。 试图返回null也会导致编译错误,所以我假设有多个路径会导致编译器推断出null可能是一个自动装箱的int ? 为什么javac能够以相同的错误编译这两种情况?

错误:无法运行“javac -version”,请确保已安装JDK

错误:无法运行“javac -version”,请确保已安装JDK。 您可以从以下url获取: http : //www.oracle.com/technetwork/java/javase/downloads 。 您的JAVA_HOME无效:C:\ Program Files \ Java \ jdk1.8.0_152; [错误]运行cordova运行android时出错(退出代码1) 我的JAVA_HOME:C:\ Program Files \ Java \ jdk1.8.0_152; C:\ Program Files \ Java \ jdk1.8.0_152 \ bin; ANDROID_HOME:C:\ Users \ Felipe \ AppData \ Local \ Android \ sdk; 路径:%SystemRoot%\ system32;%SystemRoot%;%SystemRoot%\ System32 \ Wbem;%SYSTEMROOT%\ System32 \ WindowsPowerShell \ v1.0 \;%JAVA_HOME%\ bin;%ANDROID_HOME%\ […]

如何将Java编译器错误捕获到文件中?

我编译了一个Java程序 javac t1.java > a 为了将错误消息重定向到文件a 。 但是a没有错误内容(它们仍然出现在终端中)。 该命令从Linux命令提示符执行。 t1.java的内容如下: class t1 { public static void main(String[] args) { System.out.printn(“Hello World!”); // Display the string. } } 所以现在有一个错误,即println被写为printn 。 如何在文件中捕获此错误消息?

javac根据赋值方法不同地处理静态final

当我编译: public static final boolean FOO = false; public static final void fooTest() { if (FOO) { System.out.println(“gg”); } } 我得到一个空方法fooTest() {} 。 但是当我编译时: static boolean isBar = false; public static final boolean BAR = isBar; public static final void fooTest() { if (BAR) { System.out.println(“gg”); } } if语句包含在已编译的类文件中。 这是否意味着java中有两种不同的“类型”静态final,或者这仅仅是编译器优化?

-Xlint麻烦:全部和maven

我正在尝试让maven输出lint级警告。 我已经创建了一个小的测试程序,它应该生成一个关于从非静态上下文中使用静态方法的警告,但是尽管有许多不同的插件配置选项,但构建总是成功而没有任何警告! 在做了一些谷歌搜索后,我发现了使用编译器插件的’compilerArgument(s)’属性的建议,但这对我来说似乎也没有用。 这是我应该生成警告的示例程序: package com.dahlgren; /** * Test space * */ public class App { public static void main( String[] args ) { String foo = “foo”; // I want this to generate a compilation warning System.out.println(foo.format(“blah”)); } } 此程序应发出警告,因为Java 6 String :: format的javadoc表示仅存在此方法的静态版本。 我想特别抓住这个案例,因为它过去曾经咬过我,编译器应该检测它:-) 这是我的pom文件: 4.0.0 com.dahlgren JavaScratchSpace 1.0-SNAPSHOT jar JavaScratchSpace http://maven.apache.org UTF-8 […]