大家经常在讨论业务中如何使用异常,异常的性能如何等。
第一个问题 : uncheck 异常,check 异常 异常使用的原则
1、如果调用者有责任在调用前检查必要状态,但没检查,就抛出uncheck异常
一般要提供给调用者判断方法,如果他不调用,则是一个编程错误,就应该使用uncheck异常
private float balance;
/**
* <pre>
* 在扣款前调用本方法判断
* </pre>
* @param amount
* @return true 可以消费,false 余额不够
*/
boolean canConsume(float amount){
return balance > amount ? true : false;
}
/**<pre>
* 消费扣款
* 在使用前,要判断余额是否够,
* 调用canConsume(float amount)
* </pre>
* @param amount 消费金额,正数
*/
void consume(float amount){
if(amount > balance ) throw new IllegalArgumentException("amount too large");
balance -= amount;
}
void invoke(){
if(canConsume(50)){
consume(50);
}
}
2、如果是不调用者责任,而是本函数的责任,就必须声明抛出异常,check异常。
/**<pre>
* 消费扣款
* 在使用前,要判断余额是否够,
* 调用canConsume(float amount)
* </pre>
* @param amount 消费金额,正数
* @throws BalanceException 余额不足
*/
void consume(float amount) throws BalanceException{
if(amount > balance ) throw new BalanceException("amount too large");
balance -= amount;
}
void invoke(){
try {
consume(500);//消费
sendGift();//配送礼品
} catch (Exception e) {
// TODO: handle exception
notifyBalanceLack();//通知余额不足
}
}
第一个问题 : 异常是否影响性能
异常肯定影响性能。
实例化异常时,要调用超类Throwable中的 public synchronized native Throwable fillInStackTrace();
填充线程调用堆栈,这个方法是同步的,肯定影响性能。
如果业务异常不需要堆栈信息,可以覆盖:
@Override
public Throwable fillInStackTrace() {
return this;
}
我做了一个测试,并发线程10个,每个线程生成10000000个普通对象,一般异常,和覆写了不带同步的fillInStackTrace()的异常,时间是:
普通对象: 89673 毫秒
一般异常: 568413 毫秒
覆写fillInStackTrace()异常: 40424 毫秒
很明显,覆写fillInStackTrace()异常 性能最高。
分享到:
相关推荐
该研究依托于Numenta公司公开的NAB(Numenta Anomaly Benchmark)数据集,该数据集被设计用于评估实时数据流中异常检测算法的性能。NAB数据集包含多个不同的单列数据集,这些数据集模拟了真实的、时间序列的监控数据...
Boomerang就是一小段...雅虎异常性能小组列出了Boomerang可以胜任的监测工作:某个页面可感知的性能表现——考虑的是用户打开页面的那段时间动态页面性能用户带宽组件加载时间网络延迟 标签:Boomerang
#### 四、项目组不同角色对软件性能的看法 - **系统管理员**关心的是系统在高负载下的稳定性、可扩展性和资源使用效率。 - **研发人员**聚焦于架构设计的合理性、代码效率和资源管理策略。 - **测试人员**负责监控...
* 各级管理人员对品质的看法:各级管理人员对品质的看法不同,高层管理人员认为品质是企业的生命线,中层管理人员认为品质是提高生产效率的重要手段,基层管理人员认为品质是提高产品质量的重要手段。 二、品质异常...
在描述中,虽然没有提供具体的技术细节,但可以感受到作者对Java的喜爱和推崇,认为其性能优秀,值得下载和学习。然而,为了更深入地理解Java,我们需要学习它的语法、核心概念以及如何使用各种库和框架来解决问题。...
demo验证JNI的想法,通常涉及以下几个步骤:首先,开发者会在Java层创建一个接口,该接口定义了需要在本地实现的方法。接下来,开发者会使用C或C++编写这些方法的具体实现,并编译成动态链接库(.so文件)。之后,...
这种做法可以保持项目运行的稳定性,但可能会牺牲一些新版本中增加的功能或性能改进。 2. 使用兼容层:兼容层是一种可以用来隔离和解决不同版本依赖关系的软件工具。它允许项目代码在一个隔离的环境中运行,不直接...
而异常现象描述则是报告单的核心,它详细记录了具体的质量问题,这些问题可能涉及到产品的外观、性能、尺寸、安全性能等各个方面,也是后续分析和改进的依据。 经办人的部分则是记录和追踪报告单流转的责任人,他们...
压缩感测理论提出了从几次测量中恢复稀疏信号的想法。 本文将无线传感器网络中的异常事件检测和定位公式化为压缩感知问题。 在假设传感器的传输信号为二进制的情况下,分析了基本追踪算法与乘法器交替方向法以及...
"MindReader: 搜寻您最深的想法...自动无监督的异常脑电信号检测工具" 是一个创新项目,旨在利用先进的技术帮助分析和理解人类大脑的活动。该项目以"读心者"的形象来表现其核心功能,即通过无监督的学习算法探测并...
在实际应用中,我们可能会遇到数据缺失、异常值或多重共线性等问题,需要预处理数据。Matlab提供了诸如`fillmissing`、`isoutlier`和`regress`等函数来处理这些问题。同时,正则化技术如LASSO和Ridge回归可以帮助...
这篇文章将分享一些关于Java学习的心得和重要知识点,希望能为迷茫中的学习者提供指导。 首先,Java的基础至关重要。这包括理解基本语法、数据类型、运算符、流程控制语句等。这些是构建任何程序的基础,对于初学者...
"我正在测试一些想法并摆脱其他想法"这部分描述揭示了Wax当前的开发状态,即处于一个探索和优化的过程中。模糊测试工具的设计通常涉及到如何生成有效的测试输入、如何覆盖更多的代码路径、如何快速检测到异常等复杂...
在算法开发和实现方面,Matlab具有以下一些好处: 1. 丰富的数学和科学函数库:Matlab提供了广泛的数学、信号处理、图像处理、优化、统计等领域的函数库,这些函数库可以帮助开发者快速实现各种复杂的数值计算算法。...
以下是对标题“有用的东西:我对常见Java库的看法以及一些技巧”的详细解读。 首先,让我们来看看几个备受开发者喜爱的Java库: 1. **Guava**:Google提供的核心库,包含大量Java语言基础类的增强,如集合、缓存、...
标题与描述概述的是个人对Hibernate框架的理解与观点,这一部分提到了Hibernate在处理数据库操作时的一些关键特性,如事务管理、对象持久化以及查询优化等。以下是对这些知识点的详细阐述: ### Hibernate框架简介 ...
异常处理是C++新增的特性之一,作者同样对异常处理提出了自己的看法,包括何时使用异常是合适的,何时则不应该使用。异常处理机制可以处理程序运行时出现的异常情况,但是滥用异常会导致代码难以理解和维护。因此,...
此外,开发者还需要权衡性能开销和用户体验,因为监控Runloop可能会带来一定的性能损耗。 通过在Runloop中实施异常处理和挽救策略,可以有效地提高iOS应用在发生崩溃时的用户体验,使应用能够更加健壮和用户友好。...
例如,Java的性能在某些情况下不如一些底层语言如C或C++,这是因为Java运行在JVM上会有一些额外的性能开销。对于个人用户而言,除非是在对性能要求极高的场景下,否则Java的性能一般足以应对日常的开发任务,因此...