Java:Thow args.length==0的新异常。不';不行?

Java:Thow args.length==0的新异常。不';不行?,java,exception-handling,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.printl

当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

如果您只是打印出消息,那么捕获异常并不意味着什么。您的代码一直在执行,可能会碰到实际进行数组访问的行,如
argv[n]
,它会抛出此异常,您无法捕获它,因此它会崩溃

你必须采取实际的预防措施,在你的捕捉块

编辑请求的预防措施:

这些预防措施完全是特定于应用程序的,但从您提供的代码中,我了解到您的应用程序使用命令行参数,通过异常处理,您可以检查用户是否为您的代码提供了足够的命令行参数

在这种情况下,您应该问自己的问题是“如果用户没有给出必要的参数,我应该怎么做?”

首先可能的答案(最有可能的答案),在本例中,由于需要命令行参数,您必须要求用户使用正确的参数重新运行程序,然后和平退出。在这种情况下,假设您在main方法中执行异常处理,您只需返回退出即可。代码如下:

catch (DeleteFieldException exception)
{
   System.err.println("Some error message");
   return;
} // catch
如果您在main以外的其他方法中执行此操作,则可以返回一些值,用于通知调用方方法有问题。If方法应该返回一个对象返回
null
,If方法应该返回一个非负数返回-1等等

其次,您可以为您希望用户提供的值指定一些默认值,而catch块正是这样做的最佳位置。查看下面的代码,了解稍微不同的场景

try{
    myVariable = argv[1];
}
catch(ArrayIndexOutOfBoundsException e){
    myVariable = 10; //lets say 10 is the default value
}

它甚至不检查
argc==N
就像您的代码一样,它只是尝试将命令行参数分配给变量。如果用户没有提供任何导致异常的输入,您将捕获它,并为该变量指定一个默认值。

如果您只是打印消息,捕获异常并不意味着什么。您的代码一直在执行,可能会碰到实际进行数组访问的行,如
argv[n]
,它会抛出此异常,您无法捕获它,因此它会崩溃

你必须采取实际的预防措施,在你的捕捉块

编辑请求的预防措施:

这些预防措施完全是特定于应用程序的,但从您提供的代码中,我了解到您的应用程序使用命令行参数,通过异常处理,您可以检查用户是否为您的代码提供了足够的命令行参数

在这种情况下,您应该问自己的问题是“如果用户没有给出必要的参数,我应该怎么做?”

首先可能的答案(最有可能的答案),在本例中,由于需要命令行参数,您必须要求用户使用正确的参数重新运行程序,然后和平退出。在这种情况下,假设您在main方法中执行异常处理,您只需返回退出即可。代码如下:

catch (DeleteFieldException exception)
{
   System.err.println("Some error message");
   return;
} // catch
如果您在main以外的其他方法中执行此操作,则可以返回一些值,用于通知调用方方法有问题。If方法应该返回一个对象返回
null
,If方法应该返回一个非负数返回-1等等

其次,您可以为您希望用户提供的值指定一些默认值,而catch块正是这样做的最佳位置。查看下面的代码,了解稍微不同的场景

try{
    myVariable = argv[1];
}
catch(ArrayIndexOutOfBoundsException e){
    myVariable = 10; //lets say 10 is the default value
}

它甚至不检查
argc==N
就像您的代码一样,它只是尝试将命令行参数分配给变量。如果用户没有提供任何输入,导致异常的是argv[1],您将捕获它,作为预防措施,您将为该变量指定一个默认值。

此外,我想补充一点,对于这种异常,您不想扩展
异常
,您希望扩展
RuntimeException
,这样就不必在每次使用时都使用try-catch来包装它。“如果您只是打印消息“@fge我希望编译器生成警告,那么捕获异常并不意味着什么。”。。IDE无论如何都是假的:)如何采取这种预防措施。你能给我一个简单的例子吗?另外,我想补充一点,对于这种异常,你不想扩展
exception
,你想扩展
RuntimeException
,这样它就不必在每次使用时都用try-catch包装。“如果你只是打印消息,捕获异常并不意味着什么。”@fge我希望编译器生成警告。。IDE无论如何都是假的:)如何采取这种预防措施。你能给我举个简单的例子吗?