首页 > 基础资料 博客日记
Java使用局部变量防止空指针
2023-07-24 16:40:15基础资料围观204次
本篇文章分享Java使用局部变量防止空指针,对你有帮助的话记得收藏一下,看Java资料网收获更多编程知识
在多线程修改对象a的时候,即使加了空判断也容易发生空指针。
因为在判断a不为空后,另一个线程刚好把a置空,这时去使用a时就触发空指针异常了。
```java
if (a != null) {
a.foo();
}
```
多线程并发模拟:一个线程间隔10ms不停地读字符串str的长度,另一个线程每5ms把str置空或者重新赋值。
```java
public class Test{
static String str = "str";
public static void main(String[] args) {
new Thread(new Runnable(){
@Override
public void run() {
while(true) {
if (str != null) {
System.out.println(str.length());
}
sleep(10);
}
}
}).start();
new Thread(new Runnable(){
@Override
public void run() {
while(true) {
if (str == null) {
str = "newStr";
} else {
str = null;
}
sleep(5);
}
}
}).start();
}
private static void sleep(long time) {
try {
Thread.sleep(time);
} catch (Exception e) {
// ignore
}
}
}
```
运行很快就会
```java
Exception in thread "Thread-0" java.lang.NullPointerException
at app.Test$1.run(Test.java:16)
at java.lang.Thread.run(Thread.java:748)
```
如果不用try-catch,可以使用一个局部变量temp引用str,判断和使用temp不会空指针
```java
public class Test{
static String str = "str";
public static void main(String[] args) {
new Thread(new Runnable(){
@Override
public void run() {
while(true) {
// if (str != null) {
// System.out.println(str.length());
// }
String temp = str;
if (temp != null) {
System.out.println(temp.length());
}
sleep(10);
}
}
}).start();
new Thread(new Runnable(){
@Override
public void run() {
while(true) {
if (str == null) {
str = "newStr";
} else {
str = null;
}
sleep(5);
}
}
}).start();
}
private static void sleep(long time) {
try {
Thread.sleep(time);
} catch (Exception e) {
// ignore
}
}
}
```
文章来源:https://www.cnblogs.com/rome753/p/16491351.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签: