java出现Exception main threadd "main" java.lang.NullPointerException

当应用程序试图null在需要对象的情況下使用时抛出这些包括:


调用null对象的实例方法。
访问或修改null对象的字段
把长度null当作一个数组。
像访问或修改null阵列一样访问或修改插槽
应用程序应该抛出此类的实例来指示null对象的其他非法使用。 
NullPointerException对象可以由虚拟机构造就像抑制被禁用和/或堆栈跟踪不可写一样。


如前所述nullJava是一种特殊的值。
它在编码某些设计模式(如空对象模式和单例模式)时非常有用
空对象模式提供了一个对象作为缺少给定类型對象的代理。
Singleton模式确保只创建一个类的一个实例并且旨在提供对象的全局访问点。

例如最多创建一个类实例的示例方法是将其所有构慥函数声明为private,然后创建一个返回该类的唯一实例的公共方法:

 
在这个例子中我们声明了一个Singleton类的静态实例。该实例在该getInstance方法内最多初始化一次注意使用null启用唯一实例创建的值。

 
为了避免这种情况NullPointerException请确保在使用它们之前,所有对象都已正确初始化注意,当伱声明一个引用变量时你真的创建了一个指向对象的指针。在向对象请求方法或字段之前您必须验证指针是否为空。
另外如果引发異常,请使用驻留在异常堆栈跟踪中的信息执行的堆栈跟踪由JVM提供,以启用应用程序的调试找到捕获异常的方法和行,然后确定哪个引用等于在特定行中为null
在本节的其余部分中,我们将介绍一些处理上述例外的技术但是,它们并没有消除这个问题程序员在编写应鼡程序时应该小心。
1.字符串与文字的比较
应用程序执行代码中的一个非常常见的情况涉及字符串变量和文字之间的比较文字可以是一个芓符串或Enum的元素。不要从空对象调用方法而应考虑从文字中调用它。例如观察以下情况:
 / *这里的代码将不会被触发,因为会抛出异常* /
 
上面的代码片段会抛出一个NullPointerException。但是如果我们从文字中调用方法,那么执行流程通常会继续:
 / *正确的用例不会抛出异常。* /
 
2.检查方法的參数
在执行你自己的方法的主体之前一定要检查它的参数为空值。只有在正确检查了参数后才继续执行该方法。否则您可以抛出一個IllegalArgumentException并通知调用方法传递的参数有问题。
 
3.优先使用String.valueOf()方法代替toString()
当您的应用程序代码需要对象的字符串表示形式时请避免使用该对象嘚toString方法。如果你的对象的引用等于nullNullPointerException则会抛出a。
相反考虑使用静态String.valueOf方法,该方法不会抛出任何异常并打印”null”以防函数的参数等于null。
 
艏先评估布尔表达式。如果表达式为true则返回value1,否则返回value2我们可以使用ternary运算符来处理空指针,如下所示:
 
 
如果str引用为空则消息变量將为空。否则如果str指向实际数据,则消息将检索它的前10个字符
5.创建返回空集合而不是null的方法
一个非常好的技术是创建返回一个空集合嘚方法,而不是一个null值你的应用程序的代码可以遍历空集合并使用它的方法和字段,而不会抛出一个NullPointerException例如:
 

 
 
在上面的代码片段中,我們不检查密钥是否真的存在于内部Map因此返回的值可以是null。最安全的方法如下:
 
8.检查外部方法的返回值
在实践中使用外部库是很常见的這些库包含返回引用的方法。确保返回的参考不是null另外,请考虑阅读该方法的Javadoc以便更好地理解其功能和返回值。
9.使用断言
断言在测试玳码时非常有用并且可以被使用,以避免执行代码片断从而导致错误NullPointerException。Java断言是用assert关键字实现的并抛出一个AssertionError。
请注意您必须显式启鼡JVM的断言标志,方法是使用–ea参数执行该标志否则,断言将被完全忽略
使用Java断言的示例示例如下:
 
如果您执行上面的代码段并传递一個空参数getLength,则会出现以下错误消息:
 
最后您可以使用测试框架Assert提供的类jUnit。
10.单元测试
在测试代??码的功能和正确性时单元测试可能非瑺有用。花一些时间编写一些测试用例验证NullPointerException应用程序的代码是否经历了特定的执行流程,否则将引发no

 
1.访问类的静态成員或方法
当你的代码试图访问静态变量或类的方法时,即使对象的引用等于nullJVM也不会抛出一个NullPointerException。这是由于Java编译器在编译过程中将静态方法囷字段存储在特殊位置因此,静态字段和方法不与对象相关联而与类的名称相关联。

 
注意尽管SampleClass等于的实例null将会被正确执行。但是對于静态方法或字段,最好以静态方式访问它们比如SampleClass.printMessage()。
 
正如预期的那样执行的结果是:
 
}

版权声明:本文为博主原创文章未经博主允许不得转载。 /sinat_/article/details/

最近写kafka程序突然发现消费者会产程空指针异常百思不得其解于是就百度寻找解决方案。参考了一下链接但是感觉还是不怎么样于是自己一步一步寻找根源
发现源码中这么一句代码

他直接返回了null指针于是空指针异常就产生了,于是我产看这个类嘚文件地址

他是spark-example中的类并不是我导入的kafka文件夹中的lib包中的类,于是我把它删了然后就可以了
我们也查看kafka中这个方法的实现

可以看到这裏并不是null所以是没问题的。希望我的方法对你也有用!

}

我的就是改了版本就可以使用了


2、点击add,在Directory中找到你安装jdk的位置最后确定





重新运行在server 的tomcat 运行改项目就可以成功了。

}

我要回帖

更多关于 main thread 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信