首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

.Net 2+:为什么if(1 == null)不再抛出编译器异常?

在.NET 2及以后的版本中,if(1 == null)不再抛出编译器异常,这是因为C#编译器在这种情况下进行了优化。在C#中,null是一个特殊的关键字,表示一个空引用。在这个例子中,1是一个整数值,而不是一个引用类型的对象,因此它不能与null进行比较。

在.NET 2之前,这种情况会导致编译器异常,因为它无法确定如何比较整数和null。但是从.NET 2开始,C#编译器对这种情况进行了优化,使得编译器可以在编译时自动识别出这种不兼容的比较,从而避免了运行时错误。

这种优化使得C#编程更加安全和高效,因为它可以在编译时检测出潜在的错误,而不是在运行时抛出异常。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【读码JDK】-java.lang包介绍

//todo getCause 为什么需要加synchronized? printStackTrace 导致内存异常?...但不使用该注解,编译器还是会将满足功能接口定义的任何接口视为功能接口 IllegalAccessError 如果应用程序尝试访问或修改字段,或调用其无权访问的方法,则抛出异常。...搜索的类定义在编译当前正在执行的类时存在,但无法再找到该定义 NoSuchFieldError 如果应用程序尝试访问或修改对象的指定字段,并且该对象不再具有该字段,则抛出异常。...NoSuchFieldException 表示该类没有指定名称的字段 NoSuchMethodError 如果应用程序尝试调用类的指定方法(静态或实例),并且该类不再具有该方法的定义,则抛出异常。...NoSuchMethodException 无法找到特定方法时抛出 NullPointerException 当应用程序在以下情况尝试使用null抛出。 这些包括: 调用null对象的实例方法。

1.5K20

sql2java:一次外科手术式的bug修复过程

从上面的异常信息可以看出异常发生在net.sourceforge.sql2java.Column的getJavaType方法。但我却毫无办法,因为没有源码。...获取源码 要查找BLOB抛出异常的原因,首先得有源码。...我急切的找到抛出异常的getJavaType方法 哈哈,果然如我所料,只是一个简单的bug。...如下,代码很简单就是一个switch语句针对不同的类型返回不同的类型字符串,case语句中有CLOB却缺少了针对BLOB类型的语句(执行到tiae();就抛出异常),这就可以解释为什么CLOB类型可以正常生成代码了...不再抛出异常! 我靠!原来解决问题这么简单?! 不靠谱的反编译器jd-gui 上一阶段生成java代码的确是不报错了,但是新的问题来了。

1K60

Java异常面试题(2020最新版)

在有效使用异常的情况下,异常能清晰的回答what, where, why这3个问题:异常类型回答了“什么”被抛出异常堆栈跟踪回答了“在哪”抛出异常信息回答了“为什么”会抛出。 ...编译器会检查此类异常,也就是说当编译器检查到应用中的某处可能会此类异常时,将会提示你处理本异常——要么使用try-catch捕获,要么使用方法签名中用 throws 关键字抛出,否则编译不通过。 ...但是你一旦对一段代码加上try,就等于显示地承诺编译器,对这段代码可能抛出异常进行捕获而非向上抛出处理。...譬如:调用null对象的实例方法、访问null对象的属性、计算null对象的长度、使用throw语句抛出null等等。  java.lang.NumberFormatException:数字格式异常。...创建一个异常非常慢,抛出一个异常又会消耗1~5ms,当一个异常在应用的多个层级之间传递时,会拖累整个应用的性能。

74230

一个 JDK 线程池 BUG 引发的 GC 机制思考

大概意思是:可达对象(reachable object)是可以从任何活动线程的任何潜在的持续访问中的任何对象;java编译器或代码生成器可能会对不再访问的对象提前置为null,使得对象可以被提前回收。...//模拟ThreadPoolExecutor,启动新建线程后,循环检查线程池状态,验证是否会在finalize中shutdown //如果线程池被提前shutdown,则抛出异常...} //模拟ThreadPoolExecutor,启动新建线程后,循环检查线程池状态,验证是否会在finalize中shutdown //如果线程池被提前shutdown,则抛出异常...[true] 由此可得,如果在执行的过程中,发生一次显式的线程切换,则会让编译器/代码生成器认为外层包装对象不可达 总结 虽然GC只会回收不可达GC ROOT的对象,但是在编译器(没有明确指出,也可能是...线程池的这个问题,在JDK的论坛里也是一个公开但未解决状态的问题https://bugs.openjdk.java.net/browse/JDK-8145304。

51420

一个 Java 线程池bug引发的 GC 机制思考

大概意思是:可达对象(reachable object)是可以从任何活动线程的任何潜在的持续访问中的任何对象;java编译器或代码生成器可能会对不再访问的对象提前置为null,使得对象可以被提前回收 也就是说...//模拟ThreadPoolExecutor,启动新建线程后,循环检查线程池状态,验证是否会在finalize中shutdown //如果线程池被提前shutdown,则抛出异常...} //模拟ThreadPoolExecutor,启动新建线程后,循环检查线程池状态,验证是否会在finalize中shutdown //如果线程池被提前shutdown,则抛出异常...[true] 由此可得,如果在执行的过程中,发生一次显式的线程切换,则会让编译器/代码生成器认为外层包装对象不可达 总结 虽然GC只会回收不可达GC ROOT的对象,但是在编译器(没有明确指出,也可能是...线程池的这个问题,在JDK的论坛里也是一个公开但未解决状态的问题https://bugs.openjdk.java.net/browse/JDK-8145304。

53410

C#开发人员应该知道的13件事情

类型转化时,经常会遇到以下两种情形: 表达式的运行时类型比编译器能推断出的类型更加具体。转换指示编译器将表达式当做更具体的类型来处理。如果你的假设不正确,编译器抛出异常的代码。...转换指示编译器会生成关联表达式的值的代码,如果没有生成,则会抛出异常。例如,从double到integer的转换。 两种类型转换都是很危险的。...第一种类型的转换提出了一个问题,“为什么开发人员知道,而编译器不知道?”如果在这种情况下,尝试更改程序,以便编译器可以成功地推导出正确的类型。...注意竞逐条件 如果事件在线程之间共享,则有可能在你检查null之后并且在调用它之前,另一个线程将删除所有参数 – 就会抛出NullReferenceException异常。...你会收到一个异常抛出

2.2K90

Kotlin中?和!!的区别

= null Log.d("TAG", "-->> List Size = ${myList!!.size}") 编译器为什么自动把myList.size()变成了myList!!....size呢,为什么加上的是感叹号不是问号。 这是因为编译器在转化时为了保证代码转化前后的一致性所造成的。...换句话说,在Java上出异常的,转化到KT上,编译器任然会让他保持抛出异常,NullPointerException也是如此。 所以结合上下文可以看得出,!!...加上去后好像并没有和之前Java代码有什么区别嘛,该null的地方任然会抛出异常。所以大多数情况下都会使用?来检测null,轮不到!!出场。!!...只会在你需要对某对象进行非空判断,并且需要抛出异常时才会使用到。 那我们接下来着重讲解一下?到底怎么用。

1.1K10

Java异常 Throwable、Exception、Error

运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。...譬如:调用null对象的实例方法、访问null对象的属性、计算null对象的长度、使用throw语句抛出null等等 4、java.lang.ClassNotFoundException...捕获异常:try、catch 和 finally try { // 可能会发生异常的程序代码 } catch (Type1 id1){ // 捕获并处置try抛出异常类型Type1...需要注意的是,一旦某个catch捕获到匹配的异常类型,将进入异常处理代码。一经处理结束,就意味着整个try-catch语句结束。其他的catch子句不再有匹配和捕获异常类型的机会。...、Error分析:https://blog.csdn.net/a936687045/article/details/102917582 throwable和Exception的区别:https://blog.csdn.net

2K10

Java异常体系中的秘密

那么,try-with-resources为什么能够避免大量资源释放代码呢?答案是,由Java编译器来帮我们添加finally代码块。...异常屏蔽问题 在try-catch-finally代码块中,如果try块、catch块和finally块均有异常抛出,那么最终只能抛出finally块中的异常,而try块和catch块中的异常将会被屏蔽...编译器将try块和catch块中的异常先存入一个局部变量,当finally块中再次抛出异常时,通过之前异常的addSuppressed()方法将当前异常添加至其异常栈中,从而保证了try块和catch块中的异常不丢失...当执行代码a = a / 0;时发生异常,try块中它之后的代码便不再执行,而是直接执行catch中代码; 在catch块中,当在执行return -1前,先会执行finally块; 由于finally...定义时区分unchecked/checked 异常,避免直接使用RuntimeException抛出, 更不允许抛出 Exception 或者 Throwable,应使用有业务含义的自定义异常

1K100

(25) 异常 (下) 计算机程序的思维逻辑

通过这些信息有助于理解为什么会出异常,这是解决编程错误的常用方法。示例是直接将信息输出到标准流上,实际系统中更常用的做法是输出到专门的日志中。...为什么要重新抛出呢?因为当前代码不能够完全处理该异常,需要调用者进一步处理。 为什么抛出一个新的异常呢?...这个观点的基本理由是,无论是checked还是unchecked异常,无论是否出现在throws声明中,我们都应该在合适的地方以适当的方式进行处理,而不是只为了满足编译器的要求,盲目处理异常,既然都要进行处理异常...对于一个引用变量,如果正常情况下它的值也可能为null,那就应该先检查是不是null,不为null的情况下再进行调用。...在有了异常机制后,程序的正常逻辑与异常逻辑可以相分离,异常情况可以集中进行处理,异常还可以自动向上传递,不再需要每层方法都进行处理,异常不再可能被自动忽略,从而,处理异常情况的代码可以大大减少,代码的可读性

66660

头条三面:toString()、String.valueOf、(String)强转,有啥区别?

)强转时,最好使用instanceof做一个类型检查,以判断是否可以进行强转,否则容易抛出ClassCastException异常。...需要注意的是编写的时候,编译器并不会提示有语法错误,所以这个方法要谨慎的使用。...推荐:Java进阶视频资源 (3)封装类型也无法强转 3、null值问题 (1)toString()报空指针异常 (2)String.valueOf()返回字符串“null” (3)null值强转成功...但在使用时要注意,必须保证object不是null值,否则将抛出NullPointerException异常。采用这种方法时,通常派生类会覆盖Object里的toString()方法。...感谢阅读,希望对你有所帮助 :) 来源:blog.csdn.net/guorui_java/article/details/117935620

59430

null或空值的判断处理

1,错误用法一: if (name == "") {      //do something } 2,错误用法二: if (name.equals("")) {      //do something...name.equals("")) {      //do something } 我们来解说一下: 上述错误用法1是初学者最容易犯,也最不容易被发现的错误,因为它们的语法本身没问题,Java编译器编译时不报错...上述用法二,用法三 的写法,是包括很多Java熟手也很容易犯的错误,为什么是错误的呢?也许你会感到纳闷。...对,它们的写法本身没错,但是,少了一个null判断的条件,试想,如果name=null的情况下,会发生什么后果呢?...后果是,你的程序将抛出NullPointerException异常,系统将被挂起,不再提供正常服务。 当然,如果之前已经对name作了null判断的情况例外。 正确的写法应该先加上name !

3.4K30

C# 可为空引用类型

导致可为空引用类型不尽理想的一些原因在于: 对空值调用成员会导致 System.NullReferenceException 异常抛出,导致生产代码抛出 System.NullReferenceException...减少 NullReferenceException 抛出:降低 NullReferenceException 异常抛出的可能性,具体是通过改进静态流分析,标记出可能存在问题的情况,即调用值成员之一前未显式检查值是否为空...text = null; 通过新增的此语法,就会明白为什么关键的可为空改进是通过看似令人困惑的名称“可为空引用类型”进行概括。...text = null; 减少 NullReferenceException 抛出 支持将类型声明为可为空或不可为空后,至于确定声明是否可能违反规定,现在就取决于编译器静态流分析的选择。...图 1:静态流分析结果示例 string text1 = null; // Warning: Cannot convert null to non-nullable reference string

14720

null或空值的判断处理

1,错误用法一: if (name == "") {      //do something } 2,错误用法二: if (name.equals("")) {      //do something...name.equals("")) {      //do something } 我们来解说一下: 上述错误用法1是初学者最容易犯,也最不容易被发现的错误,因为它们的语法本身没问题,Java编译器编译时不报错...上述用法二,用法三 的写法,是包括很多Java熟手也很容易犯的错误,为什么是错误的呢?也许你会感到纳闷。...对,它们的写法本身没错,但是,少了一个null判断的条件,试想,如果name=null的情况下,会发生什么后果呢?...后果是,你的程序将抛出NullPointerException异常,系统将被挂起,不再提供正常服务。 当然,如果之前已经对name作了null判断的情况例外。 正确的写法应该先加上name !

3K100

Java 中关于 null 对象的容错处理

大意是:原生类型会被自动初始化为 0,但是对象引用会被初始化为 null,如果你尝试调用该对象的方法,就会抛出空指针异常。通常,你可以打印一个 null 对象而不会抛出异常。...第一句相信大家都会容易理解,这是类型初始化的基础知识,但是第二句就让我很疑惑:为什么打印一个 null 对象不会抛出异常?带着这个疑问,我开始了解惑之旅。...String s = null; System.out.print(s); 运行的结果是 null 果然如书上说的没有抛出异常,而是打印了null。显然问题的线索在于print函数的源码中。..."null" : obj.toString(); } 看到这里,我们终于发现了打印 null 对象不会抛出异常的秘密。print方法对 String 对象和非 String 对象分开进行处理。...这种情况,唯一的解释就是编译器动了手脚,天网恢恢,疏而不漏,找不到源代码,我们可以去看看编译器生成的字节码。

54030

浅谈Java异常及其编译时异常和运行时异常的区别

这种异常的特点是Java编译器会检查它,也就是说,当程序中可能出现这类异常,要么用try-catch语句捕获它,要么用throws子句声明抛出它,否则编译不会通过。...运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。...五、一些常见的异常1). runtimeException子类: 1、 java.lang.ArrayIndexOutOfBoundsException 数组索引越界异常。...3、java.lang.NullPointerException 空指针异常。当应用试图在要求使用对象的地方使用了null时,抛出异常。...譬如:调用null对象的实例 方法、 访问null对象的属性、计算null对象的长度、使用throw语句抛出null等等 4、java.lang.ClassNotFoundException

1.3K30
领券