class ThrowNull {

public static void main(String[] args) {

throw null;

}

}

我们知道throw的规则是throw ThrowableInstance;,其中ThrowableInstance必须是Throwable类型的对象或Throwable的子类。

简单类型(如int或char)以及非Throwable类(如String和Object)不能用作异常。 null是一个特殊的Java文字,表示空值。

那么为什么throw null;会在这段代码中编译?

为什么会导致编译时错误?

虽然目前Java编译器本身没有将其标记为问题(除非语言规范在未来某个时间发生变化),但它显然是像"声纳"这样的静态检查器的候选者,可以根除并向开发人员指出。 也许开发人员想写"return null"......

我们知道规则是调用String a() {return null}的结果必须是(子)类或String的对象。 像Throwable或BigInteger这样的简单类不能用作字符串。 Null是一个特殊的Java文字,表示空值。 那么为什么return null没有创建任何编译时错误????? !!!! 我在这里暴露你的双重标准。 你为什么抱怨throw null而不是return null? 因此,我无法提出你的问题。 它通过双重标准过于本地化。

根据语言规范,throw语句定义为:

throw Expression

如果Expression计算为null,则抛出NullPointerException。特别,

If evaluation of the Expression completes normally, producing a null value, then an instance V' of class NullPointerException is created and thrown instead of null.

由于NullPointerException扩展RuntimeException,因此它是未经检查的异常。这可以解释为什么没有报告此构造的编译时错误。

所以null以某种方式转换为NullPointer异常,但是如果我抛出一个String或一个数字呢?我给出了运行时异常并说No exception of type String can be thrown; an exception type must be a subclass of Throwable为什么会这样?

它并不是"以某种方式转换"为NPE。语言规范说当throw获取空值时,它需要创建并抛出NullPointerException。它确实如此。规范说,throw必须给出"1)引用类型的变量或值,它可以赋值(5.2)到Throwable类型,或者2)null引用"。其他任何东西都会导致编译器错误。

还不清楚你期望语言做什么。当预期值但接收到null时,通常会抛出NullPointerException(例如,参见java.io.File的构造函数)。但是,投掷任意物体并没有明显的正确行为。 (它会生成一个异常吗?哪一个?检查或取消选中?或者你是否期望捕获一个任意对象?你会catch(String s),还是catch("oops")?)让编译器拒绝不清楚的东西往往比可能出人意料的要好运行时的行为。

编译器没有检查很多东西,它假设你做了一些它可能不知道的好理由。它试图阻止的是开发人员常犯的错误。

有人可能认为这是一个很好的简写

Integer i = null;

try {

i.intValue();

} catch (NullPointerException npe) {

System.err.println("Caught NPE");

npe.printStackTrace();

}

try {

throw null;

} catch (NullPointerException npe) {

System.err.println("Caught NPE");

npe.printStackTrace();

}

用Java 6更新38打印

Caught NPE

java.lang.NullPointerException

at Main.main(Main.java:9)

@DanielWerner所有异常和错误,甚至可以捕获OutOfmemoryError和ThreadDeath。 ;)看看我的例子。

我认为因为Null可以被转换为任何类型的引用。所以在编译时它没有错,如果你抛出null而不是throwable。

究竟。返回String的方法可能返回null。为什么字符串变量可以为null但是Throwable变量不能? OP肯定是短视(x)或练习双重标准。

听起来不错,但事实并非如此。看到接受的答案。

在generel,而不仅仅是扔。任何对象变量都可以赋值为null。所以我们可以看到抛出并不是特例。应该是吗?也许。它一致吗?是。

java中任何变量都可以被赋值为null,关于异常处理:为什么“throw null”没有在Java中创建编译错误?...相关推荐

  1. java中任何变量都可以被赋值为null,java中当给一个对象赋值为null时发生了什么...

    比如下面的代码 String[] arr = new String[10]; arr=null; 将arr这个引用置空,不指向任何对象. 上面new的那个数组对象,则没有任何引用指向它,垃圾回收器可以 ...

  2. java类中静态变量是如何被赋值的

    我们知道java中类加载的过程分为:加载.连接.初始化,其中连接阶段又分为验证.准备和解析,准备阶段的动作就是为类的静态变量分配内存,并将其设置为一个默认值,java中各种数据类型的默认值如下: 数据 ...

  3. python中的变量和数组的赋值和地址的关系

    若程序中只是使用数据的值,那么和地址没什么关系,但若做为程序检测某个地址中的数据变化,则可能会出现问题 同名变量赋值 变量被常量赋值,会修改变量的地址,变量之间赋值,会将值和地址都赋值 a=448 b ...

  4. Java 中把声明变量的语句如果写在循环体内,每次执行时栈内存中的变量和数据是如何变化的?

    问题一:如下面的代码示例 1,JVM 是不是会反复回收旧的变量 a 再重新创建新的变量 a 呢?还是旧的变量 a 一直保留在栈内,只是反复赋值 0 而已呢? 代码示例 1: while (true) ...

  5. 如何理解JavaScript中给变量赋值,是引用还是复制

    一.JavaScript中值的类型 JavaScript中的值分为2大类:基本类型和引用类型.每种类型下面又分为5种类型. 基本类型: 数字类型:Number:字符串类型:String:布尔类型:Bo ...

  6. java尚未初始化变量问题

    java尚未初始化变量问题 有时候,我们在写代码时,会遇到尚未初始化时的问题而编译出错,在java程序中,任何变量都必须初始化后才使用. 比如下面这个代码: import java.util.Scan ...

  7. python中的变量的引用_python中的变量引用小结

    python的变量都可以看成是内存中某个对象的引用.(变量指向该内存地址存储的值) 1.python中的可更改对象和不可更改对象 python中的对象可以分为可更改(mutable)对象与不可更改(i ...

  8. 【转】Java类成员变量默认初始化规则

    一个变量作为类成员使用的时候,如果没有被初始化,java会为其分配默认值: -------------------------------------------------------------- ...

  9. python中一切数据都是对象吗_python中的深拷贝(deepcopy)和浅拷贝(copy)

    前言 在很多语言中都存在深浅拷贝两种拷贝数据的方式,Python中也不例外.本文中详细介绍了Python中的深浅拷贝的相关知识,文章的内容包含: 对象.数据类型.引用 赋值 浅拷贝 深拷贝 一.Pyt ...

最新文章

  1. TIOBE 9 月排行榜:C++ 式微,第 3 名被 Python 拿下
  2. 【ROM修改教程】添加高级电源重启菜单(安卓4.0.4官方ROM)
  3. php提交后清楚表单缓存,PHP提交表单后如何控制缓存 | 学步园
  4. wx.navigateTo的url不生效的问题
  5. 问题 D: AC自动机(二分,第一个等于和最后一个等于)
  6. 计算机必记快捷键,电脑常用的快捷键,记住这些快捷键让你瞬间变成电脑高手...
  7. 编译rocksdb源码导致的部署失败
  8. 有没有比python更简单的语言排名_5月语言排行榜:R跌出前二十 Python紧咬C++
  9. 英语计算机职称考试查询成绩,北京职称外语计算机成绩长期有效
  10. inno setup相关 (二)
  11. linux中根据进程的PID值来查找执行文件的及其路径
  12. 软件工程期末考试复习(二)
  13. 基于Android Studio游戏开发 飞机大战小游戏
  14. Unity在NGUI中默认动态字体Arial字体显示不完整解决方案
  15. 韦东山之学习笔记——NOR Flash
  16. C++实现二叉树的非递归遍历
  17. 基于神经网络和相关性分析的数学建模思路分享
  18. 为什么你的温湿度传感器测不准?
  19. BZZ节点如何成为有效节点,BZZ节点优势
  20. 屁孩君儿子讲解 2022 【例4.7】最小n值

热门文章

  1. 椭圆曲线ECC倍点运算forJava
  2. oracle x kglob,x$kglob/x$kgltr 中library cache信息查看(结果同dump内容)
  3. Linux下安装ORACLE(一周成果、全是干货!)
  4. 数学建模论文写作学习——数模论文概述
  5. 测试上线邮件书写规范
  6. requests库安装和简单功能学习总结
  7. 网络上博弈——博弈匠心——真正的匠人精神
  8. 摄像模组中光学相关知识(三)
  9. python 排名函数_分数排名(Python),成绩,排序,python
  10. 如何检验有调节的中介作用?