如何在java中避免使用null检查NullpointerException

时间:2015-08-04 12:10:18

标签: java

在下面的代码中,我想跳过空检查。请让我知道替代解决方案。

 public class NullCheck {



    public static void main(String[] args) {

        String str=args[0];

        if (null != str) //without using this null check how to avoid null pointer exception

        {
            System.out.println("Null check");
        }
        else

        {
            System.out.println("Null value");
        }
    }
}

由于

6 个答案:

答案 0 :(得分:6)

您可以使用 Yoda Expressions 来避免许多空检查,例如

if ("Hello".equals(str))

"Hello",作为文字,永远不会null,内置的equals方法会检查str是否为空。替代str.equals("Hello")会要求您先检查str

有些人发现它们混淆了,并不总是可以相应地安排你的语法。

答案 1 :(得分:3)

我觉得像家庭作业一样吗? 最终老师要你使用Try Catch Block?

try{
   //what you want to do when its not null
}
catch (NullPointerException exp){
   //what happens if its null
}

尝试在Try块中执行代码,但如果发生NullPointerException,则可以在Catch块中处理它。也许,也许就是那些你想要的东西。

答案 2 :(得分:2)

我在代码中跳过了空检查。无论如何都不会检查null值。

public class NullCheck {

    static String str;

    public static void main(String[] args) {
    }
}

更严重的是,您可以:

  • 解释为什么要避免空检查,
  • static String str初始化为= "";(空字符串)并且肯定不会是null(只需确保没有人可以为其指定空值)!。

答案 3 :(得分:0)

另一种替代解决方案是始终将变量初始化为某些内容。对于叮咬,这可能是一个空字符串:String string = "";。对于集合,如果您想在以后添加它,可以初始化为空集合:Collection<T> collection = Collections.emptyList();Collection<T> list = new ArrayList<>()

但问题是,在某些时候,您需要查看对象是否为空,因为并非每个对象都有一些默认的安全初始化值:

Scanner scanner = null;

try
{
    scanner = new Scanner(...);
    ...
}
...
finally
{
    if(scanner != null) scanner.close();
}

因此,我不认为你完全可以避免进行空检查,但你可以减轻它。

答案 4 :(得分:0)

我不知道你的检查有什么问题,这似乎是一个很好的解决方案,但你可以使用try-catch语句,或者默认值初始化str对象“”并检查空字符串,或者使用断言检查可空的对象。

答案 5 :(得分:0)

简短的回答:你做不到。 答案很长:你可以使用变通方法,这有效地检查if-else是否为null。

有些已经提供了他们的答案,我会给你一个提示(不是真正的答案,因为它实际上反过来): Java 8引入了泛型类:Optional

它在内部持有对象的引用或null。 它给你的是,每当你试图在它所拥有的对象上调用一个方法时,要获得你需要调用get()方法的实际对象,这更有可能提醒你检查是否存在。

只是一小部分样本:

package whatever;
import java.util.Optional;

public class Main(){
    public static void main(String[] args) {
        Optional<String> a = Optional.empty();
        Optional<String> b = Optional.ofNullable(notReallyAString);
        Optional<String> c = Optional.of("John Paul II");
        if(a.isPresent()) System.out.println("Empty optional, you shouldnt be able to see this");
        if(b.isPresent()) System.out.println("Optional with a null, shouldnt be able to see this");
        if(c.isPresent()) System.out.println(c.get());  
    }
}

但是请注意,它不应该是一个通用的任何值的volder,你更可能只想使用Optional作为方法的返回类型来对客户说,它可能确实是空的。

请记住,尝试获取(通过get()方法)Optional实例中的null元素将导致NoSuchElementException 立即(但它仍然是未经检查的异常)