Java判断String是否为空或不为空(并且equals的好的写法,不报空指针)

首先澄清一个概念:

String str; 
if(str == null || str.equals(" ")){
}
  • 1
  • 2
  • 3

  str == null 说明str还未指向一个特定的字符串对象,此时谈不上是否为空。str = “”;说明str是个空字符串,只不过长度为0;

字符串判断空的几种写法:

//①.最多人使用的一个方法, 直观, 方便, 但效率很低; 
if (str == null || "".equals(str)) { 
}  

//②.比较字符串长度,效率高,是最好的一个方法;
if (str == null || str.length() <= 0) {  
}

//③.JavaSE6.0 才开始提供的方法, 效率和方法二几乎相等,但出于兼容性考虑, 推荐使用方法二;
if (str == null || str.isEmpty()) {  
}  
//④.这是一种比较直观,简便的方法,而且效率也非常的高,与方法二、三的效率差不多; 
if (str == null || str == "") {  
}  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

  相应的不为空的判断加上 “非”(!)的判断即可。




2.

首先看个例子

 

public static void main(String[] args) {

 String a=null;
 if("aa".equals(a))//这种情形,不出现空指针异常
 //if(a.equals("aa"))//出现空指针异常
 {
 System.out.println(true);
 }
 else {
 System.out.println(false);
 }
 }

 

面的两句不同的比较语句测试,第一句不出现空指针异常,第二句出现。
所以在变量和常量比较的时候,一般把常量放在前面。为了避免空指针异常。
但是我的问题是:变量在前时候,读到变量,变量为空,就出现异常了。
为什么变量在后时候,a变量就不用读了吗?既然要比较肯定也要读啊,问题
只是先后的问题。为什么放在后面就就不报空指针呢?

 

看了一下string类的equals方法

 

  public boolean equals(Object anObject) {
         if (this == anObject) {
             return true;
         }
         if (anObject instanceof String) {
             String anotherString = (String) anObject;
             int n = value.length;
             if (n == anotherString.value.length) {
                 char v1[] = value;
                 char v2[] = anotherString.value;
                 int i = 0;
                 while (n-- != 0) {
                     if (v1[i] != v2[i])
                             return false;
                     i++;
                 }
                 return true;
             }
         }
         return false;
     }

源码我看了一下,也明白,但是在源码中如果anobject为空的时候,就不会出现空指针异常吗 ?
后来经过一番讨论后,我得出的结论是这样的:

问题是出现在调用方法上了。因为null值,并不是一个String对象。而你通过声明的String对象引用去 调用了String对象的实例方法。当然不可以了。null调用了方法。

所以系统报出了,空指针异常。


  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
判断一个对象是否为空并取出其值,可以使用Java中的不同方法。首先,可以使用传统的方式通过判断每个属性值是否为空来实现。通过使用反射获取类的属性集合,然后遍历每个属性,判断其值是否为空。如果有任何一个属性的值为,则可以认为对象不为。具体实现可以参考以下代码: public static String isAllFieldNull(Object obj) throws Exception{ Class stuCla = (Class) obj.getClass(); Field[] fs = stuCla.getDeclaredFields(); String flag = "true"; for (Field f : fs) { f.setAccessible(true); Object val = f.get(obj); if(val==null) { flag = f.getName() + ":字段为"; break; }else { if(val instanceof String) { if ("".equals(val)) { flag = f.getName() + ":字段为"; break; } } } } return flag; } 另一种更优雅的方法是使用Java 8引入的Optional类来处理空指针异常。Optional类主要用于解决可能导致空指针异常的情况。可以使用Optional的isPresent()方法判断对象是否为空,并通过get()方法获取其值。以下是一个示例代码: Optional<Person> optionalPerson = Optional.ofNullable(person); if (optionalPerson.isPresent()) { Person p = optionalPerson.get(); // 进行相应操作 } else { // 对象为的处理逻辑 } 这种方式使用Optional类可以使代码更加简洁和易读,并且可以避免空指针异常的发生。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [java 判断对象的所有属性不为](https://blog.csdn.net/qq_24956041/article/details/96996766)[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_1"}}] [.reference_item style="max-width: 50%"] - *3* [Java Optional 实用判空实用实战,优雅永不过时](https://blog.csdn.net/qq_35387940/article/details/128316327)[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_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值