【第47条】不要忽略异常

    作为本章的最后一条,此条目是一条“纪律”,一条你必须遵守的纪律。虽然这是显而易见的道理,但却很容易被违反。

 

    任何一个被抛出的异常都是API设计者有意为之的,其中蕴含了特定的含义,所以千万不能忽略它们!

 

try{
    ......
}catch (Exception e){
}

 

 

    这样的代码并不十分罕见,这有可能是在代码堆砌阶段的“简单写法”,也可能是程序员“偷懒”的写法,当然也有可能是连“何为Exception”都不得而知的“高人”的作品。

 

    这里犯了两个错误。首先,就是本条要强调的,它忽略了捕获来的异常。相当于是把异常抓来,然后“杀”掉它,也就是“装没看见”。

 

    另一个错误是,不该使用异常的超类Exception,而应该“具体异常,具体分析”。

 

    当然,有些场合还是需要“忽略掉”异常的,但至少要在catch块中写明注释,这里为什么要忽略掉某种异常。而且这种情况的出现率绝不能太高。

 

 

【Effective Java 学习笔记】系列连载专题请见:
http://tonylian.iteye.com/categories/64208

 

### 在 MATLAB 中检测和处理数据中的异常值 在 MATLAB 中,检测和处理数据中的异常值可以通过多种方法实现。以下将详细介绍常见的方法及其具体实现。 #### 基于 3σ 原则的异常值检测 对于正态分布的数据,可以使用 3σ 原则来检测异常值。任何偏离均值超过 3 倍标准差的点都可以被视为异常值[^2]。 ```matlab % 示例数据 x = [48, 51, 57, 57, 49, 86, 48, 53, 59, 50, 48, 47, 53, 56, 60]; % 计算均值和标准差 u = mean(x, 'omitnan'); % 忽略缺失值计算均值 sigma = std(x, [], 'omitnan'); % 计算标准差 % 确定异常值区间 lb = u - 3 * sigma; % 下界 ub = u + 3 * sigma; % 上界 % 找出异常值索引 tmp = (x < lb) | (x > ub); ind = find(tmp); disp('异常值索引:'); disp(ind); ``` #### 使用箱线图检测异常值 箱线图是一种基于四分位数范围(IQR)的方法,可以用来检测数据中的异常值。任何低于 Q1 - 1.5 * IQR 或高于 Q3 + 1.5 * IQR 的点都被视为异常值[^1]。 ```matlab % 示例数据 data = [48, 51, 57, 57, 49, 86, 48, 53, 59, 50, 48, 47, 53, 56, 60]; % 计算四分位数 Q1 = prctile(data, 25); % 第一四分位数 Q3 = prctile(data, 75); % 第三四分位数 IQR = Q3 - Q1; % 四分位数范围 % 确定异常值区间 lowerBound = Q1 - 1.5 * IQR; upperBound = Q3 + 1.5 * IQR; % 找出异常值索引 outliers = data((data < lowerBound) | (data > upperBound)); disp('箱线图检测到的异常值:'); disp(outliers); ``` #### 异常值处理方法 一旦检测到异常值,可以选择以下几种方法进行处理: - **删除异常值**:直接从数据集中移除异常值。 - **替换异常值**:用均值、中位数或其他合理值替换异常值。 - **调整异常值**:将异常值限制在一定范围内,例如将其设置为上下界的值。 ```matlab % 删除异常值 data_cleaned = data(~((data < lowerBound) | (data > upperBound))); disp('删除异常值后的数据:'); disp(data_cleaned); % 替换异常值为均值 data_replaced = data; data_replaced((data < lowerBound) | (data > upperBound)) = mean(data); disp('替换异常值为均值后的数据:'); disp(data_replaced); ``` #### 使用统计工具箱中的函数 MATLAB 的统计工具箱提供了 `isoutlier` 函数,可以直接用于检测和处理异常值[^1]。 ```matlab % 检测异常值 TF = isoutlier(data); % 找出异常值索引 outlier_indices = find(TF); disp('isoutlier 检测到的异常值索引:'); disp(outlier_indices); % 删除异常值 data_no_outliers = data(~TF); disp('删除异常值后的数据:'); disp(data_no_outliers); ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值