Java:为args.length == 0抛出新的异常。不起作用?

时间:2014-03-14 01:14:46

标签: java exception-handling

我试图在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

1 个答案:

答案 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 你会为该变量设置一个默认值。