hi string有下面代码,  
  public char[] toCharArray() {
        // Cannot use Arrays.copyOf because of class initialization order issues
        char result[] = new char[value.length];
        System.arraycopy(value, 0, result, 0, value.length);
        return result;
    }
为什么不能用copyof呢,后面写的是初始化次序问题
可是 copyof的实现跟上面几乎一样...
    public static char[] copyOf(char[] original, int newLength) {
        char[] copy = new char[newLength];
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }

解决方案 »

  1.   

    没看懂你是什么意思,
    但是你的目标数组长度跟源数组长度不一样,
    toCharArray这个方法源数组跟目标数组长度一样。
    所以你copyof会出现丢失字符以及字符变多的情况。
      

  2.   

    import java.util.Arrays;public class ArrayDemo {
    public static void main(String[] args) {
    int[] arr1 = {1, 2, 3, 4, 5}; 
    int[] arr2 = Arrays.copyOf(arr1, 10);for(int i = 0; i < arr2.length; i++) 
    System.out.print(arr2[i] + " "); 
    System.out.println();
    }

    执行结果:1 2 3 4 5 0 0 0 0 0
      

  3.   

    仔细看下代码啊,骚年,不一样的
    一个是原封不动的char数组
    另外一个是复制指定长度的,如果所指定的长度大于源字符串的长度,补足的部分是char的默认值0,;如果指定长度小于源字符串的长度,就是按指定长度截取了
      

  4.   

    FileReader r = null; 
     try { 
         r = new FileReader("blah"); 
     } catch (IOException e) { 
         e.printStackTrace(); 
     } 
     r.read(.....);
      

  5.   

    FileReader r = null; 
     try { 
         r = new FileReader("blah"); 
     } catch (IOException e) { 
         e.printStackTrace(); 
     } 
     r.read(.....);
      

  6.   

    谢谢 楼上的回复.
      public char[] toCharArray() {
            // Cannot use Arrays.copyOf because of class initialization order issues
            char result[] = new char[value.length];
            System.arraycopy(value, 0, result, 0, value.length);
            return result;
        }
    上面是string.java里面的代码.但是我如果改成下面的
      public char[] toCharArray() {
            // Cannot use Arrays.copyOf because of class initialization order issues
            return Arrays.copyof(value,value.length);
        }
    是否可以?看注释好像是不行的
      

  7.   

    作者注释写的很清楚了, 由于类初始化顺序的问题。
    虽然String 和Arrays 都属性rt.jar中的类,但是BootstrapClassloader 在加载这两个类的顺序是不同的。
    所以当String.class被加载进内存的时候,Arrays此时没有被加载,所以直接使用肯定会抛异常。而System.arrayCopy是使用native代码,则不会有这个问题。
    另外你说的把代码换掉以后也能运行, 这时候 jvm已经加载完了所有的系统类, 所以你才会看到也能正常运行。建议楼主去了解一下jvm 类加载器方面的知识 就明白了