public class StringReverse {


//  String resource = null;
//
// String result = null;
//
private static  String reverseString(String resource,String result){


for(int i=resource.length()-1;i>0;i--){
result = result + resource.charAt(i);
}

return result;
}

public static void main(String args[]){
String s = "123456789abcdefg";

String result = null;

reverseString(s,result);

System.out.println(result);

}
}这里result不是已经已经变成result + s了么?
为什么return 以后还是会为空呢?

解决方案 »

  1.   

    String result = null;
    改为String result = "";
    因为传入的是null,对null引用的操作是非法的
      

  2.   

    楼上说的对.
    String result = null;
    改为String result = "";
      

  3.   

    你的main方法中的result是一个局部变量,java中局部变量在使用前必须为其负值,而result=null并不是负值,只是创建了一个String类型的引用,该引用并没有指向任何对象(即内存)所以返回为null,如楼上两位所说改为result=""即可
      

  4.   

    null加什么都是null
    null + "sdfsFD" =null
      

  5.   

    楼上的都错了!!!把
    reverseString(s,result);
    改成
    result = reverseString(s,result);试试!java是传值的,不是传址的!
      

  6.   

    java是传值的,不是传址的!
    碰到"+",调用object的toString
      

  7.   

    除了上边探讨的问题,我有个质疑。
    for(int i = resource.length()-1; i > 0; i--)
    这句,很明显少遍历一个嘛。
    应该
    for(int i = resource.length()-1; i >= 0; i--)
      

  8.   

    问题很多啊.1.  String 类型的  null 和String相+..结果是  "nullgfedcba987654321"
        声明的时候应该赋值为""
    2.  JAVA中方法的传递是值传递....返回了只是个值....原result地址没变化..所以值也没有变化...
        改成 result = reverseString(s, result);
    3.  for循环少循环了一次..
      

  9.   

    楼上几位对参数传递的描述都不准确。
    java对于基本类型以外的类型的参数(也就是对象类型的参数),使用引用传递,传过去的是一个引用,和值传递、地址传递(java中不存在)的区别是,值传递会造成形参把实参的值复制一份,而引用传递则是形参把实参的地址复制一份,地址传递是形参直接使用实参的地址。所以,值传递后对形参的修改不会体现在实参中,地址传递对形参的修改同时就是对实参的修改,而引用传递对形参的修改不会体现在实参中——但是形参在函数开始的时候和实参引用了同一个对象,所以对形参引用对象的修改是同时修改了实参引用的对象。
    String是不可修改的类,所以指望通过传参数来改变String的内容是不可能的。
      

  10.   

    java传的是引用,并不是值传递的
    但是有几个例外,就是所有的基本类型和String类型
    基本类型是值传递的,String类型是做潜表复制的
      

  11.   

    我比较赞成zqrqq(zqrain)的解释方法!很直接!
      

  12.   

    这个程序的问题大家都已经说得很清楚了,我就不说了,我主要说一下为什么这个result没有被修改掉的原理,我觉得weihthchk(Spectrum)说得还可以,具体如下:
    1、java中基本类型以外的类型的变量本身就是引用,即变量的对应的物理地址中存放的是它所指向的object的物理地址,而不是object本身。
    2、java对于基本类型以外的类型的参数是使用引用传递的,即形参把实参的物理地址(或是物理地址中的数据)复制一份存放到形参对应的物理地址中,即这里的形参result对应的物理地址中存放的并不是object本身,而只是一个地址。
    3、我们必须查看String类的源代码,其中的concat方法是这样实现的:
    public String concat(String str) {
    int otherLen = str.length();
    if (otherLen == 0) {
    return this;
    }
    char buf[] = new char[count + otherLen];
    getChars(0, count, buf, 0);
    str.getChars(0, otherLen, buf, count);
    return new String(0, count + otherLen, buf);
    }(其他返回String的方法都是返回一个new String)
    4、从第3点的源代码可以看出,返回的是一个新字符串对象,也就是说是新的物理地址,在Test1.java中的代码result = result + resource.charAt(i);就是把result指向新字符串对象对应的物理地址,从第2点的分析中可以知道,result对应的物理地址中存放的是实参的物理地址(或是原object的物理地址),这样经过这句语句执行后,result对应的物理地址中存放的就是新字符串对象对应的物理地址了,所以result再怎么变,都不会反映到原object上了。所以所有的基本类型以外的类型的参数都是使用引用传递的,String也不例外,非String对象也存在这种现象,看如下两个类:
    public class Test2 { private static  Test3 reverseString(Test3 resource,Test3 result){
    result=result.concat(resource);
    return result;
    }

    public static void main(String args[]){
    Test3 t=new Test3("123456789abcdefg");

    Test3 t1=new Test3("tttt");

    reverseString(t,t1);

    System.out.println(t1.ls_str);
    }
    }
    public class Test3{
    String ls_str=null;

    public Test3(String a){
    ls_str= a;
    }

    public Test3 concat(Test3 t){
    return new Test3(ls_str+t.ls_str);
    }
    }