- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章java中的空指针异常情况以及解决方案由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
出现空指针异常,常常是因为我们调用的对象是空的而抛出的异常.
1
|
out.println(request.getParameter(
"username"
));
|
如果request里面并没有username的值,这时无法对空对象进行操作的,就会抛出异常.
1
2
3
|
String userName = request.getParameter(
"username"
);
If (userName.equals(
"root"
))
{....}
|
如果没有username值,或者username为null时,是不能将一个为null的对象与另外一个对象进行比较的.
1
2
|
If (
"root"
.equals(user Name))
{....}
|
如果返回值与常量进行比较时,就可以避免调用null对象的equals方法。不会抛出异常.
假设有一个student类,有属性name.
1
2
|
Student a;
String b = a.name;
|
这个时候就会报错,因为a为空的,解决办法就是让a指向一个对象,Student a = new Student(),
对于日志中的报错信息,在java中抛出异常是从内往外,因此只需要重点关注第一行报错信息,下面的报错都是由于一层层传递调用该方法导致.
Java中任何对象都可以为空,我们可以使用若干种方法来避免产生这类异常。比如我们传统的空值检测,编程规范,以及使用java中各种工具类.
(1)最常用的一种就是直接对 对象进行判断 。
比如if(Object == null)来对所有用到的对象进行判断,这个对象也就是我们常用的函数参数,返回值,以及类实例的成员变量等。当我们检测到null值时,我们可以异常的类型抛出更具有针对性的异常类型,再附加上我们自己加的消息内容。我们也可以直接使用一些库函数来简化代码:
1
|
Object checkData = Object.requireNoNull(resultMessage,
"The resultMessage must not be null"
)
|
如果我们使用过Lombok工具的话,里面有一个@NotNull注解,就是指被注释的元素不能为空,就会自定检测.
(2)第二种方法就是遵守编程规范,可以减少一定的空指针异常的发生.
1
2
3
4
5
6
7
8
|
Strings.isNullOrEmpty(str);
CollectionUtils.isEmpty(collection);
StringUtils.isEmpty(str);
if
(object !=
null
) {
object.toString();)
}
// 使用toString()这种方法的话,如果object为空的话,就会抛出异常
String.valueOf(object)
//将Object转换为字符串,不管是否为null,不会抛出异常
|
如果返回是集合类型。而且是空的,不要返回null值,而是要返回一个空的集合,如果返回类型是对象的话,我们可以抛出异常.
1
2
3
4
5
6
7
8
9
|
public
class
Example {
private
static
List<Integer> numbers =
null
;
public
static
List<Integer> getList() {
if
(numbers ==
null
)
return
Collections.emptyList();
else
return
numbers;
}
}
|
检查一个方法的参数,在执行方法之前,确保检查了参数是否null,当参数被适当检查后,方法会继续执行。否则抛出叫做llegalArgumentException的异常,并通知调用的方法传入的参数有误.
使用三元运算符,可以避免NullPointerException,形式如下:
boolean expression ? value1:value2,
第一种使用instanceof 操作符 。
即使对象的引用为null,instanceOf操作符可使用。当引用为null时,instanceof操作符返回false,而且不会抛出NullPointerException,比如:
1
2
3
4
|
String str =
null
;
if
(str
instanceof
null
) {
log.error(.......)
}
|
确保所有对象在使用之前被初始化.
我们都知道java是没有指针的,这里说的"java指针"指的就是java的引用,我们不在这里讨论叫指针究竟合不合适,而只是针对这个异常本身进行分析.
空指针就是空引用,java空指针异常就是引用本身为空,却调用了方法,这个时候就会出现空指针异常.
可以理解,成员变量和方法是属于对象的(除去静态),在对象中才存在相对应的成员变量和方法,然后通过对象去调用这些成员变量和方法.
对于空指针来说,它不指向任何对象,也就没有所谓的成员变量和方法,这个时候用它去调用某些属性和方法,当然会出现空指针异常.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public
class
Test {
private
int
a=
1
;
private
int
b=
2
;
public
static
void
main(String[] args) {
// TODO Auto-generated method stub
Test t1 =
new
Test();
Test t2 =
null
;
System.out.println(t1.a);
System.out.println(t2.a);
System.out.println(t2.c());
}
public
String c(){
return
"123"
;
}
}
|
我们分析上面这段示例代码,在Test类中,有两个成员变量a和b,和一个方法c().
然后在main()方法中,我们创建了两个对象t1和t2,其中t1指向通过构造方法实例出的Test对象,而t2只是声明,并指向了空,并没有指向实际的对象.
调试的时候,第一条输出语句是可以通过编译的,而执行到第二条输出语句的时候,由于空指针调用了不属于它的a,程序终止,报告空指针异常.
同样,注释第二条输出语句,程序在执行到第三条输出语句的时候,由于调用了不属于它的c()方法,会出现一样的错误.
对于每一个java程序员来说,几乎都避免不了遇到空指针异常,特别是经验不足的初学者。而且由于它的调试和查找相对其它异常来说比较困难,常常需要花费很大的精力去解决它.
首先认识一下java中的null 。
null是Java中一个很重要的概念。null设计初衷是为了表示一些缺失的东西,例如缺失的用户、资源或其他东西。但是,一年后,令人头疼的空指针异常给Java程序员带来不少的骚扰.
null是java中的关键字,因此,它不能写成NULL,Null,只能是null.
null是所有引用类型的默认值,如果没有让一个引用指向一个实际存在的对象,它的默认值就是null。null本质上是一个值,这跟int的默认值是0,boolean的默认值是false一样。现在,我们通常都使用像eclipse等的集成开发环境进行开发,一般在定义变量的时候都会进行初始化(这也是写代码的一个良好的习惯),如果没有进行初始化,系统会进行提示.
报空指针异常的原因有以下几种:
空指针的解决办法:
重点关注报错发生的所在行,通过空指针异常产生的两条主要原因诊断具体的错误。同时为了避免空指针的发生,最好在做判断处理时将“null”或者空值放于 设定的值之前.
常见空指针异常的简要分析:
(1)空指针错误 。
Java中的8种基本数据类型,变量的值可以有其默认值,加入没有对其正常赋值,java虚拟机是不能 正确编译通过的,因此使用基本的Java数据类型一般是不会引起空指针异常的。实际开发中,大多数的空指针异常主要与对象的操作相关.
下面列出可能发生空指针异常的几种情况及相应解决方案:
代码段1:
1
|
out.println(request.getParameter(
"username"
));
|
分析:代码段1的功能十分简单,就是输出用户输入"username"的值.
说明:看上去,上面的语句找不出什么语法错误,而且在大多数情况下也遇不到什么问题。但是,如果某个用户在输入数据时并没有提供表单 域"username" 的值,或通过某种途径绕过表单直接输入时,此request.getParameter("username")的值为空(注意不是空字符串,是空对象 null。),out对象的println方法是无法直接对空对象操作的,因此代码段1所在的JSP页面将会抛出 "Java.lang.NullPointerException"异常。而且即使对象可能为空时,也调用Java.lang.Object或 Object对象本身的一些方法如toString(), equal(Object obj)等操作.
代码段2:
1
2
3
|
String userName = request.getParameter(
"username"
);
If (userName.equals(
"root"
))
{....}
|
分析:代码段2的功能是检测用户提供的用户名,如果是用户名称为"root"的用户时,就执行一些特别的操作.
说明:在代码段2中,如果有用户没有提供表单域"username"的值时,字符串对象userName为null值,不能够将一个null的对象与另一 个对象直接比较,同样,代码段2所在的JSP页面就会抛空指针错误.
一个小技巧:如果要把某个方法的返回值与常量做比较,把常量放在前面,可以避免调用null对象的equals方法。譬如:
1
2
|
If (
"root"
.equals(userName))
{....}
|
即使userName对象返回了null对象,这里也不会有空指针异常,可以照常运转.
代码段3:
1
|
String userName = session.getAttribute(
"session.username"
).toString();
|
分析:代码段3的功能是将session中session.username的值取出,并将该值赋给字符串对象userName.
说明:在一般情况下,如果在用户已经进行某个会话,则不会出现什么问题;但是,如果此时应用服务器重新启动,而用户还没有重新登录,(也可能是用户关闭浏 览器,但是仍打开原来的页面。)那么,此时该session的值就会失效,同时导致session中的session.username的值为空。对一个 为 null的对象的直接执行toString()操作,就会导致系统抛出空指针异常.
代码段4:
1
2
3
4
5
|
public
static
void
main(String args[]){
Person p=
null
;
p.setName(
"张三"
);
System.out.println(p.getName());
}
|
分析:声明一个Person对象,并打印出该对象的中的Name名字.
说明:这个时候你的p就出现空指针异常,因为你只是声明了这个Person类型的对象并没有创建对象,所以它的堆里面没有地址引用,切忌你要用对 象掉用方法的时候一定要创建对象.
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我.
原文链接:https://blog.csdn.net/qq_41691210/article/details/110680021 。
最后此篇关于java中的空指针异常情况以及解决方案的文章就讲到这里了,如果你想了解更多关于java中的空指针异常情况以及解决方案的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我已经为使用 JGroups 编写了简单的测试。有两个像这样的简单应用程序 import org.jgroups.*; import org.jgroups.conf.ConfiguratorFact
我有一个通过 ajax 检索的 json 编码数据集。我尝试检索的一些数据点将返回 null 或空。 但是,我不希望将那些 null 或空值显示给最终用户,或传递给其他函数。 我现在正在做的是检查
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Why does one often see “null != variable” instead of “
嗨在我们公司,他们遵循与空值进行比较的严格规则。当我编码 if(variable!=null) 在代码审查中,我收到了对此的评论,将其更改为 if(null!=variable)。上面的代码对性能有影
我正在尝试使用 native Cordova QR 扫描仪插件编译项目,但是我不断收到此错误。据我了解,这是代码编写方式的问题,它向构造函数发送了错误的值,或者根本就没有找到构造函数。那么我该如何解决
我在装有 Java 1.8 的 Windows 10 上使用 Apache Nutch 1.14。我已按照 https://wiki.apache.org/nutch/NutchTutorial 中提
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: what is “=null” and “ IS NULL” Is there any difference bet
Three-EyedRaven 内网渗透初期,我们都希望可以豪无遗漏的尽最大可能打开目标内网攻击面,故,设计该工具的初衷是解决某些工具内网探测速率慢、运行卡死、服务爆破误报率高以及socks流
我想在Scala中像在Java中那样做: public void recv(String from) { recv(from, null); } public void recv(String
我正在尝试从一组图像补丁中创建一个密码本。我已将图像(Caltech 101)分成20 X 20图像块。我想为每个补丁创建一个SIFT描述符。但是对于某些图像补丁,它不返回任何描述符/关键点。我尝试使
我在验证器类中自动连接的两个服务有问题。这些服务工作正常,因为在我的 Controller 中是自动连接的。我有一个 applicationContext.xml 文件和 MyApp-servlet.
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 已关闭10 年前。 问题必须表现出对要解决的问题的最低程度的了解。告诉我们您尝试过做什么,为什么不起作用,以
大家好,我正在对数据库进行正常的选择,但是 mysql_num_rowsis 为空,我不知道为什么,我有 7 行选择。 如果您发现问题,请告诉我。 真的谢谢。 代码如下: function get_b
我想以以下格式创建一个字符串:id[]=%@&stringdata[]=%@&id[]=%@&stringdata[]=%@&id[]=%@&stringdata[]=%@&等,在for循环中,我得到
我正在尝试使用以下代码将URL转换为字符串: NSURL *urlOfOpenedFile = _service.myURLRequest.URL; NSString *fileThatWasOpen
我正在尝试将NSNumber传递到正在工作的UInt32中。然后,我试图将UInt32填充到NSData对象中。但是,这在这里变得有些时髦... 当我尝试将NSData对象中的内容写成它返回的字符串(
我正在进行身份验证并收到空 cookie。我想存储这个 cookie,但服务器没有返回给我 cookie。但响应代码是 200 ok。 httpConn.setRequestProperty(
我认为 Button bTutorial1 = (Button) findViewById(R.layout.tutorial1); bTutorial1.setOnClickListener
我的 Controller 中有这样的东西: model.attribute("hiringManagerMap",hiringManagerMap); 我正在访问此 hiringManagerMap
我想知道如何以正确的方式清空列表。在 div 中有一个列表然后清空 div 或列表更好吗? 我知道这是一个蹩脚的问题,但请帮助我理解这个 empty() 函数:) 案例)如果我运行这个脚本会发生什么:
我是一名优秀的程序员,十分优秀!