gpt4 book ai didi

java - 这个对 getString 的调用实际上会返回 null 吗?

转载 作者:行者123 更新时间:2023-11-29 20:45:52 26 4
gpt4 key购买 nike

我已将 Android Studio 更新到最新版本 1.2。我最近还更新了其他组件,例如 Android Gradle Extensions。

现在我收到关于我之前注释为 NotNull 的方法的警告。警告是:表达式可能计算为 null 但由声明为 @NotNull 的方法返回

这是一个例子:

public class MyApplication extends Application {
private static SharedPreferences sPrefs = null;

/**
* Corresponds to a string value.
*
* @see #setDeviceInfo(String, String, String)
*/
private static final String PREF_DEVICE_INFO_DEVICE_ADDRESS = "deviceaddress";

@Override
public void onCreate() {
super.onCreate();
sPrefs = PreferenceManager.getDefaultSharedPreferences(this);
}

@NonNull
public static String getDeviceAddress() {
return sPrefs.getString(PREF_DEVICE_INFO_DEVICE_ADDRESS, "");
}
}

我认为在这种情况下 getString 无法返回 null,因为我已经设置了默认值 ""

甚至当我查看 getString 的实现时(无论如何在 API 22 中),这似乎是 android studio 只是忽略了我的默认值不为 null 和做出默认值可能为空的错误假设。
API 22 实现:

public String getString(String key, String defValue) {
synchronized (this) {
awaitLoadedLocked();
String v = (String)mMap.get(key);
return v != null ? v : defValue;
}
}

在我继续之前,我仍然需要社区让我放松或指出我缺少的东西。

最佳答案

你很安全

你确实安全了。

您正在指定一个默认值,并且该方法不能返回 null 值(除非您将其指定为您的 defValue)。

为什么会出现警告??

由于多种原因,IntelliJ/AndroidStudio 无法确定逃逸路线并确定您的方法使用是否安全。并且方法契约没有正式拒绝 defValue 的空值。

此外,您将方法注释为 @NotNull,但 getString 本身未注释(并且这些不一定运行时检查)。

最后,我想知道您是不是错误地在@NotNull 和@NonNull 之间切换了注解,从而切换了注解检查的实现提供者。您在错误和描述中提到了@NotNull,但代码使用了@NonNull。他们的行为并不相同。例如,IntelliJ 的 NonNull 是一个静态检查。

参见 Which @NotNull Java annotation should I use?一个很好的总结。

其他可能的问题

以防万一...

对于 null 键,getString 上可能存在 NPE

但是,如果您指定一个 null 键,您可能会得到 Map 抛出的 NullPointerException。但这取决于所使用的 map 实现以及该 map 是否不允许空键(我没有调查过),这对您来说不是问题(至少在您提供的代码 fragment 中不是)。

由于 SharedPreferences 没有在其契约中指定任何关于实现的内容,因此应该只信任 JDK 的 Map.get()文档状态:

NullPointerException - if the specified key is null and this map does not permit null keys (optional)

可能的ClassCastException

还要注意 SharedPreferences.getString文档警告如果存储的首选项不是 String 类型,您可能会得到 ClassCastException(我想在您的情况下不太可能,但我提到它以防万一):

Throws ClassCastException if there is a preference with this name that is not a String.

关于java - 这个对 getString 的调用实际上会返回 null 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30381447/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com