実際のプロジェクトではnull検証が必要な箇所が多く、null検証を行わないとNullPointerExceptionが発生する可能性があります。 。
まずは実際のプロジェクトでの null 判定方法をいくつか見てみましょう
if (ObjectUtil.isNotNull(vo.getSubmitterId())) { userIds.add(vo.getSubmitterId()); } if (StringUtils.isNotBlank(vo.getBudgetPM())) { userIds.add(Long.valueOf(vo.getBudgetPM())); } if (CollUtil.isNotEmpty(vo.getOriginatorList())) { userIds.addAl1(vo.getOriginatorList().stream(); }
通常、オブジェクトが Null かどうかを判定しますが、java.util の Objects を使用できます。 .nonNull(obj)、hutool の ObjectUtil または直接 null != obj
List のような特殊な項目は、空のプロジェクト内の非 null を判定するだけではありません。 List の場合、null に等しくなく、List.size() は 0 に等しくありません。2 つの異なる点があります。社内のインターンはこれら 2 つをよく混同します。list が null に等しくない場合は、リストが null に等しくないことを意味します。初期化されており、それに属するヒープ メモリの一部があります。サイト、およびサイズ 0 は、そこに何も置かれていないことを意味します。たとえば、null に等しくない場合は、現在ボトルがあることを意味します. サイズが 0 より大きい場合は、ボトルに水を入れたことを意味します。
実際のプロジェクトでは list.isEmpty() を直接判定に利用していることも分かりましたのでソースコードを見てみます:
public boolean isEmpty() { return size == 0; }
これは水の有無を判定するのと同じですボトル内 (ボトルがすでに存在する場合、ボトルが存在しない場合は NullPointerException がスローされます)。
そのため、通常 list != null && list.size > 0 を判定に使用するか、HuTool の CollUtil ツールの isEmpty を直接使用します。 Set や Map などもあります。
ここではボトルや水の概念がそのまま使われており、String が null の場合は、equals(String) やlength() が呼び出され、java.lang.NullPointerException がスローされます。
空の文字列を検出するにはいくつかの方法があります:
1. ほとんどの人が使用する方法の 1 つで、直感的で便利ですが、非効率的です:
if(a == null || a.equals(""));
2. 文字列の長さを効率的に比較します:
if(a == null || a.length() == 0);
3. Java SE 6.0は提供が始まったばかりで、効率は方法2とほぼ同じです。 :
if(a == null || a.isEmpty());
もちろん、org.apache.commons.lang を使用することもできます。 StringUtils ツール。
StringUtils.isNotBlank(a);
* StringUtils.isNotBlank(null) = false
* StringUtils.isNotBlank("") = false
* StringUtils.isNotBlank(" ") = false
* StringUtils.isNotBlank("bob") = true
* StringUtils.isNotBlank(" bob ") = true
このツール クラスには isNotEmpty() メソッドもあります。この 2 つの違いは、コメントから明確にわかります。
StringUtils.isNotEmpty(a);
* StringUtils.isNotEmpty(null) = false
* StringUtils.isNotEmpty("") = false
* StringUtils.isNotEmpty(" ") = true
* StringUtils.isNotEmpty("bob") = true
* StringUtils.isNotEmpty(" bob ") = true
Optional の外観NullpointException を防ぐために使用されます。一般的なメソッドは次のとおりです。
.empty(): 空のオプションのインスタンスを作成します。
.of(T t): オプションのインスタンスを作成します。 nullの場合は例外が報告されます
.ofNullable(T t): tがnullでない場合はOptionalインスタンスを作成し、それ以外の場合は空のインスタンスを作成します
isPresent(): コンテナーに値があるかどうかを判断します。
baseInfo クラスには Boolean 型の属性があります。空の場合は false を返し、空でない場合はその値を取得するため、4 行が必要になります。
boolean blind = false; if (null != baseInfo.getBlind()){ blind = baseInfo.getBlind(); }
Optional を使用すると、非常にエレガントな 1 行で実行できます。
boolean blind = Optional.ofNullable(baseInfo.getBlind()).orElse( other: false);
4.1 オプションのオブジェクトの作成
public final class Optional<T> { private static final Optional<?> EMPTY = new Optional<>(); private final T value; //可以看到两个构造方格都是private 私有的 //说明 没办法在外面new出来Optional对象 private Optional() { this.value = null; } private Optional(T value) { this.value = Objects.requireNonNull(value); } //这个静态方法大致 是创建出一个包装值为空的一个对象因为没有任何参数赋值 public static<T> Optional<T> empty() { @SuppressWarnings("unchecked") Optional<T> t = (Optional<T>) EMPTY; return t; } //这个静态方法大致 是创建出一个包装值非空的一个对象 因为做了赋值 public static <T> Optional<T> of(T value) { return new Optional<>(value); } //这个静态方法大致是 如果参数value为空,则创建空对象,如果不为空,则创建有参对象 public static <T> Optional<T> ofNullable(T value) { return value == null ? empty() : of(value); } }
Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); Optional.ofNullable(task).orElseThrow(() -> new ProcessException(ErrorCodeEnum,SYSIEM ERROR));
シナリオ 2: オプションの関数型プログラミングを使用し、1 行で完了
Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); Map<String,String> map = new HashMap<>( initialCapacity: 8); Optional.ofNullable(task).ifPresent(d -> map.put("taskId",d.getTaskDefinitionKey()));
以上がJavaで空判定を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。