Java 是否可以阻止try-catch返回null

Java 是否可以阻止try-catch返回null,java,try-catch,defensive-programming,Java,Try Catch,Defensive Programming,如果有人调用我的方法,我想防御性地处理这个问题。通常我只返回null 我决定实现一个trycatch,但看起来我最终还是返回了null 我是否可以编写我的trycatch,这样在方法末尾它就不会返回null 示例代码,在堆栈类上使用peek public T peek() { T temp = null; try { temp = array[size]; } catch

如果有人调用我的方法,我想防御性地处理这个问题。通常我只返回
null

我决定实现一个
try
catch
,但看起来我最终还是返回了
null

我是否可以编写我的
try
catch
,这样在方法末尾它就不会返回
null

示例代码,在堆栈类上使用
peek

    public T peek()
    {
        T temp = null;

        try
        {
            temp = array[size]; 
        }

        catch(Exception e)
        {
        }

        return temp;
    }
当使用空堆栈调用时。它将返回
null

所以我是否应该为这种情况下的
try
catch
而烦恼呢?我很想这样做:

if(isEmpty())
   return null;

如果堆栈不是空的,我想返回元素。如果堆栈为空,那么如果我使用
try catch
,是否可以避免返回null?

很难想象
数组[size]
会抛出异常,除非数组为空或大小超出数组长度。所以,你可以这样做-

 if (array != null && array.length > size) {
   return array[size - 1]; // assuming your size starts at 1
 }
 return null; // need to return something, if not null you need an option type.
编辑

或者,用单子之类的东西

 if (array != null && array.length > size) {
   return new Some<T>(array[size - 1]); // assuming your size starts at 1
 }
 return new None<T>(); 
if(array!=null&&array.length>size){
返回新的Some(数组[size-1]);//假设您的大小从1开始
}
返回新的None();

这就是我解决问题的方法。通过在peek函数中抛出异常,将处理该异常的职责放在调用方。为什么?因为我希望一个错误引起尽可能大的爆炸。peek方法也变得更小。同样,正如您已经同意的那样,返回null是站不住脚的

public T peek() throws IndexOutOfBoundsException
{   
  return array[size]; 
}


该方法必须返回某些内容或引发异常。如果您有一个无界的泛型类型,那么像null对象模式这样的东西就不能使用,因此这些选项将返回
null
,返回包含
t
的内容,比如
Optional
,或者引发异常


如果您不喜欢
null
的安全性,可以使用Java 8或库中的
Optional
。选中的异常具有类似的安全性,但在这里是不合适的。

相关:,只是在这种情况下,您避免使用
try/catch
块。执行if-else。try-catch是处理程序中正常通信的糟糕方式。它的性能很差,只是看起来很难看,你希望它返回什么?你对处理IndexOutOfBoundException的try-catch做了什么?为什么要它返回?我认为更有效的问题是你想返回什么而不是null?那会返回null@AndersLind我的评论是“需要返回一些东西,如果不是空的话,你需要一个选项类型。”太微妙了?对不起,我只看到了“返回空”这并不微妙。必须仔细阅读。@ElliottFrisch谢谢。我想指出:这不是防御性编程,这是我的标签之一。卸妆不是防御性的吗?即使函数调用异常,补偿也会返回。
try
{
  T top = thestack.peek();
  /* Do something with that object */
}
catch(IndexOutOfBoundsException e)
{
  /* Do something else */
}