iOS新增关键字 nonnull、nullable等相关

本文详细介绍了Objective-C中nonnull和nullable的使用方式及其作用,包括如何声明属性是否可以为nil,如何利用这些特性进行代码规范及错误预防。同时,还解释了null_resettable的含义和应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,nonnull和nullable
声明属性是否可以为nil,如果对nonnull属性赋值为nil,则会报警告。
1
2
3
@property (nonatomic, strong, nonnull) NSArray *array1;

@property (nonatomic, strong) NSArray * __nullable array2;
作用主要是开发者之间交互,调用属性时可以知道这个属性是可能为nil的,针对这个状态做些处理。
默认情况下就是nullable状态。
可以用来给方法的参数最要求,比如定一个方法,参数为一个不为空的对象:
 
2,null_resettable
声明属性set方法可以为nil,但是get一定不能为nil,这里有一个貌似冲突的地方,就是可以定义个属性为nil,但是在获取这个属性的时候,这个属性不能为nil,否则会有警告。
 
这里用到的地方例如在UIViewController中的view,意味着开发者可以对控制器的view清空赋值为nil,但是控制器view是懒加载的,每次获取控制器的view时候,都可以再获取到非nil的view。
 
一个Objective-C的新特性:nullability annotations。这一新特性的核心是两个新的类型注释:__nullable__nonnull从字面上我们可以猜到,__nullable表示对象可以是NULL或nil,而__nonnull表示对象不应该为空。当我们不遵循这一规则时,编译器就会给出警告。
不过这只是一个警告,程序还是能编译通过并运行。
事实上,在任何可以使用const关键字的地方都可以使用__nullable和__nonnull,不过这两个关键字仅限于使用在指针类型上。而在方法的声明中,我们还可以使用不带下划线的nullable和nonnull
 
 
 
 

转载于:https://www.cnblogs.com/xiaohuihui-/p/7618351.html

<think>好的,用户的问题是关于Java中NonNullNullable注解导致的报错,需要解决方案。首先,我得回忆一下这些注解的作用和使用场景。NonNullNullable通常用于静态代码分析工具,比如FindBugs或IntelliJ IDEA的检查,或者像Lombok这样的库,用来标识变量、参数或返回值是否可以为null。用户遇到的错误可能是由于错误地标记了这些注解,导致编译器或分析工具报出不必要的警告或错误。 接下来,我需要考虑常见的错误类型。比如,用户可能在应该允许null的地方使用了NonNull注解,或者在明确非null的情况下使用了Nullable,导致冗余检查或潜在的NullPointerException。根据用户提供的引用,例如引用[1]提到的冗余空检查,和引用[2]中的空指针异常,这可能与注解使用不当有关。 然后,解决方案可能包括几个方面:首先是正确使用注解,确保在适当的位置添加NonNullNullable;其次是配置IDE或构建工具,正确处理这些注解;然后是使用静态分析工具来检测问题;最后是代码实践,比如结合Optional类或进行必要的空检查。 还需要考虑不同框架或库中的注解差异,例如javax.annotation、JetBrains的注解,或者Android中的支持库注解。不同的注解可能需要不同的处理方式,或者需要特定的依赖配置。例如,引用[4]提到Dagger在处理依赖注入时可能因为Retrofit实例的注入问题导致错误,这可能与作用域或注解的使用有关,但用户的问题更偏向于空注解,所以可能需要区分开。 此外,用户提供的引用中有涉及Android和Tinker库的内容,比如引用[5]提到的ApplicationLike代理,但用户的问题主要集中在NonNullNullable的错误,因此可能需要专注于标准Java中的解决方案,而不是特定于Android的部分。 可能的步骤包括: 1. 检查注解的使用是否正确,确认所有使用NonNull的地方确实不允许null,Nullable的地方允许null。 2. 确保IDE或构建工具启用了对应的注解处理,例如Lombok需要注解处理器。 3. 使用静态分析工具如FindBugs或SpotBugs来检测潜在的空指针问题,并调整注解。 4. 在代码中添加必要的空值检查,尤其是在使用Nullable返回值时。 5. 统一项目中的注解类型,避免混合使用不同来源的注解导致混淆。 6. 处理可能由框架或库(如Spring、Dagger)引起的注解冲突,确保依赖注入正确配置。 还需要注意,某些情况下,工具可能会误报,如引用[2]提到的FindBugs可能无法剪枝不可行的异常路径,导致虚假警告。这时候需要手动检查代码逻辑,确认是否真的存在风险,或者调整注解以消除警告。 最后,生成相关问题时要涵盖常见的延伸问题,比如不同注解的区别、工具配置、最佳实践等,帮助用户全面理解问题。</think>### Java中NonNull/Nullable注解错误解决方案 #### 一、问题定位与分析 当使用`@NonNull`和`@Nullable`注解时,常见错误分为两类: 1. **冗余空检查**:对明确标记为`@NonNull`的变量进行多余的null检查,触发静态分析工具警告(如引用[1]) 2. **空指针风险**:未正确处理`@Nullable`返回值导致NPE(如引用[2]) #### 二、具体解决步骤 ##### 1. 规范注解使用 - **`@NonNull`适用场景**:方法返回值、输入参数、字段值 ```java public @NonNull String formatName(@NonNull User user) { return user.getName().toUpperCase(); // 无需额外null检查 } ``` - **`@Nullable`适用场景**:允许返回null或接收null参数 ```java public @Nullable String findById(Long id) { // 可能返回null的逻辑 } ``` ##### 2. IDE配置强化 - **IntelliJ设置**: `File → Settings → Build → Compiler → Configure Annotations` 添加对应注解包路径(如`javax.annotation.Nonnull`) - **编译检查**: Maven配置添加`maven-compiler-plugin`参数: ```xml <compilerArgs> <arg>-Xlint:nullability</arg> </compilerArgs> ``` ##### 3. 代码静态分析 - **FindBugs/SpotBugs**: 通过`@CheckForNull`注解识别潜在NPE(如引用[2]场景) - **Lombok配置**: `lombok.config`文件中明确注解类型: ``` lombok.nonNull.exceptionType=IllegalArgumentException ``` ##### 4. 防御性编码实践 - **Optional封装**(Java 8+): ```java public Optional<@NonNull String> safeGet() { return Optional.ofNullable(rawGet()); } ``` - **空检查策略**: ```java void process(@Nullable String input) { if(input == null) { throw new IllegalArgumentException("输入不可为null"); // 主动防御 } // 业务逻辑 } ``` #### 三、框架集成要点 1. **Spring注解**: 使用`@NonNullApi`包级注解: ```java @org.springframework.lang.NonNullApi package com.example.service; ``` 2. **Dagger处理**(如引用[4]): 通过`@BindsOptionalOf`处理可空依赖: ```java @Module interface AppModule { @BindsOptionalOf Retrofit provideRetrofit(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值