3

我有以下结构:

java_projects > chapter9

通常我 cd 到 java_projects 上一级的目录,然后执行代码 java_projects 以从该位置创建工作区目录。现在,在第 9 章中,我有以下文件:

Tv.java, TestTv.java

在 TestTv.java 我有以下代码:

package chapter9;

public class TestTv {
    public static void main(String[] args){
    Tv tv = new Tv();
    tv.turnOn();
    tv.setChannel(30);
    tv.setVolume(3);

    System.out.println("Tv channel is: " + tv.channel);
    // testing java date class

    java.util.Date date = new java.util.Date();
    System.out.println("time elapsed since jan 1, 1970 is: " + date.getTime() + "milliseconds");
    System.out.println(date.toString());
}
}

当我通过代码运行程序运行它时,我收到以下错误:

    TestTv.java:5: error: cannot find symbol
    Tv tv = new Tv();
    ^
  symbol:   class Tv
  location: class TestTv
TestTv.java:5: error: cannot find symbol
    Tv tv = new Tv();
                ^
  symbol:   class Tv
  location: class TestTv

我不太确定为什么会这样。经过进一步调查,我了解到这与在将其用于 Java 程序之前先编译 Tv 类有关。好的,所以我在 vscode 中查看了我的 settings.json 并将其更改为:

"java": cd $dir && javac *.java && java $fileName" 

这仍然给了我同样的错误。

所以我从第9章目录中删除并尝试了java第9章​​/TestTv.java并且它有效!

我如何告诉 vscode 的执行器映射返回上一级并执行它?

谢谢

{
"code-runner.clearPreviousOutput": true,
"code-runner.ignoreSelection": true,
"code-runner.saveAllFilesBeforeRun": true,
"java.autobuild.enabled": true,
"code-runner.fileDirectoryAsCwd": false,
"java.configuration.updateBuildConfiguration": "automatic",
"code-runner.executorMap": {
    "java": "cd $dir && javac *.java && java $fileName"
},
"code-runner.runInTerminal": true,

}

附上我的电视课

public class Tv {
// instance variables
int channel = 1; // default channel is 1
int volumeLevel = 1;
boolean on = false;  // Tv is off

public Tv(){};

public void turnOn(){
    on = true;
}

public void turnOff(){
    on = false;
}

public void setChannel(int newChannel){
    if (on && newChannel >= 1 && newChannel <= 120)
        channel = newChannel;
}

public void setVolume(int newVolumeLevel){
    if (on && newVolumeLevel >= 1 && newVolumeLevel <= 7){
        volumeLevel = newVolumeLevel;
    }
}

public void channelUp(){
    if (on && channel < 120)
        channel++;
}

public void channelDown(){
    if (on && channel > 1)
        channel--;
}

public void volumeUp(){
    if (on && volumeLevel < 7)
        volumeLevel++;
}

public void volumeDown(){
    if (on && volumeLevel > 1)
        volumeLevel--;
}

我正在寻找这样的东西?

"java": cd $dir && javac *.java && java (go back one directory up) $dir[my_folder_name]fileName" 

所以像这样的东西......

"java": cd $dir && javac *.java && cd .. java  chapter9/TestTv.java"

我不知道我不能让它更清楚。我有一个 mac OSX、sierra、javaSE11。我认为这与操作系统无关。它更多的是一个编译问题。去 vscode 的 github 并没有帮助,因为他们不回复任何事情。

4

2 回答 2

0

我也不是很熟悉这个话题。我做了一些试验和错误,并设法使用以下方法:

"code-runner.executorMap": {
    "java": "cd $dir && javac *.java && cd .. && java \"$(basename $dir)/$fileNameWithoutExt\""
}

值得注意的部分/变化:

  • && cd ..上移一个目录。
  • $(basename $dir)返回最内部的目录。chapter9在您的示例中,但是如果您更改为另一个目录,则不必更改它。
  • $fileNameWithoutExt:正在运行的代码文件的基本名称,不带扩展名,如配置中所述。
于 2021-03-16T22:00:30.140 回答
0

我对这个主题不太熟悉,但是基于在您的问题/答案中查看此语法并将“&&”语法视为一系列脚本,看起来您需要在组合中再添加一个“&&”,因此“cd .." 在调用 java-interpreter 作为最后一件事之前向上移动到父目录。

所以:“java”:cd $dir && javac *.java && cd .. && java chapter9.TestTv”

此外,我对 mac 要求不太熟悉,但我知道有些系统不介意“cd ..”,有些系统只使用“cd ..”和空格,所以在输入时要小心..

于 2021-03-13T23:45:45.110 回答