【问题标题】:Counting Thrown Exceptions计算抛出的异常
【发布时间】:2014-04-20 03:22:24
【问题描述】:

我有一个 WelcomeException 类并且我已经抛出了我的异常,但现在我试图弄清楚如何计算抛出异常的次数,然后打印该计数。

代码如下:

public class WelcomeException extends Exception {

    public WelcomeException( String message ) {
         super( message );
    }

}

【问题讨论】:

    标签: java class exception count throw


    【解决方案1】:
    public class WelcomeException extends Exception {
        private static int count = 0;
        private static final Object countLock = new Object();
    
        public WelcomeException(String message)
        {
            super(message);
            synchronized(countLock)
            {
                count++;
            }
        }
    
        public static int getCount()
        {
            return count; //atomic. Doesn't need synchro.
        }
    } 
    

    您对另一个答案的评论:

    现在,如果我想在错误消息中打印计数以查看:我 知道我放了:错误打印消息 {count} 次我该怎么办 那?如果这个问题是基本的,我很抱歉。我很新。

    为此,请像这样覆盖getMessage() 方法:

    public String getMessage()
    {
        return 
              super.getMessage() + 
              ", This exception has occurred " + 
              getCount() + 
              " times";
    }
    

    【讨论】:

    • @fge 我个人更喜欢同步原语。它让我更了解我的程序(我从低级开始学习同步)。
    • 嗯,好的,但是不,.getCount() 在这里不是原子的
    • @fge 请详细说明
    • 两个线程A和B;按时间顺序:A 获得锁定; B得到计数; A 递增计数; A 解锁 new()。这只是两个线程。现在想象一下 A1、A2 等与 B。
    • @fge 没关系。再多的同步也无法解决这个问题。同步保证了对象的一致性。无论如何,东西在这里锁定的顺序是任意的。如果方法是同步的,从公共 api 的角度来看,可能会发生同样的问题
    【解决方案2】:

    你可以有一个静态变量(类变量)来计算异常被抛出的次数:

    private static int count = 0;
    

    并在构造函数中增加它

    public WelcomeException(String message) {
        super(message);
        count++;
    }
    

    所以当你抛出异常时它会增加

    throw new WelcomeException("...");
    

    然后你可以定义一个getter方法:

    public static int getCount() {
        return count;
    }
    

    并像这样打印结果:

    System.out.println("WelcomeException has been thrown " + WelcomeException.getCount() + " times.");
    

    【讨论】:

    • 哦,非常感谢!现在,如果我想在我的错误消息中打印计数以查看:我知道我输入了:错误打印消息 {count} 次我该怎么做?如果这个问题是基本的,我很抱歉。我很新。
    • 对于线程安全版本使用AtomicInteger 而不是int 然后你可以count.increment()
    • 哎呀。我把: throw( new WelcomeException( "Error printing message " ) );但是如何添加计数?
    • 好的!为什么我在消息和计数之间没有空格?我的打印结果给了我这个输出:Error printing message0 times.
    • 如果添加空格,则必须显示空格。检查那里是否有空间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    相关资源
    最近更新 更多