From ef5cf346f483fc2b7bee08355d6332c1351721c6 Mon Sep 17 00:00:00 2001 From: Sean Gilligan Date: Fri, 9 Jan 2026 06:56:43 -0800 Subject: [PATCH 1/3] Stopwatch, MonetaryFormat: add missing nullability annotations These are the last missing `@Nullable` annotations to enable making bitcoinj-base `@Nullmarked`. --- .../main/java/org/bitcoinj/base/internal/Stopwatch.java | 3 +++ .../main/java/org/bitcoinj/base/utils/MonetaryFormat.java | 8 +++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/base/src/main/java/org/bitcoinj/base/internal/Stopwatch.java b/base/src/main/java/org/bitcoinj/base/internal/Stopwatch.java index fdda3c11d0b..4d8ef87d4a4 100644 --- a/base/src/main/java/org/bitcoinj/base/internal/Stopwatch.java +++ b/base/src/main/java/org/bitcoinj/base/internal/Stopwatch.java @@ -16,6 +16,8 @@ * limitations under the License. */ +import org.jspecify.annotations.Nullable; + import java.time.Duration; import java.time.Instant; import java.time.temporal.ChronoUnit; @@ -33,6 +35,7 @@ */ public class Stopwatch implements TemporalAmount { private final Instant startTime; + @Nullable private Instant stopTime = null; /** diff --git a/base/src/main/java/org/bitcoinj/base/utils/MonetaryFormat.java b/base/src/main/java/org/bitcoinj/base/utils/MonetaryFormat.java index ee7f5ffbc93..25c14fca92d 100644 --- a/base/src/main/java/org/bitcoinj/base/utils/MonetaryFormat.java +++ b/base/src/main/java/org/bitcoinj/base/utils/MonetaryFormat.java @@ -18,6 +18,7 @@ import org.bitcoinj.base.Coin; import org.bitcoinj.base.Monetary; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.math.RoundingMode; @@ -78,10 +79,10 @@ public final class MonetaryFormat { private final char zeroDigit; private final char decimalMark; private final int minDecimals; - private final List decimalGroups; + private final @Nullable List decimalGroups; private final int shift; private final RoundingMode roundingMode; - private final String[] codes; + private final String @Nullable[] codes; private final char codeSeparator; private final boolean codePrefixed; @@ -342,7 +343,7 @@ public MonetaryFormat(boolean useSymbol) { } private MonetaryFormat(char negativeSign, char positiveSign, char zeroDigit, char decimalMark, int minDecimals, - List decimalGroups, int shift, RoundingMode roundingMode, String[] codes, + @Nullable List decimalGroups, int shift, RoundingMode roundingMode, String @Nullable[] codes, char codeSeparator, boolean codePrefixed) { this.negativeSign = negativeSign; this.positiveSign = positiveSign; @@ -513,6 +514,7 @@ private long parseValue(String str, int smallestUnitExponent) { /** * Get currency code that will be used for current shift. */ + @Nullable public String code() { if (codes == null) return null; From 18def32311a474f2619e98cc00bb54ce15753ec2 Mon Sep 17 00:00:00 2001 From: Sean Gilligan Date: Fri, 9 Jan 2026 07:22:04 -0800 Subject: [PATCH 2/3] package-info.java: add missing package info to bitcoinj-base This is in preparation for adding `@NullMarked` annotations for those packages, but was needed anyway. --- .../base/exceptions/package-info.java | 20 +++++++++++++++++++ .../bitcoinj/base/internal/package-info.java | 20 +++++++++++++++++++ .../org/bitcoinj/base/utils/package-info.java | 20 +++++++++++++++++++ 3 files changed, 60 insertions(+) create mode 100644 base/src/main/java/org/bitcoinj/base/exceptions/package-info.java create mode 100644 base/src/main/java/org/bitcoinj/base/internal/package-info.java create mode 100644 base/src/main/java/org/bitcoinj/base/utils/package-info.java diff --git a/base/src/main/java/org/bitcoinj/base/exceptions/package-info.java b/base/src/main/java/org/bitcoinj/base/exceptions/package-info.java new file mode 100644 index 00000000000..e4f6a3aaa2e --- /dev/null +++ b/base/src/main/java/org/bitcoinj/base/exceptions/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright by the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Exceptions thrown by classes in bitcoinj base. + */ +package org.bitcoinj.base.exceptions; diff --git a/base/src/main/java/org/bitcoinj/base/internal/package-info.java b/base/src/main/java/org/bitcoinj/base/internal/package-info.java new file mode 100644 index 00000000000..49ff42da11f --- /dev/null +++ b/base/src/main/java/org/bitcoinj/base/internal/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright by the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Classes for internal use only (in both {@code bitcoinj-base} and {@code bitcoinj-core}.) + */ +package org.bitcoinj.base.internal; diff --git a/base/src/main/java/org/bitcoinj/base/utils/package-info.java b/base/src/main/java/org/bitcoinj/base/utils/package-info.java new file mode 100644 index 00000000000..7df2cd3b45b --- /dev/null +++ b/base/src/main/java/org/bitcoinj/base/utils/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright by the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * bitcoinj utility classes. + */ +package org.bitcoinj.base.utils; From d456fc4073ac67ab08be0eb7bdc3f2c707291fb4 Mon Sep 17 00:00:00 2001 From: Sean Gilligan Date: Fri, 9 Jan 2026 07:33:38 -0800 Subject: [PATCH 3/3] package-info.java: declare all bitcoinj-base packages as `@NullMarked` Treats types as non-null by default, unless specified otherwise. --- .../main/java/org/bitcoinj/base/exceptions/package-info.java | 3 +++ .../src/main/java/org/bitcoinj/base/internal/package-info.java | 3 +++ base/src/main/java/org/bitcoinj/base/package-info.java | 3 +++ base/src/main/java/org/bitcoinj/base/utils/package-info.java | 3 +++ 4 files changed, 12 insertions(+) diff --git a/base/src/main/java/org/bitcoinj/base/exceptions/package-info.java b/base/src/main/java/org/bitcoinj/base/exceptions/package-info.java index e4f6a3aaa2e..9a8c688830a 100644 --- a/base/src/main/java/org/bitcoinj/base/exceptions/package-info.java +++ b/base/src/main/java/org/bitcoinj/base/exceptions/package-info.java @@ -17,4 +17,7 @@ /** * Exceptions thrown by classes in bitcoinj base. */ +@NullMarked package org.bitcoinj.base.exceptions; + +import org.jspecify.annotations.NullMarked; diff --git a/base/src/main/java/org/bitcoinj/base/internal/package-info.java b/base/src/main/java/org/bitcoinj/base/internal/package-info.java index 49ff42da11f..e9be49e8bed 100644 --- a/base/src/main/java/org/bitcoinj/base/internal/package-info.java +++ b/base/src/main/java/org/bitcoinj/base/internal/package-info.java @@ -17,4 +17,7 @@ /** * Classes for internal use only (in both {@code bitcoinj-base} and {@code bitcoinj-core}.) */ +@NullMarked package org.bitcoinj.base.internal; + +import org.jspecify.annotations.NullMarked; diff --git a/base/src/main/java/org/bitcoinj/base/package-info.java b/base/src/main/java/org/bitcoinj/base/package-info.java index 5bdce928c16..6053b5b1df3 100644 --- a/base/src/main/java/org/bitcoinj/base/package-info.java +++ b/base/src/main/java/org/bitcoinj/base/package-info.java @@ -18,4 +18,7 @@ * The {@code base} package provides foundational types for bitcoinj. This package * has no dependencies other than {@code slf4j-api} and {@code jspecify}. */ +@NullMarked package org.bitcoinj.base; + +import org.jspecify.annotations.NullMarked; diff --git a/base/src/main/java/org/bitcoinj/base/utils/package-info.java b/base/src/main/java/org/bitcoinj/base/utils/package-info.java index 7df2cd3b45b..0e2a1192b7f 100644 --- a/base/src/main/java/org/bitcoinj/base/utils/package-info.java +++ b/base/src/main/java/org/bitcoinj/base/utils/package-info.java @@ -17,4 +17,7 @@ /** * bitcoinj utility classes. */ +@NullMarked package org.bitcoinj.base.utils; + +import org.jspecify.annotations.NullMarked;