我试图以更干净的方式重新编写此代码:
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的情况下重写此代码的任何想法?
答案 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;
}
}