Java中的null引用

空指针也许是java中最常见的异常,到处都埋藏着NullpointerException,最近就遇到一个NullPointException,如下: 1int lastMonthTotalScore = integralOperationReadMapper.getSumByIntegralIdAndDate(integralId, lastMonthDate); 一个很常见的情况,mybatis查询的一个列的和,此时Debug时 integralId、lastMonthDate 都不为空,自动注入的 integralOperationReadMapper也不为空但是Console却实实在在的打出了这一行有一个NullPointerException,此时没有注意到Wrapper类自动转换基本数据类型的情形。 getSumByIntegralIdAndDate 方法返回的是NULL,自动拆箱的时候的要将一个NULL转换为基本数据类型就出错了…o(╯□╰)o 现在总结几个NULL的经验。 1.不用null来返回方法的返回值 不要用null来舒适化变量,方法不要返回null、这样会造成null的传播,在每一个调用的地方都需要检查null 例如: 12345public String doSomething(int id){ String name = findName(id); ... return name;} 这样如果findName如果返回为null,那么null就由findname游走到了doSomething。比如在findname中,如果没有找到对应的Id的姓名,就应该表明是没找到,而不是出错了。 善于运用Java的异常。 1234567public String findName() throws NotFoundException { if (...) { return ...; } else { throw new NotFoundException(); } }

java

Scala中的模式匹配

模式匹配scala有一套内建的模式匹配机制,这种机制允许在任何类型的数据上与第一个匹配策略匹配。模式匹配可以应用在很多场合,switch语句,类型检查以及提取对象中的的复杂表达式。 下面是一个小例子,说明如何与一个整型值匹配: 12345678object MatchTest1 extends App { def matchTest(x: Int): String = x match { case 1 => "one" case 2 => "two" case _ => "many" } println(matchTest(3))}

scala

使用Scala实现快速排序

首先是一个用Scala写的简单的快速排序的栗子(非函数式): 123456789101112131415161718192021def sort(xs: Array[Int]) { def swap(i: Int, j: Int) { val t = xs(i); xs(i) = xs(j); xs(j) = t } def sort1(l: Int, r: Int) { val pivot = xs((l + r) / 2) var i = l; var j = r while (i <= j) { while (xs(i) < pivot) i += 1 while (xs(j) > pivot) j -= 1 if (i <= j) { swap(i, j) i += 1 j -= 1 } } if (l < j) sort1(l, j) if (j < r) sort1(i, r) } sort1(0, xs.length - 1) }

scala

函数式编程语言Scala的学习(Hello Scala)

Scala吸收了收并继承了多种语言中的优秀特性,另一方面也没有抛弃Java这个强大的平台,它可以运行在 Java 虚拟机之上,能够轻松地与Java互联互通。与Java不同的是,Scala既支持面向对象的特性,又支持函数式编程,被称为是Java的替代语言,是更好的Java,下面开始学习这一强大的语言。 Scala和Java比较在Scala中 所有类型都是对象 函数是对象 支持Domain specific language (DSL)领域特定语言 特质(Trait) 闭包(Closure),嵌套函数 Erlang支持的并发设计 类型推导 基础语法表达式scala> 1 + 1 res0: Int = 2 res0是解释器自动创建的变量名称,指代表达式计算的结果,是Int类型的,值为2。在scala几乎一切都是表达式。 变量和值可以将表达式赋给一个或者不变量(val)–值或者变量(var) scala> val two = 1 + 1 two: Int = 2 如果需要以后修改这个名称和结果的绑定,需要使用var(变量),大部分的情况下用val的情况居多。 scala> var name = "zhaohongxuan" name: java.lang.String = zhaohongxuan scala> name = "zhaoxiaoxuan" name: java.lang.String = zhaoxiaoxuan

scala

使用Spring boot 创建RestFul服务

准备工作1.JDK82.Maven 3.0+ 程序要实现的简单功能当用户访问 http://localhost:8080/greeting 返回一个默认的Json字符串 {"id":1,"content":"Hello, World!"} 当用户访问 http://localhost:8080/greeting?name=User 返回 name后面的参数在后台组成的字符串 {"id":1,"content":"Hello, User!"} 创建Maven项目创建一个普通的maven项目,添加maven依赖如下:

spring框架

Executor任务执行框架的应用

最近一段时间没有写东西了,看大名鼎鼎的Brian Goetz写的Java Concurrency in Practice时候,看到任务执行框架Executor Framework的时候,觉得纸上得来终觉浅,索性写点东西加深一下印象。 在JDK1.5中,Java平台中增加了一个并发包java.util.concurrent,这个包中包含了Executor Framework,而且还包含了很多并发包,比如并发HashMapConcurrentHashMap、阻塞队列BlockQueue、栅栏的实现CyclicBarrier、信号量Semaphore、异步任务FutureTask等等。在处理多线程任务的时候,使用Executor和task要优于使用线程,这也不是我说的,是Effect Java的作者 Joshua Bloach说的,下面来阐述一下为什么。 并发任务执行当要执行一个并发任务的时候,通常有两种方式,一种是串行的处理方式,一种是并行的处理,显然,串行的方式只能一次处理一个任务,当程序在执行当前的任务的时候,就说明接下来到来的任务请求都要等待当前的任务执行完毕才能获得CPU去执行任务,这种方式虽然不会犯错,但是效率太低。那么,如果每一个任务到来都分配一个新的任务呢,这种方式貌似很好,但是: 如果任务请求量非常大的时候会出现一定的问题,因为它没有限制可以创建的线程的数量. 线程生命周期的开销很高 线程的创建和销毁不是没有代价的,根据平台的不同,开销不同,但是不要忘记,线程的创建是需要时间的。 活跃的线程会消耗系统资源 活跃的线程很消耗系统资源,尤其是内存,如果可运行的线程数量多于处理器核心数,那么多余的线程将闲置,但是闲置的线程仍然是消耗系统资源的,尤其 是内存,给GC回收垃圾带来压力,而且线程间在进行竞争的时候也会消耗大量的资源 平台可创建的线程数量是有限的 也就是说,如果创建的线程超出了平台的限制那么,JVM就可能抛出OutofMemoryError的异常

java

跑在立冬边上

村上春树说, 今天不想去跑步,所以才去跑步,这才是长跑者的思维 因为这句话,我专门买了村上君的《当我谈跑步的时,我谈些什么》,这本书让我对跑步有了更加深层次的认识。今天是2015年立冬,跑步也进入到了一年中最艰难的时候,上海的立冬并没有那么的冷,前一阵子冷空气经过上海的时候,冷了那么几天,但是过后天气又变得温暖起来了,算起来,从7月20号开始跑步到现在也快4个月了,也跑了将近500公里了。从蝉鸣的夏季,到燥热的秋季,再到冷风习习的冬季,时光就在脚步的一抬一落间逝去了,从身体流走的汗水已经数不清到底有多少了,喜欢奔跑的感觉,喜欢超越昨天自己的感觉,汗水浸润每一个细胞,感觉自己是真的自己。 十月份的国庆节中间耽误了一周没有跑步,所以国庆节一过便迫不及待的跑了起来,连着两周跑了半程马拉松,成绩也都还不错,都在2个小时之内,都是线上跑的,自己在学校的时候也跑过全程马拉松,但是,那是白天,而且有好多人一起跑,和现在不同,现在是一个人跑,而且是晚上,还有的路段,没有路灯,但是跑下来竟然没有感觉脚起泡,而且腿似乎也没有感觉特别酸痛,只是过了一天才感觉到。跑步,让自己的内心平静了很多,不管有多么不开心的事情,去跑步了,淋漓大汗过后,就会发现,其实也不过如此,哪有什么天大的事。再次,跑步让我明白了一个非常非常浅的道理,那就是,just do it. 以前做事情的时候,总是在想别人看到会怎么样,会怎么说,其实,哪有那么多闲人在意你在做什么,你去跑步根本没有人在意你,就算有人说你了,TA又和你没有半点交集怕什么,当你真正穿上跑鞋,在路上奔跑的时候,你会发现世界都是你的,每次跑完10公里,在栏杆上压腿的时候,感觉到自己的心跳和呼吸,但是心里却是很平静,我希望跑步能陪我很久很久。 这几天,上海的天气一点都不好,只要一出门跑步肯定是不会下雨的,但是等自己跑到一半的时候就开始下了,就这样连着三天,每天都被雨淋,但是感觉当雨水打在脸上的时候,会发现自己的脚步更加坚定了,因为觉得,老子连在雨里跑步都不怕,还会怕什么呢,哈哈。经过了一年最热的日子,去迎接美好的冬天,用心去过好每一天,发现身边的美。 老罗说, 失败只有一种,那便是半途而废.

散文随笔

JDK动态代理和cglib动态代理

一晃眼,国庆节已经过去了,时间到了10月中旬了,总是感觉时间不够用,想多看点书,多写点代码,在点滴中积淀属于自己的知识系统。 闲言少叙,先来说一下什么是代理模式,我们去一个新的地方总是要先找地方住,但是我们人生地不熟的掌握的资源不多,这时候一般会找中介,中介对房源很熟悉,很快就能为你找到合适的房子,这时候,中介就是一个代理,你就相当于是一个委托方。 下面是设计模式中的代理: 代理模式代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。 按照代理的创建时期,代理类可以分为两种: 静态代理由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。 动态代理在程序运行时,运用反射机制动态创建而成。 动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类。java.lang.reflect 包中的Proxy类和InvocationHandler 接口提供了生成动态代理类的能力。 动态代理有很多种,先看第一种,JDK动态代理

java

vue.js学习笔记(二)

继续上一篇文章,中间耽误了一个多星期,去面试和复习以前的代码,继续愉快的的vue.js学习之旅 :)… 列表渲染vue.js的v-repeat指令用来根据相对应的ViewModel的对象数组来渲染列表。 简单示例html代码: 12345<ul id="demo"> <li v-repeat="items" class="item-{{$index}}"> {{$index}} : {{parentMsg}} {{childMsg}} </li></ul> js代码: 12345678910var demo = new Vue({ el: '#demo', data: { parentMsg: '你好', items: [ { childMsg: '赵' }, { childMsg: '宏轩' } ] }}) 这些子实例继承父实例的数据作用域,因此在重复的模板元素中你既可以访问子实例的属性,也可以访问父实例的属性。还可以通过$index属性来获取当前实例对应的数组索引。

技术随笔

Redis 整合Spring

Redis是一种性能非常高效的Key-Value数据库,在企业项目开发中应用广泛,因为一直用Spring,所以决定使用Spring支持的spring-data-redis,java中Redis有多种客户端,Spring推荐的是Jedis,这篇文章就是基于Jedis的。 SDR(Spring Data Redis)简介**SDR(Spring Data Redis)**支持低层次的通过连接器connector连接到Redis,支持高层次的友好的模板类RedisTemplate,RedisTemplate是建立在低级别的connection基础之上。RedisConnection接收或返回字节数组需要自身处理连接,比如关闭连接,而RedisTemplate负责处理串行化和反串行化,并且管理对连接进行管理。RedisTemplate提供操作视图,比如(Bound)ValueOperations,(Bound)ListOperations,(Bound)SetOperations,(Bound)ZSetOperations,(Bound)HashOperations。RedisTemplate是线程安全的,能够用于多个实例中。RedisTemplate默认选择java-based串行化,也可以切换为其它的串行化方式,或者设置enabledDefaultSerializer为false或者设置串行化器为null,则RedisTemplate用raw byte arrays表示数据。SDR连接到redis通过RedisConnectionFactory来获得有效的RedisConnection。RedisConnection负责建立和处理和redis后端通信。RedisConnection提供getNativeconnection返回用来通信的底层connection。 Maven的pom.xml文件配置在dependencies中添加两个依赖,分别是spring-data-redis和jedis 12345678910111213<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.4.2.RELEASE</version> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.6.2</version> <type>jar</type> <scope>compile</scope> </dependency>

spring框架
16789

本站由 Hank Zhao 使用 Stellar 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
本站总访问量