当应用程序试图零在需要对象的情况下使用时抛出。这些包括:
-
<李>调用零对象的实例方法。李>
<李>访问或修改空对象的字段。李>
<李>把长度零当作一个数组。李>
<李>像访问或修改空阵列一样访问或修改插槽。李>
<李>投掷零就好像它是一个Throwable价值。李>
<李>应用程序应该抛出此类的实例来指示零对象的其他非法使用。李>
<李> NullPointerException对象可以由虚拟机构造,就像抑制被禁用和/或堆栈跟踪不可写一样。李>
为什么我们需要空值吗?
-
<李>如前所述,nullJava是一种特殊的值。李>
<李>它在编码某些设计模式(如空对象模式和单例模式)时非常有用。李>
<李>空对象模式提供了一个对象作为缺少给定类型对象的代理。李>
<李>单例模式确保只创建一个类的一个实例,并且旨在提供对象的全局访问点。李>
例如,最多创建一个类实例的示例方法是将其所有构造函数声明为私有的,然后创建一个返回该类的唯一实例的公共方法:
TestSingleton.java:
进口java.util.UUID; 单例类{ 私有静态单例单=零; 私人字符串ID=零; 私人单例(){/*私人,为了防止创建新实例 *单例类。*/.toString ID=UUID.randomUUID () ();//创建一个随机的ID。 } 公共静态单例getInstance () { 如果(单==null) 单=new Singleton (); 返回单; } 公共字符串getID () { 返回this.ID; } } 公开课TestSingleton { 公共静态void main (String [] args) { 单s=Singleton.getInstance (); System.out.println (s.getID ()); } } >之前在这个例子中,我们声明了一个单例类的静态实例。该实例在该getInstance方法内最多初始化一次。注意使用零启用唯一实例创建的值。
为了避免这种情况NullPointerException,请确保在使用它们之前,所有对象都已正确初始化。注意,当你声明一个引用变量时,你真的创建了一个指向对象的指针。在向对象请求方法或字段之前,您必须验证指针是否为空。
另外,如果引发异常,请使用驻留在异常堆栈跟踪中的信息。执行的堆栈跟踪由JVM提供,以启用应用程序的调试。找到捕获异常的方法和行,然后确定哪个引用等于在特定行中为null。
在本节的其余部分中,我们将介绍一些处理上述例外的技术。但是,它们并没有消除这个问题,程序员在编写应用程序时应该小心。
<强> 1。字符串与文字的比较强>
应用程序执行代码中的一个非常常见的情况涉及字符串变量和文字之间的比较。文字可以是一个字符串或枚举的元素。不要从空对象调用方法,而应考虑从文字中调用它。例如,观察以下情况:
字符串str=零; 如果(str.equals(“测试”)){/*这里的代码将不会被触发,因为会抛出异常。*/} >之前上面的代码片段会抛出一个NullPointerException。但是,如果我们从文字中调用方法,那么执行流程通常会继续:
字符串str=零; 如果“测试”.equals (str)) {/*正确的用例。不会抛出异常。*/} >之前<强> 2。检查方法的参数
强>在执行你自己的方法的主体之前,一定要检查它的参数为空值,只有在正确检查了参数后,才继续执行该方法。否,则您可以抛出一个IllegalArgumentException并通知调用方法传递的参数有问题。
例如:
公共静态int getLength (String s) { 如果(s==null) 抛出新的IllegalArgumentException(“参数不能为空"); 返回s.length (); } >之前<强> 3。优先使用字符串。返回对象的值()方法代替toString() 强>
当您的应用程序代码需要对象的字符串表示形式时,请避免使用该对象的toString方法。如果你的对象的引用等于空,NullPointerException则会抛出。
相反,考虑使用静态String.valueOf方法,该方法不会抛出任何异常并打印“空”,以防函数的参数等于零。
<强> 4。使用三元运算符强>
. lang。NullPointerException如何处理空指针异常的实现