空指针异常:String为null。

3
if( currentTimeslot.isEmpty()){
         System.out.println("Do stuff");
            }

为什么会出现NullPointerException?如何检查字符串是否为NULL并在其为NULL时执行操作?每当currentTimeslot等于NULL时,就会出现该错误。以下是控制台消息:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at PM.ui.MainFrame.getJPanelTopMenu(MainFrame.java:382)
6个回答

5
请尝试以下操作:
    if( currentTimeslot == null){
             System.out.println("Do stuff");
   }

2

一个重要的问题需要自问:对于你正在做的事情,null 和空是否在逻辑上等价?

如果是这样,你可能想使用以下内容:

if (currentTimeslot == null || currentTimeslot.isEmpty()) {
    // Do stuff
}

如果语句的前半部分为真,Java就不会去理会后半部分,从而保护您免受空指针异常的困扰。
另一种方法是规范化您的数据。如果您希望null和空字符串被视为相同的东西,请在代码早期执行以下操作:
if (currentTimeslot == null) currentTimeslot = "";

现在你使用它时不必进行防御性的空值检查。
至于为什么会出现异常:在Java中,所有对象(任何不是原始类型如intboolean等的变量)在初始化之前都是null。如果您尝试访问该对象的任何方法或字段,则会发生空指针异常,因为您要求代码访问实际上不存在的内容。在Java中,您要么希望尽早将对象初始化为某些内容,要么进行大量的防御性空值检查(使用if(variable != null) { ... }try { ... } catch (NullPointerException npe) { ... }块),以避免您遇到的问题。
*-- 当然,用除null以外的其他内容进行初始化。

一个针对NullPointerException的catch块可能会隐藏原始错误,导致以后出现其他更微妙的问题。请参阅PMD上的Strict Exceptions和HP Fortify分类法:软件安全错误上的差劣的错误处理:程序捕获NullPointerException - Paul Vargas
@PaulVargas:这取决于你在“...”中填写了什么。而且,我更担心NullPointerException捕获与我预期不同的错误。(例如,我设置它处理objectA为空,但实际上是objectB抛出错误。)我试图涵盖所有NPE选项,但是,基于这些原因,我会将其排名第三,仅次于规范化数据和针对特定变量的if块。 - BlairHippo

1
if(currentTimeslot==null){
    System.out.println("whatever");
}

命令currentTimeslot.isEmpty()currentTimeslot.equals("")相同,都不被视为null,只是空的。如果您想检查它是否为null或为空,则必须将一个if-case放入另一个if-case中,例如:
if(currentTimeslot==null){
    System.out.println("null string");
}
else{
    if(currentTimeslot.isEmpty()){
       System.out.println("empty string");}
     }

如果您想要放置的命令太多而需要复制两次,您可以将它们放入一个函数中并调用该函数,或者使用一个布尔变量,在两种情况下都将其设置为true,然后检查布尔变量是否为true以执行其余的命令,就像这样:
 boolean empty;
if(currentTimeslot==null){
    System.out.println("null string");
    empty=true;
}
else{
    if(currentTimeslot.isEmpty()){
       empty=true;
       System.out.println("empty string");}
     }
 if(empty){
 ....
 .... }

希望这有所帮助 :)

1
您可能是Java的新手,在Java中,对象可以为null,这意味着该对象上没有可访问的方法,因此每次尝试访问null对象的方法时都会抛出NullPointerException。
要解决这个问题,您应该检查对象不为null:
        if ( currentTimeslot != null ){
            ....
        }

由于所有的Java对象都继承自java.lang.Object,因此这个检查对于任何类型都是相关的,而不仅仅是String。


1
他想在某物为 null 时做一些事情,而不是反过来。 - Obl Tobl

0
如果你遇到了空指针异常,可能是因为currentTimeslot为空。所以你应该先检查它是否为空,然后调用它的方法之一:
if(currentTimeslot!=null && currentTimeslot.isEmpty())...

如果(currentTimeslot == null || currentTimeslot.isEmpty()){ LOG.info("字符串值为空或为null"); } else { } - KIBOU Hassan

0

我建议你放弃大部分字符串的空值和null测试。Apache Commons Lang StringUtils早就解决了大部分字符串操作(是否为null、是否为空、是否不为空、是否全为空格等)。

下载Apache Commons Lang并使用它。

你的代码将变成这样:

if (StringUtils.isEmpty(currentTimeslot))
{
   ... react to an empty currentTimeslot .
}
else // currentTimeslot  is not emty (that includes not null).
{
   .. react to a not empt currentTimeslot 
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接