如何正确处理图形上下文 - 我最后需要尝试吗?(Java 1.7)

Ern*_*dis 3 java swing graphics2d try-finally java-7

如何正确处理图形上下文 - 我需要使用tryfinally吗?简单的例子:

public void paint(Graphics g) {

    Graphics2D g2d = (Graphics2D) g.create();

    try {

        g2D.drawLine(0, 0, 10, 0);

    } finally {
        g2d.dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑

这是java.awt.Window类的一个例子:

     /**
     * {@inheritDoc}
     *
     * @since 1.7
     */
    @Override
    public void paint(Graphics g) {
        if (!isOpaque()) {
            Graphics gg = g.create();
            try {
                if (gg instanceof Graphics2D) {
                    gg.setColor(getBackground());
                    ((Graphics2D)gg).setComposite(AlphaComposite.getInstance(AlphaComposite.SRC));
                    gg.fillRect(0, 0, getWidth(), getHeight());
                }
            } finally {
                gg.dispose();
            }
        }
        super.paint(g);
    }
Run Code Online (Sandbox Code Playgroud)

依我之见,用来构造非常简单,但tryfinally依然存在.所以我认为使用它们是一个好习惯.

Ted*_*opp 5

在这个简单的例子中,没有必要try..finally; g2D.drawLine不会抛出异常.1但是,如果try可能的主体抛出异常,执行return语句或以其他方式异常终止该paint方法,那么我建议try..finally确保正确处理上下文.

1 我想,它可以抛出一个OutOfMemoryError或其他一些未经检查的异常.但是,如果它这样做,处理Graphics2D上下文将是您遇到的最少问题.