首页 > 基础资料 博客日记
Java使用局部变量防止空指针
2023-07-24 16:40:15基础资料围观609次
本篇文章分享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进行投诉反馈,一经查实,立即删除!
标签:
相关文章
最新发布
- 洛谷-P7998 [WFOI - 01] 猜数 题解
- AI 相关概念之(基础层级):AI、ANI、AGI、ASI
- 深度解读 AEC-Q100 Rev-J:为什么先进制程芯片的 ESD 电压降低?车规标准“放水”了?
- 硅基流动 vs OpenRouter——两种AI Infra模式的取舍
- Vector 选型与实战:vs OTel / Logstash / Fluentd 全维对比,及统一日志与指标管道的 AWS ECS 落地
- "MixFormer: Co-Scaling Up Dense and Sequence in Industrial Recommenders" 论文笔记
- 开源分享|用MicroPython 做了个 AI 小鸡,它会长大,还记得我所有的情绪
- HEIC图片转换器(HEIC转JPG/PNG/WEBP/BMP/TIFF/ICO)
- 5 分钟上手 AgentRun:从注册到第一个 Agent 运行
- transformer进阶之路:#4 attention从如何「工作」到「为何」如此高效

