一个基础问题的深入讨论,见以下代码:String s1 = "abc";
String s2 = null;
System.out.println(s1 + s2);以上代码会得到的结果是:abcnull,我希望得到abc,有没有办法。个人希望能通过类似重载运算符的的方法解决,不希望改变太多现有代码,请教大虾,突然发现不能重载云算法,也无法继承StringBuffer重写append。PS:什么通过非空判断、自己写function来实现字符串与的童鞋勿扰。String

解决方案 »

  1.   

    你不希望改变太多代码。又想继承StringBuffer重写append。就算能继承,也得改代码呀
      

  2.   

    String s2 = "";你试下
      

  3.   

    1. String在Java算是基础类型,无法被继承。如果你在考虑用反射,我觉得还是不要这样了。首先它对这个情况不会有帮助,其次它会破坏整个JDK以及其他依赖里面一切类的行为
    2. Java没有运算符重载
    3. 这么跟你说吧,你想做的这件事情,就跟让1+2 = 5一样。首先不可能,其次影响其他代码,因为这是一个基础操作,一动,整个程序就坏掉了
      

  4.   

    String s1 = "abc";
    String s2 = null;
    System.out.println(s1 + s2);
    如果这是一段java代码,那么输出的结果只能是abcnull,不管你用什么其它任何java支持的方法,都不能改变这个结果。除非改变java语言、JDK或者JVM。
      

  5.   

    String s1 = "abc";
    String s2 = null;
    System.out.println((s1 == null ? "" : s1) + (s2 == null ? "" : s2));
      

  6.   

    System.out.println出来的就是String类的toString方法……
      

  7.   

    楼主要想清楚自己的需求:
    1、只有当s2==null时才输入“abc”,5楼答案是正解
    2、还是忽略s2的值(这个不大可能吧)?或有其他什么想法?
      

  8.   

    本质上是 调用+运算时调用的String 的valueOf 静态函数
    java这么写的,我也没办法重写 String的valueOf函数只能重写PrintStream
    //重写System.out.println的PrintStream
    class MyPrintStream extends PrintStream
    {
    public MyPrintStream(PrintStream systemout) {
      super(systemout);
     } @Override
        public void print(String s) 
    {
    s = s.replaceAll("null","");
    super.print(s);
        }
    }
     public class Test {
         
        public static void main(String[] args) throws Exception{ String s = "abc";
    String s2 = null;
    System.out.println(); MyPrintStream myPrintStream = new MyPrintStream(System.out);
    System.setOut(myPrintStream);
    System.out.println(s2+s);
        }
    }
      

  9.   

    最简单的办法,是修改String 的valueOf 函数源码如下:    public static String valueOf(Object obj) {
            return (obj == null) ? "null" : obj.toString();
        }如果你修改的了,就吧 "null"换成 "" 就ok了。
      

  10.   

    只能怪java的valueOf函数设计的太搞,如果是我,我一定会设计个接口
    用于替换默认的 null 处理。
    比如 setDefaultValueForNull  之类的函数,修改一个static成员指定valueOf函数 碰到null Object的行为再或者,干脆能重写valueOfbut,这是个static函数,如何重写?之所以是static ,无非是就要处理实例是null的情况。
      

  11.   

    谢谢这么多大侠回复,我其实问这个问题只是抛砖引玉,看看大家是否遇到过这个问题,怎么解决的。上面的代码当然是个示例,实际需求我觉得各种时候都会遇到这种尴尬,遇到null时到底是业务数据还是空数据,得到该字符串时的业务流程中可能已经无从判断。我的业务场景其实很简单,就是构建xml和解析xml。构建时不做足够的非空判断就会出现null数据。解析时就很纠结。现在只有行政上要求构建字符串时业务流程做足够的非空判断,但仍然理论上不存在。实际上有没有null、日后能不能保证不出现仍无从结论。所以,如果有像C++重载运算符的方式,仍然不改变现有的字符串使用方法,对开发者相对透明我觉得解决问题是比较彻底的。而且我觉得是通用需求,如果是空指针我情愿要空值,要个null有毛用。