String.valueOf

今天在排查问题的时候发现String.valueOf 的一个有意思的问题:

第一种情况:

String.valueOf(null);

第二种情况:

Map<String, Object> map = new HashMap<String, Object>();
String a = String.valueOf(map.get("a"));

第一种情况会报空指针异常,第二种情况不会报异常,只是得到一个null 。

上网查了一下,原因如下:

String.valueOf方法有好几个重载方法,但是由于null不可能赋值给基本数据类型,所以只剩下2个备选的方法:String valueOf(char data[]) 和 String valueOf(Object obj)

查看代码可以看到String valueOf(Object obj)进行了判空,而String valueOf(char data[])没有。所以很明显,第一种情况调用了String valueOf(char data[]),所以是报了空指针异常;而第二种情况下,调用了String valueOf(char data[]),所以没有报。

null对于String valueOf(char data[]) 和 String valueOf(Object obj)的参数都是使用的,那么java如何选择:

首先,对于第二种情况,很容易理解,由于map指定了泛型,所以从这个map取出来的肯定是一个Object 类型的参数,肯定会调用String valueOf(Object obj)方法。

对于第一种情况,java会选取精确度最高的一种重载方法。如果对于某个参数,String valueOf(char data[])可以适用的话,String valueOf(Object obj)是肯定可以适用的,所以String valueOf(char data[])的精确度就比String valueOf(Obect obj)的精确度要高,null同时适用于这两个方法,所以java会选取精确度较高的一个来执行。

展开阅读全文

String.valueOf(Socket s)

10-04

想巩固一下J2SE的内容,最终决定做一个模仿QQ的聊天程序,因为这个小程序里几乎包含了J2SE的大部分知识。有人会说:你这不就是个C/S的通讯吗。 你这个不就是个什么什么吗。rn 是的,我这个就是一个小东西,因为不会所以我才做动手做。rnrn 我程序的大概思路是:某一个用户登录,通过服务器把自己的信息和在线好友的信息全部下载到本地,这里好友的信息包括Socket的一部分内容,我想在某一个用户发起对好友会话时候新new一个TCP或UDP的链接。rn 但是,目前看来是不可以的,因为如果这么做的话,对方要是走路由器的话,那么信息就不会接收到。rnrn 于是我想到用服务器进行转发(这里我不知道腾讯是不是这么做的,用服务器转发消息?如果知道的朋友可以告诉我一下)rn 因为用服务器转发是在服务器端保留用户的Socket信息,通过getOutPutStream来进行通讯;所以我还有另一种想法:rn 客户登陆时候我保存一些信息,那么我可不可以用这些信息给转变成一个Socket呢?rn 也就是强制类型转换,这样的话我就可以把信息存到数据库中,等某个用户需要时再从数据库中拿出相关信息 进行类型转换,变成Socket。rnrn 我的问题就是:1.这种类型转换可能实现么?如何实现?rn 2.腾讯公司是用服务器转发消息吗?rnrn 在这里先谢谢各位! 论坛

没有更多推荐了,返回首页