1 问题引出

(1)缘由

最近在研究如何在项目中引入Redis缓存,于是遇到可变参数这个疑惑点,之前没有好好研究过,为了避免项目后期出现问题。

(2)项目相关技术

  • SpringBoot
  • Redis
  • Kryo(数据存储使用二进制)

(3)疑惑点:

  • 概述:Redis设置List时,如果rightPushAll方法,可能发生空指针异常

@Autowired
private RedisTemplate<String, Object> redisTemplate; @Test
public void test(){
// 发生空指针异常
redisTemplate.opsForList().rightPushAll("test",null);
}
  • 源码

public class RedisTemplate<K, V> extends RedisAccessor implements RedisOperations<K, V>, BeanClassLoaderAware {

    public ListOperations<K, V> opsForList() {
if (listOps == null) {
listOps = new DefaultListOperations<K, V>(this);
}
return listOps;
} } class DefaultListOperations<K, V> extends AbstractOperations<K, V> implements ListOperations<K, V> { public Long rightPushAll(K key, V... values) {
final byte[] rawKey = rawKey(key);
final byte[][] rawValues = rawValues(values);
return execute(new RedisCallback<Long>() {
public Long doInRedis(RedisConnection connection) {
return connection.rPush(rawKey, rawValues);
}
}, true);
} }
abstract class AbstractOperations<K, V> { byte[][] rawValues(Object... values) {
final byte[][] rawValues = new byte[values.length][];
int i = 0;
for (Object value : values) {
rawValues[i++] = rawValue(value);
}
return rawValues;
} }

2 可变参数简单研究

(1)概述

  • 可变参数能够接受0个参数
  • 可变参数能够接受1个参数
  • 可变参数能够接受多个参数

(2)DEMO

  • 0个参数

public static void main(String[] args) {
test();
} private static void test(Object... values) {
System.out.println(values.getClass()); // class [Ljava.lang.Object;
System.out.println(values.length); // 0
}
  • 1个参数

// test1
public static void main(String[] args) {
test(1); // 1
} // test2
public static void main(String[] args) {
test(null); // Exception in thread "main" java.lang.NullPointerException
} // test3:这种
public static void main(String[] args) {
Object[] objects = new Object[]{null};
test(objects); // 1,不报异常了
} private static void test(Object... values) {
System.out.println(values.getClass()); // class [Ljava.lang.Object;
System.out.println(values.length);
}
  • 多个参数

public static void main(String[] args) {
test(1,2,3,"Test"); // 打印输出:1 2 3 Test
} private static void test(Object... values) {
int length = values.length;
if (values == null && length == 0) return;
Object[] localValues = new Object[length];
System.arraycopy(values, 0, localValues, 0, length);
for (Object obj : localValues) {
System.out.println(obj);
}
}

3 结论

  • 使用可变参数需要检查参数是否为null
  • 可变参数内部使用数组实现
  • 多个参数时,最好在方法内部复制一份副本,防止外部修改了参数

注:以后把字节码打印出来补充

java方法可变参数研究的更多相关文章

  1. java方法---可变参数

    可变参数 在方法的声明中,在指定参数类型后面加一个...(省略号) 一个方法中只能指定一个可变参数,它必须是方法的最后一个参数,任何普通参数必须在它之前声明:

  2. java方法可变参数的写法

    jdk1.5之后出现的,该写法避免了当有多个不同个数的参数方法时,对方法的重载.其实就是数组. package com.shipin; /** * @author QiaoJiafei * @vers ...

  3. java高级特性(3)--方法可变参数

    1.特征:... 2.方法可变参数,必须是方法参数列表的最后一位. 3.一个方法只能有一个方法可变参数. 4.方法可变参数本质是一个数组. 5.调用时按照方法可变参数赋值,多余的实参被封装成一个数组, ...

  4. 五分钟学Java:可变参数究竟是怎么一回事?

    在逛 programcreek 的时候,我发现了一些专注基础但不容忽视的主题.比如说:Java 的可变参数究竟是怎么一回事?像这类灵魂拷问的主题,非常值得深入地研究一下. 我以前很不重视基础,觉得不就 ...

  5. Java 中可变参数

    可变参数 Java 中可变参数 现在需要编写一个求和的功能,但是不知道有几个参数,在调用的时候才知道有几个参数,请问这如何实现呢? Java 给我们提供了一个 JDK 1.5 的新特性---可变参数 ...

  6. [问题记录]Java关于可变参数重载问题的测试

    突然发现java的可变参数重载是存在歧义的,只是不知道java内部是怎么处理的,特意做如下实验: 测试代码如下: /** * Created by ieayoio on 16-3-1. */ publ ...

  7. Java方法的参数传递方式为: 值传递

    Java方法的参数传递方式为: 值传递 对于基本数据类型作为参数传递时, 是"按值传递", 这点都认识很清楚. 但是, 当对象或者说引用作为参数传递, Java 的参数传递方式是& ...

  8. 大数据学习--day07(冒泡排序、Arrays工具类、方法可变参数)

    冒泡排序.Arrays工具类.方法可变参数 冒泡排序之前写过,略 Arrays工具类 二分法查询 public static int binarySearch(int[] a,int key) 头信息 ...

  9. Java方法传递参数传值还是传址的问题

    这几天重构项目代码遇到一个疑问:可不可以在方法A中定义一个boolean变量b为false,然后A调用方法C把b传递到C方法中经过一些列业务判断后修改为true,C执行结束后A方法中b的值还是原来的f ...

随机推荐

  1. Angular4.x+Ionic3 踩坑之路之打包时出现JAVASCRIPT HEAP OUT OF MEMORY的几种解决办法

    最近开发的一个比较大型的App时打生产环境包是出现内存不足导致打包失败的问题.然后百度发现解决方法都是一样,自己试了一下都没什么暖用,心里只想用呵呵来形容了.最后经朋友介绍,技术问题还得去谷歌,git ...

  2. LeetCode 被围绕的区域

    给定一个二维的矩阵,包含 'X' 和 'O'(字母 O). 找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充. 示例: X X X X X O O X X X O X X ...

  3. 路由器的路由配置命令汇总(win和linux系统)

    路由器/Linux主机/win下主机的路由配置汇总 2009-07-16 17:43:15 分类: 系统运维 工作时总是要在这三个个体中配来配去,所以为了方便,汇总了.   win下:   使用 Ro ...

  4. java 测试框架

    项目开发过程中使用的单元测试框架有Junit.TestNG以及Mockito,Junit和TestNG使用的比较多,Mockito最近才开始使用. TestNG与JUnit的相同点 1. 使用anno ...

  5. Vue篇之vue 使用Jade模板写html

    // 安装jade包 npm install jade jade-loader --save-dev // 如果使用vue-cli构建项目,则不需要安装stylus相关的包,vue-cli默认已安装 ...

  6. 16 Flutter仿京东商城项目 跳转到搜索页面实现搜索功能 以及搜索筛选

    ProductList.dart import 'package:flutter/material.dart'; import '../services/ScreenAdaper.dart'; imp ...

  7. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_01-vuejs研究-vuejs介绍

    1.vue.js是什么? Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计 为可以自底向上逐层应用.Vue 的核心库只关注视 ...

  8. 解决PLSQL Developer中的乱码问题

    很多朋友在使用PLSQL Developer的时候出现了乱码的问题,我就是其中的一员,后来通过网上的查找以及自己的探索,终于找到了最快,最可靠的解决办法,接下来我将告诉大家如何操作 1.首先在PLSQ ...

  9. mysql查看数据库所占用的空间

    查询某个表所占用的磁盘空间大小: SELECT CONCAT(ROUND(SUM(data_length/1024/1024),2),'MB') AS data_length_MB, CONCAT(R ...

  10. 以rpm安装包的方式安装MySQL

    rpm -vif MySQL-server-5.6.26-1.linux_glibc2.5.x86_64.rpm MySQL-client-5.6.26-1.linux_glibc2.5.x86_64 ...