0

为了好玩,我编写了一个小型 Java 应用程序,一切运行良好。我的问题是,当我在研究解析命令行参数的方法时,我只是觉得应该有一种更有效的方法。我的程序接受:

-l I(I 是新下界的整数) -u I(I 是新上界的整数) -? (输出可用的命令行选项)-v(激活主类的详细输出)

我通过以下方式实现了我的 parseArgs 方法:

private static void parseArgs(String[] arguments) {

String t = "";

for (int c = 0; c < arguments.length; c++) t += arguments[c];

if (t.contains("-")) {
    String[] params = t.split("-");
    for (int c = 0; c < params.length; c++) params[c] = params[c].trim();

    for (int c = 0; c < params.length; c++) {
    if (params[c].startsWith("?") && !docOnly) {
        docOnly = true;
        printHelp();
    }
    if (params[c].startsWith("l") && startPoint == 1) {
        try {
        startPoint = Integer.parseInt(params[c].substring(1));
        if (startPoint < 0) {
            startPoint = 0;
        }
        } catch (NumberFormatException e) {
        error = true;
        System.out.println("\tParameter Error: " + params[c]);
        }
    }
    if (params[c].startsWith("u") && endPoint == 1000) {
        try {
        endPoint = Integer.parseInt(params[c].substring(1));
        if (endPoint < 0) {
            endPoint = 1000;
        }
        } catch (NumberFormatException e) {
        error = true;
        System.out.println("\tParameter Error: " + params[c]);
        }
    }
    if (params[c].startsWith("v") && !verbose) {
        verbose = true;
    }
    }
} else {
    error = true;
    System.out.println("\tError in Parameters. Use -? for available options.");
}
}

正如我所说,我的代码一切正常,如果您想验证,可以查看它。我只是好奇其他程序员,无论是否专业,将如何处理传递可变数量和参数顺序的情况,并拥有一个可以准确解析它们的有效代码路径。我知道我的不是最好的,这就是为什么我想知道。任何语言都可以回答,我只是对程序感到好奇。我可以适应任何必要的语言,以便从中学习更多。

提前致谢。〜大卫柯林斯

4

1 回答 1

1
String t = "";
for (int c = 0; c < arguments.length; c++) t += arguments[c];

改用 a StringBuilder。或者更简单,join()由许多流行库中的任何一个提供。


if (t.contains("-")) {
    String[] params = t.split("-");

更好的:

String[] params = t.split("-");
if (params.length > 1) {

虽然这适用于您的特定情况(参数是非负整数),但通常会有问题。您应该-只在参数的开头查找,以便有人可以请求名为my-log.txt.


startPoint = Integer.parseInt(params[c].substring(1));
if (startPoint < 0) {
    startPoint = 0;
}

所有-的迹象都被吃掉了split,所以startPoint < 0永远不会是真的。


为什么要为非数字数据设置错误标志,默默地忽略超出范围的数字或重复的参数?

于 2013-03-18T13:57:45.390 回答