我在 Git Bash 中创建了一个 HelloWorld.java 文件
$vi HelloWorld.java
Run Code Online (Sandbox Code Playgroud)
然后插入以下内容:
class Hello {
public static void main (String[] arguments) {
System.out.println ("Hello, world!");
}
}
Run Code Online (Sandbox Code Playgroud)
按 esc 并写入 :wq!
然后我尝试调用该程序。
$ls
HelloWorld.java
$javac HelloWorld.java
$ls
Hello.class HelloWorld.Java
$ java HelloWorld
Error: Could not find or load main class HelloWorld
Caused by: java.lang.ClassNotFoundException: HelloWorld
Run Code Online (Sandbox Code Playgroud)
你能帮助我吗?
我被拉入了类似于以下代码的性能调查:
private void someMethod(String id) {
boolean isHidden = someList.contains(id);
boolean isDisabled = this.checkIfDisabled(id);
if (isHidden && isDisabled) {
// Do something here
}
}
Run Code Online (Sandbox Code Playgroud)
当我开始调查它时,我希望编译后的版本看起来像这样:
private void someMethod(String id) {
if (someList.contains(id) && this.checkIfDisabled(id)) {
// Do something here
}
}
Run Code Online (Sandbox Code Playgroud)
然而,令我惊讶的是,编译后的版本看起来和第一个版本一模一样,带有局部变量,这导致 in 中的方法isDisabled总是被调用,这就是性能问题所在。
我的解决方案是自己内联它,所以该方法现在在 处短路isHidden,但它让我想知道:为什么 Java 编译器在这种情况下不够聪明,无法为我内联这些调用?它真的需要局部变量吗?
谢谢 :)
Java 类版本可以使用以下命令从类二进制文件中获取javap
javap -verbose Test | grep 'minor\|major'
minor version: 0
major version: 55
Run Code Online (Sandbox Code Playgroud)
是否可以提前知道 JDK 将生成哪个类版本?
java -version不显示它
java -version
openjdk version "11.0.17" 2022-10-18
Run Code Online (Sandbox Code Playgroud)
我一直在Netbeans的一个项目上工作.现在我想提交它并允许标记用脚本编译它.但是,当我尝试通过命令行运行时,我得到NoClassDefFoundError.即使手动将类路径设置为当前目录.
javac Main.java工作正常
然后调用java -classpath.主要给出:
java -classpath . Main
Exception in thread "main" java.lang.NoClassDefFoundError: Main (wrong name: pro
ject2/Main)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:12
4)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
at java.net.URLClassLoader.access$000(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
Run Code Online (Sandbox Code Playgroud) 我试图在命令提示符下执行此命令以查找我的构建错误.我已经分解的是,javac将文件名中的一个视为标志(选项),这就是为什么它无法执行.我该如何解决?
C:\Users\AUG>javac -verbose -classpath "C:\Program Files\MATLAB\R2010b\toolbox\j
avabuilder\jar\javabuilder.jar" -d "C:\Users\AUG\Documents\SourceTraceJAVA\Sourc
eTrace\src\classes" "C:\Users\AUG\Documents\SourceTraceJAVA\epanet2.h" "C:\Users
\AUG\Documents\SourceTrace\src\SourceTrace\SourceTrace.java" "C:\Users\AUG\Docum
ents\SourceTraceJAVA\SourceTrace\src\SourceTrace\SourceTraceMCRFactory.java" "C:
\Users\AUG\Documents\SourceTraceJAVA\SourceTrace\src\SourceTrace\SourceTraceRemo
te.java" "C:\Users\AUG\Documents\SourceTraceJAVA\SourceTrace\src\SourceTrace\pac
kage-info.java"
javac: invalid flag: C:\Users\AUG\Documents\SourceTraceJAVA\epanet2.h
Usage: javac <options> <source files>
use -help for a list of possible options
Run Code Online (Sandbox Code Playgroud)
它正在考虑将epanet2.h文件作为标志而不是文件.语法有什么问题吗?我该如何解决这个问题?
我正在尝试编译并执行一个使用JTidy的java程序.我已经设法使用以下命令编译程序:
javac -classpath jtidy-r938.jar @sourcefile
Run Code Online (Sandbox Code Playgroud)
这似乎工作得很好.但是,当我尝试使用以下命令运行程序时(Top是包含程序主要部分的类的名称):
java -classpath jtidy-r938.jar Top
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
Exception in thread "main" java.lang.NoClassDefFoundError: Top
Caused by: java.lang.ClassNotFoundException: Top
...
Could not find the main class: Top. Program will exit.
Run Code Online (Sandbox Code Playgroud)
对于一个简单的解决方案来说,这很可能是一个非常愚蠢的问题,但这让我感到疯狂.请帮忙!!
如果我编译一个类
class hussi
{
public static void main(String args[])
{
System.out.println("hello java");
}
}
Run Code Online (Sandbox Code Playgroud)
我有除hussi.class文件以外的任何文件吗?
javac是否创建除.class文件以外的任何文件?
我编写了一个脚本,它将为javac生成适当的参数来编译我的项目,以便更好地掌握shell脚本.
这很奇怪..脚本运行完美,但是如果脚本运行带有这些参数的javac它不起作用,并且如果我在交互式shell中运行完全相同的命令它.一切都以绝对路径输出,所以我在这里几乎不知所措.
示例目录结构:
src/File.java
src/File.png
src/dir/File2.java
jars/Library.jar
Run Code Online (Sandbox Code Playgroud)
预期产量:
build/File.class
build/File.png
build/dir/File2.class
Run Code Online (Sandbox Code Playgroud)
shell脚本:
#! /bin/sh
cwd=$(pwd)
if [ -d "build" ]; then
rm -rf $cwd/build/*
else
mkdir $cwd/build
fi
find $cwd/src \( ! -path '*/.*' \) -type f ! -iname "*.java" | xargs -I{} cp --parents {} $cwd/build
cmd=$(echo javac -sourcepath $cwd/src -classpath $(find $cwd/jars -type f | awk '{ printf("\"%s\";", $0);}' | awk '{ print substr($0, 0, length($0)); }') -d $cwd/build $(find $cwd/src \( ! -path '*/.*' \) …Run Code Online (Sandbox Code Playgroud) 是否为此类变量声明提供了优化:
final int secondsInDay = 24 * 60 * 60;
Run Code Online (Sandbox Code Playgroud)
尽管additional_funct根本没有使用,但C++上的这段代码甚至都无法编译:
#include <iostream>
void additional_funct(int num);
void main()
{
std::cout << "just a text";
}
void additional_funct(int num)
{
// For both lines will be shown "divide by zero"
int var = 5 / 0;
int another_var = num + (2 / 0);
}
Run Code Online (Sandbox Code Playgroud)
这证明了C++编译器在运行之前对数字文字表达式进行了优化,以预先计算它们.虽然相同的Java代码将开始运行:
package experimental_main;
public class Experimental_start {
public static void main(String[] args) {
// Will throw ArithmeticException "by zero"
additionalMethod(2);
System.out.println("just a text");
} …Run Code Online (Sandbox Code Playgroud) 我将以下内容放在项目gradle文件的末尾:
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs +=
['-Xep:MissingOverride:ERROR',
'-Xep:MissingCasesInEnumSwitch:ERROR',]
}
}
Run Code Online (Sandbox Code Playgroud)
但是,在我的代码中,如果我在@Override某处删除了注释或删除了switch语句,我的Android项目仍会生成。它不应该因错误而失败吗?