簡體   English   中英

如何在Java中沒有null檢查的情況下避免NullpointerException

[英]How to avoid NullpointerException without null check in 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");
        }
    }
}

謝謝

例如,可以使用Yoda Expressions避免許多空檢查。

if ("Hello".equals(str))

作為文字, "Hello"絕不會為null ,並且內置的equals方法將檢查str是否為空。 另一種str.equals("Hello")將要求您首先檢查str

有些人發現它們令人困惑,因此不一定總是可以相應地安排語法。

我猜想要做些功課嗎? 最終,老師希望您使用“嘗試捕獲塊”嗎?

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

它嘗試在Try塊中執行代碼,但是如果發生NullPointerException,則可以在Catch塊中進行處理。 也許,也許就是您想要的。

我跳過了您代碼中的空檢查。 不會檢查任何值是否為null。

public class NullCheck {

    static String str;

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

更嚴重的是,您可以:

  • 解釋為什么要避免空檢查,
  • static String str初始化為= ""; (一個空字符串),並且它肯定不會為null (只需確保沒有人可以為其分配null)!

另一種替代解決方案是始終將變量初始化為某種形式。 對於字符串,這可能是一個空字符串: String string = ""; 對於集合,這可能是初始化為空集合: Collection<T> collection = Collections.emptyList(); Collection<T> list = new ArrayList<>()如果要在以后添加到Collection<T> list = new ArrayList<>()

但是問題是,在某個時候,您將需要查看對象是否為空,因為並非每個對象都具有一些默認的安全初始化值:

Scanner scanner = null;

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

因此,我認為您不能完全避免進行空檢查,但是可以減輕它的負擔。

我不知道您的檢查有什么問題,這似乎是很好的解決方案,但是您可以使用try-catch語句,或者通過默認值“”初始化str對象並檢查空字符串,或者使用斷言來檢查可為空的對象。

簡短的答案:您不能。 長答案:您可以使用解決方法,這實際上就是檢查if-else是否為null的方法。

有些已經提供了答案,我將給您一個提示(不是真正的答案,因為它實際上是相反的):Java 8引入了通用類: 可選

它在內部保存對對象的引用或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());  
    }
}

但是請注意,它不應該是通用的任何值范圍,您更有可能只希望將Optional僅用作要對客戶端說的方法的返回類型,它可能確實為null 。

請記住,嘗試(通過get()方法)獲取Optional實例內的null元素將立即導致NoSuchElementException(但它仍然是未經檢查的異常)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM