3

我正在为大学做一些工作,我的主要工作是:

Spreadsheet sheet = new Spreadsheet(0,0);
SpreadsheetManager manager = new SpreadsheetManager(sheet);

/* Read an Import file, if any */
String filename = System.getProperty("import");

if (filename != null)
    sheet.parseInputFile(filename, sheet);

问题是,当我实际尝试导入一个文件时,它并没有做应该做的事情,并且文件名始终为空,所以它永远不会到达我的 parseInputFile。

我的老师为不同的编程练习编写了一堆代码,这些代码可以做类似的事情,我还查看了我的同事在前几年所做的项目,但每个人都在做我上面所做的事情。

我必须像这样运行我的程序:java -Dimport=A-002-002-M-ok.import calc.textui.Calc否则老师给出的测试都不会运行。

如果这不是一个有用的问题,我很抱歉,但我试过到处找。如果有人能解释它是如何System.getProperty("import")工作的以及为什么它在这种情况下不起作用,我将非常感激。

4

3 回答 3

3

我建议你看一下.System.getProperty()

基本上,它从系统中检索一个值,无论是已经存在的还是由您设置的。

为避免检索null,您可以使用另一个指定默认值的方法签名:

System.getProperty("import", "file.txt");

要设置系统属性,您可以在启动时指定它:

java -Dimport="file.txt" your_application

或以编程方式设置:

System.setProperty("import", "file.txt");

于 2013-11-15T13:52:30.073 回答
2

当您运行程序时:

java -Dimport=foo

然后方法调用

System.getProperty("import")

应该返回“foo”。

是否可以编写一个小示例程序来说服自己?没有任何 SheetManagers 和所有东西,只是

class ItWorks {
public static void main(String[] args) {
   System.out.println(System.getProperty("import"));
}
}

这样称呼

java -Dimport=indeed ItWorks

并报告发生了什么。

话虽这么说:如果你想传递命令行参数,为什么不使用命令行参数的工具呢?(即传递给 main 的 String[] 数组?)

然后你可以这样调用你的程序:

java calc.textui.Calc my-nice-spreadsheet.data

==================================================== ===

请在类定义的左大括号后立即calc.textui.Calc在程序中编写以下内容:

public class Calc ..... {   // a line like this already exists
    // insert next line here
    public static String filename = System.getProperty("import");

    // rest of your class, as before.
}

然后注释掉getProperty() 方法中不起作用的行,但保留其余部分,包括System.out.println(filename);

它会改变吗?

于 2013-11-15T14:23:48.713 回答
0

也许系统属性不是最常用的方法(取决于您的应用程序)。
您还可以使用命令行参数将文件名传递给您的main方法:

public class CommandLineExample {

    public static void main(String[] args) {
        if (args.length < 1) {
            System.err.println("usage: CommandLineExample <filename>");
            System.exit(1);
        }

        String filename = args[0];
        if (filename !=null && !filename.isEmpty()) {
            ...
        }
    }

}

你的程序应该被称为:

    java CommandLineExample theFileName

字符串 "theFileName" 将被传递给 args[0] 中的 main 方法(任何额外的单词都将在 args {args[1], args[2], ...} 的后续位置传递)

编辑
是否必须调用程序

    java -Dimport=filename ... 

然后System.getProperty("import")将返回文件名。
确认您正在调用正确的程序(类名、包、版本、上次编译是否成功,...),并检查该属性是否输入错误java -Dinport=A-...或有额外的空格、大写字母...

于 2013-11-15T14:21:27.307 回答