我试图在args.length没有任何参数供应时抛出新的异常,但是打印出我的消息而不是打印出ArrayIndexOutOfBounce异常。
if (args.length == 0)
{
throw new DeleteFieldException("You must set at least three arguments");
}
我的捕获:
catch (DeleteFieldException exception)
{
System.err.println(exception);
} // catch
和我的自定义异常类:
public class DeleteFieldException extends Exception
{
private String message = null;
public DeleteFieldException ()
{
super ();
}
public DeleteFieldException (String message)
{
super (message);
this.message = message;
}
public DeleteFieldException (Throwable cause)
{
super (cause);
}
public DeleteFieldException (String message, Throwable cause)
{
super (message, cause);
}
public String toString()
{
return message;
}
public String getMessage()
{
return message;
}
} // DeleteFieldException
答案 0 :(得分:4)
如果您只打印出消息,捕获异常并不意味着什么。你的代码一直在执行,可能会遇到你实际进行数组访问的行,如argv[n]
,它会抛出这个异常,你不会抓住它,所以它会崩溃。
您必须在捕获区中采取实际的预防措施。
编辑所需的预防措施:
这些预防措施完全取决于应用程序,但是从您提供的代码中我了解到您的应用程序采用命令行参数,并且通过异常处理,您检查用户是否为您的代码提供了足够的命令行参数来运行。
在那个案例中你应该问自己“如果用户没有提供必要的论据,我该怎么办?”
第一个可能的答案(并且很有可能),在此示例中,由于您需要命令行参数,因此您必须要求用户使用正确的参数重新运行程序,并安静地退出。在这种情况下,假设您在主方法中执行异常处理,只需要return
退出。代码如下:
catch (DeleteFieldException exception)
{
System.err.println("Some error message");
return;
} // catch
如果您使用main之外的其他方法执行此操作,则可以返回一些值,用于通知调用方方法存在错误。如果方法应该返回一个Object返回null
,如果它应该返回一个非负数返回-1等。
其次,您可以为您希望用户提供的那些分配一些默认值,而catch块是完美的选择。查看下面的代码,了解略有不同的情况。
try{
myVariable = argv[1];
}
catch(ArrayIndexOutOfBoundsException e){
myVariable = 10; //lets say 10 is the default value
}
它甚至不像你的代码那样检查argc == N
,它只是尝试将命令行参数分配给变量。如果用户没有给出任何输入argv[1]
导致异常,你会抓住它,并且作为 precaution 你会为该变量设置一个默认值。