首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >应该在哪一层捕获异常?

应该在哪一层捕获异常?
EN

Stack Overflow用户
提问于 2014-05-30 14:23:46
回答 1查看 114关注 0票数 1

我实现了一个Queue,然后在它周围实现了一个名为ImplementStackUsingQueue的包装器。注意--我的问题与实现的准确性或逻辑无关。它只关心异常处理。

队列实现看起来像这样

代码语言:javascript
复制
 public synchronized boolean add(int x) {
        if (currentSize == maxSize) {
            throw new IllegalStateException("The queue is full: front size: " + rear);
        }

        queue[rear++] = x; // USE.
        rear = (rear + 1) % maxSize;     // NEXT.
        currentSize++;

        return true;
    }

使用此队列实现堆栈的包装器如下所示:

代码语言:javascript
复制
  public void push(T x) {
        queue2.add(x);
        queue2.addAll(queue1);
        queue1 = queue2;
        queue2 = new LinkedList<T>();
    }

现在,我的包装器将依赖底层的Queue来抛出IllegalStateException。我的问题是-依赖底层组件抛出异常是一种好的做法,还是值得在ImplementStackUsingQueue中复制异常处理条件currentSize = maxSize,并在控制转到底层之前处理异常?

EN

回答 1

Stack Overflow用户

发布于 2014-05-30 15:15:50

这个话题是高度基于意见的,但多年来已经形成了一些共识。其中之一就是"Don't use exceptions for flow control"

对于发布的代码,如果不可能将元素添加到队列中,则只返回false会更有意义。

现在,对于你的问题“依赖底层组件抛出异常是不是很好的做法”?如果异常被抛出到控制流,则

“是否值得在ImplementStackUsingQueue中复制异常处理条件currentSize = maxSize,并在控制转到底层之前处理异常?”不,底层应该只指示它是否可以将元素添加到队列中:

代码语言:javascript
复制
public synchronized boolean add(int x) {
    if (currentSize == maxSize) {
        return false; // indicate in the javadocs when the false is returned
    }

    queue[rear++] = x; // USE.
    rear = (rear + 1) % maxSize;     // NEXT.
    currentSize++;

    return true;
}

很难知道“推送”在做什么,因为queue1和queue2可以在其他地方修改或使用。如果可以隔离对队列的更改,那么如果不可能将元素添加到队列中,那么"push“返回false应该是可以的。如果队列不接受null元素,那么如果不可能将元素推入队列,则可以返回null,否则,返回推入的元素。但请注意,“推送”抛出异常是完全没有问题的。例如,如果queue2为空,它可能会抛出NPE。

同样,这是高度基于观点的,所以对我的观点持保留态度。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23948345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档