Effective Java笔记(27)消除非受检的警告

《Effective Java》第27条:消除非受检的警告 如果无法消除警告,同时可以证明引起警告的代码是类型安全的,(只有在这种情况下)才可以用一个 @SuppressWarnings(“unchecked”) 注解来禁止这条警告。但是如果忽略(而不是禁止)明知道是安全的非受检警告,那么当新出现一条真正有问题的警告时,你也不会注意到。尽量消除非受检警告,不要忽略他们,如果确实无法消除警告,并且能确定该警告不会引起运行时候的问题,可以在最小范围内使用@SuppressWarnings(“unchecked”) 注解,并且要把禁止该警告的原因写到注释上。 阅读详情

        用泛型编程时会遇到讲多编译器警告 : 非受检转换警告( unchecked cast warning )、非受检方法调用警告、非受检参数化可变参数类型警告( unchecked parameterized vararg type warning),以及非受检转换警告( unchecked conversion warning ) 。 当你越来越熟悉泛型之后,遇到的警告也会越来越少,但是不要期待一开始用泛型编写代码就可 以正确地进行编译 。

        有许多非受检警告很容易消除 。 例如,假设意外地编写了这样一个声明 :

Set<Lark> exaltation = new HashSet();

        编译器会细致地提醒你哪里出错了 :

        你就可以纠正所显示的错误,消除警告 。 注意,不必真正去指定类型参数,只需要用在 Java 7 中开始引人的菱形操作符( diamond operator) ( < > )将它括起来即可 。 随后编译器就会推测出正确的实际类型参数(在本例中是 Lark):

Set<Lark> exaltation = new HashSet<>();

        有些警告非常难以消除 。 本文主要介绍这种警告示例 。 当你遇到需要进行一番思考的警告时,要坚持住 !要尽可能地消除每一个非受检警告 。 如果消除了所有警告,就可以确保代码是类型安全的这是一件很好的事情 。 这意味着不会在运行时出现 ClassCastException 异常,你会更加自信自己的程序可以实现预期的功能 。

        如果无法消除警告 ,同时可以证明引起警告的代码是类型安全的,(只有在这种情况下 )才可以用一个@SuppressWarnings ("unchecked")注解来禁止这条警告 。 如果在禁止警告之前没有先证实代码是类型安全的,那就只是给你自己一种错误的安全感而已 。 代码在编译的时候可能没有出现任何警告, 但它在运行时仍然会抛出 ClassCastException异常 。 但是如果忽略(而不是禁止)明知道是安全的非受检警告那么当新出现一条真正有问题的警告时,你也不会注意到 。 新出现的警告就会淹没在所有的错误警告声当中 。

        SuppressWarnings 注解可以用在任何粒度的级别中,从单独的局部变量声明到整个类都可以。 应该始终在尽可能小的范围内使用 SuppressWarn ings 注解 。 它通常是个变量声明,或是非常简短的方法或构造器 。 永远不要在整个类上使用 SuppressWarnings ,这么做可能会掩盖重要的警告 。

        如果你发现自己在长度不止一行的方法或者构造器中使用了 SuppressWarnings 注解,可以将它移到一个局部变量的声明中 。 虽然你必须声明一个新的局部变量,不过这么做还是值得的 。 例如,看看 ArrayList 类当 中的 toArray 方法 :

public <T> T[] toArray(T[] a) {
     if (a.length < size)
        return (T[]) Arrays.copyOf(elements, size, a.getClass());
     System.arraycopy(elements, 0, a, 0, size);
     if (a.length > size)
        a[size] = null;
     return a;
}

        如果编译 ArrayList ,该方法就会产生成这条警告 :

        将 SuppressWarnings 注解放在 return 语句中是合法的,因为它不是声明。 你可以试着将注解放在整个方法上,但是在实践中千万不要这么做,而是应该声明一个局部变量来保存返回值,并注解其声明,像这样:

    public <T> T[] toArray(T[] a) {
        if (a.length < size) {
            // This cast is correct because the array we're creating
            // is of the same type as the one passed in,which is T[] .
            @SuppressWarnings ("unchecked") T result =
                    (T[]) Arrays . copyOf(elements, size, a.getClass()) ;
            return result;
        }
        System. arraycopy(elements, 0, a, 0, size);
        if (a.length > size)
            a[size] = null;
        return a;
    }

        这个方法可以正确地编译,禁止非受检警告的范围也会减到最小 。

        每当使用 SuppressWarnings ( “ unchecked " )注解时,都要添加一条注释,说明为什么这么做是安全的 。 这样可以帮助其他人理解代码,更重要的是,可以尽量减少其他人修改代码后导致计算不安全的概率 。 如果你觉得这种注释很难编写,就要多加思考 。 最终你会发现非受检操作是非常不安全的 。

        总而言之,非受检警告很重要 ,不要忽略它们。每一条警告都表示可能在运行时抛出ClassCastException 异常 。 要尽最大的努力消除这些警告。如果无法消除非受检警告,同时可以证明引起警告的代码是类型安全的就可以在尽可能小的范围内使用@SuppressWarnings("unchecked")注解禁止该警告 。 要用注释把禁止该警告的原因记录下来。

echarts的坐标轴处理算法 参考原文:https://www.cnblogs.com/vicky-li/p/11653415.html。2、可用于双轴的情况,指定splitNumber,保证左右两边的线没有交叉显示的情况。1、设置echarts显示的最大最小值,让数据显示比较有起伏。处理echarts的一些问题。 阅读详情

相关推荐

PTC-6-2004汽轮机性能计算源代码,pycharm-包括试验计算、一类修正、二类修正-以CC350-16.7/0.98/0.5/538/538型汽轮机为例,5万7千字,过程不易欢迎打赏

汽轮机性能计算完整源代码-简化试验-包括试验计算一类修正计算和二类修正计算目录图 1 工程结构。

weixin_43441028的博客 999

Java取消警告SuppressWarnings注解

SuppressWarnings是Java提供的一个注解(annotation),用于告诉编译器忽略特定的告警信息。这在某些情况下是非常有用的,特别是当你确定某个警告是安全的,或者是由第三方引起的且你也无法修改时。

OceanSky的专栏 951

手把手教你用vivado2018.3为复旦微JFMQL15T打IP补丁(含环境变量配置技巧)

本文详细介绍了在Vivado 2018.3环境中为复旦微JFMQL15T开发板打IP补丁的全流程,包括环境变量配置、IP缓存管理等关键步骤。通过实战验证的解决方案,帮助工程师快速搭建开发环境,解决国产芯片开发中的常见问题,提升开发效率。

weixin_30374009的博客 725

异常处理小妙招——3.深入探讨Java异常处理:受检异常与非受检异常的最佳实践

摘要:本文深入解析Java中受检异常与非受检异常的区别与处理策略。受检异常适用于可恢复场景,需强制处理;非受检异常多用于编程错误和系统问题。文章提出异常转换、屏蔽等设计原则,强调避免忽略异常、保持异常信息丰富性等注意事项,并介绍现代Java开发中Optional、函数式编程等异常处理新方式,帮助开发者构建更健壮的应用程序。关键点包括区分异常场景、保持抽象层次、提供充分错误信息及考虑性能影响。

weixin_44385781的博客 1063

vCenter6.7证书过期导致503报错的全面修复指南:从STS证书更新到SSL信任修复

本文详细解析了VMware vCenter 6.7因STS证书过期导致503服务不可用错误的根本原因,并提供了从诊断、更新STS证书到修复SSL信任链的完整解决方案。通过命令行工具检查证书状态,使用官方脚本更新过期STS证书,并利用lsdoctor工具修复深层SSL信任问题,最终指导用户使用certificate-manager彻底重置所有证书,帮助管理员快速恢复vCenter服务。

pz890123的博客 1293

Python自动化脚本:模拟鼠标键盘保持电脑在线状态

在计算机自动化领域,模拟用户输入是一项基础且实用的技术,其核心原理是通过程序生成鼠标或键盘事件来与操作系统交互。这项技术的价值在于能够自动化重复性操作,提升工作效率,并解决特定场景下的系统交互问题。PyAutoGUI作为Python生态中广泛使用的自动化库,封装了跨平台的底层API调用,为开发者提供了简洁统一的接口来实现输入模拟。在实际工程实践中,这类技术常应用于自动化测试、远程办公辅助、数据抓取等场景,帮助用户保持系统活跃状态,防止因无操作导致的锁屏或休眠中断任务。通过合理配置移动间隔和随机化模式,可以更

weixin_28713299的博客 578

第24条:消除非受检警告

许多编译器警告:非受检强制转化警告(unchecked cast warnings)、非受检方法调用警告、非受检普通数组创建警告,以及非受检转换警告(unchecked conversion warnings)。 要尽可能地消除每一个非受检警告。 如果无法消除警告,同时可以证明引起警告的代码是类型安全的,(只有这种情况下才)可以用一个@SuppressWarnings("unchecked")...

爱.NET 287

【ArcGIS遇上Python】ArcGIS10.8 Python代码批量完美实现MODIS NDVI数据格式转换和投影变换

由于论文的需要,将MODIS NDVI数据进行投影变换和格式转换,具体操作可以参照:《ArcGIS10.8完美实现MODIS NDVI数据格式转换和投影变换》,但是该文章中的做法只能一次性实现一景影像的转换,没法批量,虽然ArcGIS中提供了Batch的方法但是需要挨个添加数据,确定输出路径等等,本文就实现以ArcGIS10.8 Python代码批量完美实现MODIS NDVI数据格式转换和投影变换。先来看投影后的效果: 在实现批量投影转换之前,需要两个投影文件:Sinusoidal.prj和MyAl

智慧空间实验室 3815

Effective Java 泛型 第24条:消除非受检警告

非受检警告是什么? 使用泛型进行编程时,编译器会发出许多警告,如:非受检强制装换警告、非受检方法调用警告、非受检普通数组创建警告以及非受检普通转换警告。 为什么要消费非受检警告? 消除了警告就可以确定代码是类型安全的,就意味着不会再出现ClassCastException异常,你会更加自信自己的程序可以实现预期的效果。 有许多非受检警告很容易消除,但也有很难消除。 非受检警告很容易消除例...

yancyang的博客 9021

如何使用VNC对openEuler系统进行远程图形化操作

本文详细介绍了在openEuler系统中配置VNC远程图形化操作的方法。主要内容包括:1)服务端配置:安装GNOME图形界面和TigerVNC服务,创建VNC用户并设置密码,配置VNC服务启动脚本;2)客户端连接:使用VNC Viewer等工具连接服务器;3)常见问题解决方法。通过5901端口建立连接后,用户可远程操作openEuler图形界面,适用于需要图形化管理的场景。

2501_93651177的博客 314

RH850从0搭建Autosar开发环境【17】- Davinci Configurator之DCM模块配置详解(下)

RH850从0搭建Autosar开发环境【17】- Davinci Configurator之DCM模块配置详解(下)

weixin_42412049的博客 2379

《Effective java》读书记录-第24条-消除非受检警告

用泛型编程时,会遇到许多编译器警告:非受检强制转化警告(unchecked cast warnings)、非受检方法调用警告、非受检普通数组创建警告、以及非受检转换警告(unchecked  conversion warnings)。 许多非受检警告很容易消除。有些警告比较难以消除。记住!要尽可能地消除每一个非受检警告。如果消除了所有警告,就可以确保代码是类型安全的。 如果无法消除警告,同时可

sunyx1130的专栏 735

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Effective Java学习笔记第27、28条原生态类型和非受检警告

本书27-33条主要介绍泛型。首先介绍什么是泛型,它的应用场景是什么。然后重点介绍27和28条对于泛型编程的两点意见。一是不要轻易使用原生态类型,二是尽量消除非受检警告。

weixin_50353846的博客 846

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Effective Java 消除非受检警告

使用泛型编程时,会遇到许多编译器警告,如:非受检强制转化警告,非受检方法调用警告,非受检普通数组创建警告,非受检转换警告。当你越来越熟悉泛型之后,遇到的警告也会越来越少,但是不要期待从一开始用泛型编写代码就可以正确的进行编译。 PS:非受检警告就是代码上黄色的感叹号 有许多非受检警告很容易消除,例如: ——HashSet是一个原始类型。泛型类型的引用HashSet < E >应该是参数化的——局部变量的值不使用exaltation1-类型安全:表达式类型的HashS...

菜园子丶For丨丶Tomorrow的博客 225

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

一文读懂《Effective Java》第24条:合理使用@SuppressWarining消除非受检警告

点击上方蓝字关注我们使用泛型编程时,会遇到许多编译器警告,例如:非受检强制转换警告(unchecked east warning)、非受检方法调用警告、非受检普通数组创建警告、非受检转换...

Diligence is the mother of success. 330

Effective Java笔记第四章泛型第二节消除非受检警告

Effective Java笔记第四章泛型 第二节消除非受检警告 1.用泛型编程时,会遇到许多编译器警告:非受检强制转化警告,非受检方法调用警告,非受检普通数组创建警告,以及非受检转换警告。当你越来越熟悉泛型之后,遇到的警告也会越来越少。 2.当你遇到需要进行一番思考的警告时,要坚持住。要尽可能的消除每一个非受检警告。如果消除了所有警告,就可以确保代码是类型安全的,这是一件很好的事情。这意味着不会在运行时出现ClassCastException异常,你会更加自信自己的程序可以实现预期的功能。 3.如果无法消

zh123456_789的博客 891

跟我学(Effective Java 2)第24条:消除非受检警告

第24条:消除非受检警告 用泛型编程时,会遇到许多编译器警告,如:非受检强制转化警告,非受检方法调用警告,非受检普通数组创建警告,非受检转换警告。当你越来越熟悉泛型之后,遇到的警告也会越来越少,但是不要期待从一开始用泛型编写代码就可以正确的进行编译。 有些警告比较难以消除。本章节要介绍这种警告的示例。当你遇到需要进行一番思考的警告时,要坚持住!要尽可能的消除每一个非受检的警告。 如果,消除了所有的...

Dullon_jiang的博客 283

《Effective Java》解读第27条:消除非受检的警告

本文强调应尽可能消除所有编译器非受检警告,确保代码类型安全。建议优先通过修改代码(如使用菱形操作符)消除警告,若无法消除但确定代码安全,可使@SuppressWarnings("unchecked")注解,并添加注释说明原因。注解应限制在最小作用范围,避免掩盖重要警告。文中提供了常见警告类型及示例代码,展示了如何在保证安全性的前提下合理抑制警告。

Cosmoshhhyyy的博客 253

Effective Java 第 24 条:消除非受检警告

用泛型编程时,会遇到许多编译器警告:非受检强制转化警告(unchecked cast warnings)、非受检方法调用警告、非受检普通数组创建警告、以及非受检转换警告(unchecked conversion warnings)。当你越来越熟悉泛型之后,遇到的警告也会越来越少,但是不要期待从一开始用泛型编写代码就可以正确地进行编译。   有许多非受检警告很容易清楚。例如,假设意外的编写了这样一

Come on ! Just Do it ! 3426

effective java(24) 之消除非受检警告

effective java 之消除非受检警告 1、用泛型编程时,会遇到许多编译器警告:非受检强制转化警告(unchecked cast warning)、非受检方法调用警告、非受检普通数组创建警告、非受检转换警告。 2、许多非受检警告很容易消除,如: Set s = new HashSet(); 编译器提醒你  HashSet is a raw type. Referen

Eric的博客 510

Effective Java 3rd 条目27 消除非受检警告

当你用泛型编程时,你将会看见许多编译器警告:非受检强转警告、非受检方法调用警告、非受检参数化vararg类型警告和非受检转换警告。你多熟悉泛型一些,你将获得更少警告,但是不要期待这些新代码干净利索地编译。 许多非受检警告容易消除。例如,假设你不慎编写如下声明: Set&lt;Lark&gt; exaltation = new HashSet(); 编译器会轻轻地告诉你做错了什么: Vene...

tigershin的专栏 359

effective java 第24条 消除非受检警告

第24条 消除非受检警告 该指明类型就尽量指明类型. 不能指明的,则最小化范围的使用@SuppressWarnings(“unchecked”) 并写明原因 不要在类上面用@SuppressWarnings(“unchecked”),不然会覆盖整个类的类型检查 ...

y41992910的博客 306

《Effective Java》读书笔记四

为了提高代码的安全性、可读性和可维护性,应避免使用原生态类型,始终优先使用泛型类型。这样可以充分利用 Java 泛型提供的类型安全保证和其他优势,降低程序出错的风险。

qq_41831136的博客 862

Effective Java学习(泛型)之——消除非受检警告

先来介绍一些术语。声明中具有一个或者多个类型参数的类或者接口,就是泛型(generic)类或者接口。例如,List就只有单个参数类型E,表示列表的元素类型。从技术角度来看,这和接口的名称应该是指现在的List&lt;E&gt;(“读作E的列表”),但是人们经常把它简称为List。泛型类和接口统称为泛型。   用泛型编程时,会遇到许多编译器的警告:非受检强制转换化警告、非受检方法调用警告、非受...

sungang1120的专栏 224

Effective Java 学习笔记之泛型

1.不要在新代码中使用原生态类型1) 声明中具有一个或者多个类型参数的类或者接口就是泛型类或接口 例如List<E>(读作‘E的列表’) 泛型类和接口统称作泛型2)每个泛型都定义一个原生态类型,即不带任何实际类型参数的泛型名称。例如List<E>相对应的原生态类型是List3)使用原生态类型,如果放入的类型不一致,在编译和运行时不会报错,直到从其中取出元素的时候才会收到提示 List

Heqianqian的博客 1112

Effective Java之消除受检警告(二十四)

前记:在我编程过程中,经常会看到代码下面有一条横线,但是自己并没有注意警告的具体内容,一来觉得自己写的程序没有问题,二来,感觉改会很麻烦,这是不好的习惯,如果有这种编程习惯的,都要改正一下啊~ 1.在编程过程,遇到非受检警告,要尽可能地消除,这样才能尽可能保证程序是安全的。 2.如果你能证明它的警告是无效的,即你的代码是安全的,那么请加上@SuppressWarnings吧! 3.为了让读你

heihei 341
上一篇: Effective Java笔记(26)请不要使用原生态类型
下一篇: Effective Java笔记(28)列表优于数组
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值