空指针异常 NullPointException

空指针异常 NullPointException

空指针异常,是运行时异常,及时编写代码时出现了空指针异常,编译器(javac)
会编译通过不报错,但是运行时Runtime阶段会抛出NullPointException

一.空指针异常可能的情况

1.调用null对象的实例方法

(1).比如数据库连接时:

	Connection con = DriverManager.forName(url,root,password);	

当url对应端口号、root用户、passwowd密码,有一个不正确时,数据库都不会正确连接,c数据库连接对象con可能为空(null);

所以,若con为空时,调用数据库连接对象的close()方法就会抛出空指针异常

	con.close()

(2).比如String中对象为空时:

	String str = null;

当执行String类的length()方法时,Str为null,没有长度,也会抛出空指针异常

	str.length()

String补充知识:

1).String str = “abcd”;这不叫赋值!

	String str = "abcd";

	String str = new String("abcd");

这两种写法,效果一样,都是new了一个String类对象str,即在堆内存中开辟了一个新的空间。

2).String类的源码为:

	public final class String{

	}	

所以,String中每次new(可以等价为1)中的 = 号类型),都是开辟了一个新的内存,都有一个新的内存地址。

	String str = "abcd";	

内存中,分配给str对象的内存地址(比如0X666),str对象,指向该内存地址。

	str = "xyz";

内存中,又新分配给str一个新的内存地址(比如0X999
)

2.将null作为数组,访问其长度

	int[] array = null;

	array.length;

也会抛空指针异常。

注:成员变量,引用类型的默认值为null

	private static String str; (str = null,默认	)

	private static Connection con ;(con = null,不写默认为null)

一.解决办法:良好习惯

1.学会提前判断

(1).比如,调用数据库对象con的close()关闭资源的方法,因为con可能因为连接失败而为创建,若未创建就没有关闭资源的必要。

	if(con != null){
		con.close();
	}

(2).再比如:

	String str = new Scanner(System.in).nextLine();	

1).提前判断是否为空:

	if(str != null){
		int len = str.length()
	}

2).变量放在前边

	String str = null;	
 	str.equals("faker");

此时,编译不会报错,但是运行时抛空指针异常;

	String str = null;
	"Faker".equals(str);

这种变量放在前面的写法,若str = null,则编译器连编译都不会通过(比如你在eclipse上,直接显示代码错误,提醒你)。

在使用Collectors.toMap方法时,如果集合中存在null值,可能会导致空指针异常。这是因为toMap方法默认不允许出现重复的键,当键重复时,会抛出空指针异常。为了解决这个问题,可以在toMap方法中使用第三个参数来指定当键重复时的处理方式。 例如,可以使用mergeFunction来处理重复键的情况,这样在遇到重复键时,会执行mergeFunction来合并对应的值。具体代码如下所示: ``` Map<String, String> map = list.stream() .collect(Collectors.toMap(Node::getId, Node::getName, (n1, n2) -> n1, HashMap::new)); ``` 在这个例子中,我们指定了一个新的HashMap作为toMap方法的第四个参数,当键重复时,会将两个值合并为一个值。 另外,如果集合中存在null值,可以在toMap方法中使用Optional类来处理,确保值不为空。具体代码如下所示: ``` #### 引用[.reference_title] - *1* *3* [java stream collect toMap nullPointException异常](https://blog.csdn.net/weixin_40493969/article/details/108690223)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Collectors.toMap方法使用时候value报空指针问题解决](https://blog.csdn.net/hu10131013/article/details/126247475)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值