java 函数参数为空_java 参数传递 空对象 null

博主写Java程序时传递数组名给函数,运行报“NullPointerException”。文章先介绍Java函数调用传递对象引用、变量内存存储等预备知识,对比基本类型值传递,分析引用传递过程,最后指出错误原因是未给数组在堆中开辟空间,退化成值传递。

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

前两天,写程序时候,想传递一个数组名给一个函数,然后给数组new一下,并初始化数据,这样就使用非return,获得了一个初始化过对象,但是运行程序报“NullPointerException”。这是为什么???代码如下:

public class Test_object {

public int i;

public void star(){

int a[] = null;

int i;

init_a(a);

for(i=0; i

在开始讲解前,讲下预备知识!

1.java的函数调用的时候传递的是对象的引用。

2.变量存储在两块内存,变量名放在栈内存中,对象放在堆内存中。

3.对于对象,java传递参数时候,会将堆内存的地址传给函数。

4.数组在java中类似对象。

5.只声明不进行new的对象,不会在堆内存中开辟空间。

让我们回想下基本类型int、char等等的参数传递方式,是值传递。我们知道基本类型的变量存放在栈内存中,而没有存放在堆内存中。另外,在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。我们知道当值传递的时候,虚拟机在栈中开辟一块空间a,复制被传递的基本类型变量,然后将这个空间a交给目标函数。我们知道对象变量,也是存放在栈中的。那么我们猜想java中的引用传递应该是这样的过程:在栈中开辟一块空间b,然后将对象变量的值(也就是对象在对内存的地址)赋给b,这样就可以在函数中调用这个对象了,也就是所谓的引用传递。

总结:

1.值传递就是:新生成一个变量指向这个变量

2.此题的错因:这里我们没有给数组a在堆中开辟空间,那么a的栈内存中没有对象的地址值,所以此时退化成值传递

### 解决 OpenFeign 传递对象参数为的问题 当遇到 OpenFeign 传递对象参数为的情况时,这通常是因为客户端发送的数据未能被正确序列化或服务器端未能成功解析接收到的数据。具体来说: #### 原因分析 1. **缺少必要的 HTTP 头信息**:如果请求头中缺失 `Content-Type` 或者其值设置不当,则可能导致接收方无法识别传入的内容格式,进而使得对象属性全部为默认值(即)。[^2] 2. **Jackson 序列化配置问题**:虽然 OpenFeign 默认采用 Jackson 来处理 JSON 的编解码工作,但如果项目中有自定义的 ObjectMapper 配置未生效,或是存在某些字段名大小写敏感等问题,也可能引发此类现象。[^1] 3. **实体类设计不合理**:比如缺乏无参构造函数、getter/setter 方法不全等都会影响到 JavaBean 被正常映射。 4. **网络通信异常**:偶尔也会因为网络波动造成数据包丢失而使目标服务收不到完整的报文体。 #### 解决策略 针对上述可能的原因,可以采取以下措施来解决问题: - **确保正确的 Content-Type 设置** 为了保证前后端能够顺利交互,建议显式指定 POST 请求中的 `Content-Type` 为 `application/json;charset=UTF-8` 并通过 FeignClient 接口上的 `@Headers` 注解声明该头部信息。这样做有助于让对方知道即将接受的是什么类型的负载体并据此调整自身的解析逻辑。 ```java @FeignClient(name = "exampleService", url = "${service.url}") public interface ExampleService { @PostMapping(value = "/api/example", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) ResponseEntity<String> createExample(@RequestBody(required=true) ExampleDTO exampleDto); } ``` - **优化 Jackson 配置** 确认应用程序上下文中已注册了一个全局适用且经过适当定制化的 `ObjectMapper` 实例;同时注意检查是否有任何特殊的命名策略应用于 Bean 属性上——这些都关系着最终生成/读取出来的 JSON 字符串能否与预期一致。 ```yaml spring: jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8 default-property-inclusion: non_null # 只包含非 null 的属性 ``` - **完善 DTO 设计** 遵循标准的 POJO 编程模式构建用于传输的数据载体类,包括但不限于提供公共可见度级别的 getter 和 setter 访问器以及至少一个不含参数的构造方法。此外还可以考虑引入 Lombok 插件来自动生成这部分样板代码从而减少人为失误的概率。 ```java @Data // 使用Lombok简化编码 @NoArgsConstructor(access=AccessLevel.PUBLIC) @AllArgsConstructor(staticName="of") @JsonInclude(JsonInclude.Include.NON_NULL) public class UserDTO { private Long id; private String username; private Integer age; public static final class Builder { ... } } ``` - **增强日志记录机制** 启用更详细的调试级别日志输出以便于追踪整个调用链路里究竟发生了什么事情,特别是关注那些涉及 I/O 操作的地方是否存在超时或者其他形式的错误提示。这对于排查间歇性的连接失败特别有用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值