检查Java程序参数的函数

时间:2015-05-15 11:19:37

标签: java arguments

我试图以更干净的方式重新编写此代码:

public static void main(String[] args) {
    if(checkArgs(args) < 0) return; 
    return;
}

private static int checkArgs(String[] args) {       
    if (args.length == 0) {
        System.out.println("Error: No Args");
        return -1;
    }
    try{ //If it's a number
        int myNumber = Integer.parseInt(args[0]);
        System.out.println("My number is: " + myNumber);
    }
    catch (Exception e) {//If it's a String
        try{
            String[] myStr = args ;
            System.out.print("My String is ");
            for (int i=0; i<args.length; i++) {
                myStr[i] = args[i];
                System.out.print(myStr[i]);
            }
            System.out.print("\n");
            return 0;
        }
        catch(Exception err){
            System.out.println("Error");
            return -1;
        }
    }
    return 0;
}

代码检查程序args并告诉用户它是字符串还是数字。

有关如何在不使用try-catch的情况下重写此代码的任何想法?

3 个答案:

答案 0 :(得分:0)

正如评论中所提到的,您的代码存在编译问题。就逻辑而言,要确定输入字符串是否仅包含数字,可以使用正则表达式,如下所示。

Pattern p = Pattern.compile("^-?[0-9]+$");

if(p.matcher(arg[0]).matches()) {
    System.out.println("It's a number!!");
} else {
    System.out.println("Not a number.");
}

在这种情况下,您不必使用try/catch阻止。

答案 1 :(得分:0)

首先,你真的不需要第二个try...catch。这段代码:

        String[] myStr = args ;
        System.out.print("My String is ");
        for (int i=0; i<args.length; i++) {
            myStr[i] = args[i];
            System.out.print(myStr[i]);
        }
        System.out.print("\n");
        return 0;

不抛出任何已检查的异常,并且不太可能抛出运行时异常。

其次,此代码还包含根本不需要的部分 - myStr数组 - 您为其分配args数组,然后将每个元素分别分配给它。它是一个局部变量,所以它会在你return之后立即消失。

所以:

        System.out.print("My String is ");
        for (int i=0; i<args.length; i++) {
            System.out.print(args[i]);
        }
        System.out.print("\n");
        return 0;

会做同样的事情而不会抛出异常。

现在,至于检查整数 - 我认为只是像这样使用它并捕获异常就足够了。只需抓住NumberFormatException而不是Exception。做一个全能的从来都不是一个好主意。

但是如果你坚持使用没有try-catch的方法,你可以这样做:

private static boolean checkInt(String str) {
    if ( ! str.matches("-?0*[0-9]{1,10}")) {
        return false;
    }
    long l = Long.valueOf(str);
    if ( l > Integer.MAX_VALUE || l < Integer.MIN_VALUE) {
        return false;
    }
    System.out.println("My number is: " + myNumber);
    return true;
}

首先检查您是否有不超过10位数字,带或不带减号(以及任意数量的前面的零)。如果是这样,那么它可以安全地转换为long,无需异常检查。然后,您可以检查结果long是否在整数范围内。这是一个不需要尝试和捕获的解决方法,但我认为它不比try-catch方法更好。

所以,使用try-catch,你会得到:

private static int checkArgs1(String[] args) {
    if (args == null || args.length == 0) {
        System.out.println("Error: No Args");
        return -1;
    }
    try { // If it's a number
        int myNumber = Integer.parseInt(args[0]);
        System.out.println("My number is: " + myNumber);
    } catch (NumberFormatException e) {// If it's a String
        String[] myStr = args;
        System.out.print("My String is ");
        for (int i = 0; i < args.length; i++) {
            myStr[i] = args[i];
            System.out.print(myStr[i]);
        }
        System.out.print("\n");
        return 0;
    }
    return 0;
}

没有它,使用我的checkInt()方法:

private static int checkArgs2(String[] args) {
    if (args == null || args.length == 0) {
        System.out.println("Error: No Args");
        return -1;
    }
    if ( ! checkInt(args[0])) {
        // If it's a String
        String[] myStr = args;
        System.out.print("My String is ");
        for (int i = 0; i < args.length; i++) {
            myStr[i] = args[i];
            System.out.print(myStr[i]);
        }
        System.out.print("\n");
        return 0;
    }
    return 0;
}
但是,我不确定你的支票有多大用处。通常,参数检查是为了准备使用args做一些事情而做的,而且你不会在任何地方保存关于它是数字还是字符串的信息。

答案 2 :(得分:-1)

试试这个......

public class CheckArgs {

    public static void main(String[] args) {
        if (args != null && args.length != 0) {
            for (String arg : args) {
                System.out.println(String.format("<----- %s ----->", arg));
                System.out.println(String.format("is number %s", checkIfNumber(arg)));
                System.out.println(String.format("is string %s", checkIfString(arg)));
                System.out.println(String.format("<-------------->", arg));
            }
        }
    }

    private static boolean checkIfString(Object arg) {
        if (arg instanceof String) {
            return true;
        }
        return false;
    }

    private static boolean checkIfNumber(Object arg) {
        if (arg instanceof Integer) {
            return true;
        }
        return false;
    }
}