在java中抛出异常或断言

时间:2013-09-11 17:02:47

标签: java

非常的菜鸟问题。 我正在编写一个方法,它接收两个数组,然后从中创建一个哈希映射。 例如:

HashMap<String,String> createHash(String[] arr1, String[] arr2){
  //the logic is very simple
   HashMap<String,String> hshmp= new HashMap<String,String>();
   for (int i=0; i < arr1.length;i++){
    hshmp.put(arr1[i],arr2[i]);
  }
  return hshmp
}

现在我要检查的第一件事是arr1和arr2的尺寸......它们是否相同

如果不是..然后程序退出(优雅地精心制作??)

通常这是断言???对??但我认为java中的断言是必须启用的东西吗?

什么是解决这个问题的好方法?

3 个答案:

答案 0 :(得分:3)

异常和断言之间的选择在某种程度上取决于如何使用该方法。

断言旨在验证内部假设 - 如果您可以控制对createHash的所有调用,并且由于代码的逻辑,应该不可能使用不同长度的输入调用该方法,那么断言可能是恰当的。我们的想法是,您可以在开发期间启用断言来验证您的假设,然后出于性能原因在生产中禁用它们。

对于可能接受您无法控制的用户输入的方法,或者是公共API的一部分,或许多开发人员在内部使用的库的方法,那么异常会更合适,因为异常可以保证被抛出在公共方法中,您需要更加主动地检查输入,并且抛出异常通常是如何完成的。

答案 1 :(得分:2)

IllegalArgumentException非常适用于此目的:

if (arr1.length != arr2.length)
{
    throw new IllegalArgumentException("Arrays do not have the same length: " + 
                                        arr1.length + " != " + arr2.length);
}

我建议抛出一个异常,因为这样,你的方法的调用者可以决定在发生这种情况时该怎么做。调用者可以通过在System.exit(-1);正文中放置catch语句或调用自定义终止过程(保存更改,资源,设置等)来退出应用程序。

仅供参考:是的,断言是您必须手动启用的功能。


或者,您可以打印出错误的堆栈跟踪并立即退出。但我不建议:

if (arr1.length != arr2.length)
{
    Exception e = new IllegalArgumentException("Arrays do not have the same length: " + arr1.length + " != " + arr2.length);
    e.printStackTrace();
    System.exit(-1);
}

答案 2 :(得分:1)

你可以这样做:

HashMap<String,String> createHash(String[] arr1, String[] arr2) throws IllegalArgumentException {
  //the logic is very simple
  if(arr1 != null && arr2 !=null && arr1.length == arr2.length){
     HashMap<String,String> hshmp= new HashMap<String,String>();
     for (int i=0; i < arr1.length;i++){
        hshmp.put(arr1[i],arr2[i]);
     }
     return hshmp;
  }
  else
     throw new IllegalArgumentException("Arrays are null or not equally sized");
}