【问题标题】:Using the clone method without catching CloneNotSupportedException使用 clone 方法而不捕获 CloneNotSupportedException
【发布时间】:2016-03-22 20:39:02
【问题描述】:

我知道在使用克隆方法时,您应该捕获 CloneNotSupportedException。然而,我最近尝试通过在数组上调用 .clone( ) 来克隆一个随机整数数组,并且成功了!不需要 try-catch 块。代码是这样的:

import java.util.Arrays;
import java.util.Random;

public class ClonePractice
{
    public static void main(String[ ] args)
    {
        int[ ] A = new int[100];

        Random random = new Random( );

        for( int i = 0; i < 100; i++ )
            A[i] = 1 + random.nextInt(100); //Get random integer between 1 and 100.

        int[ ] B = A.clone( );

        B[0] = 1000;

        System.out.println( Arrays.toString(A) );

        System.out.println( Arrays.toString(B) );

        // Arrays A and B should have different first values because they are
        // independent objects in memory.

    } // End of main method.

}  // End of ClonePractice class.

这段代码编译和运行都很漂亮!但它不需要在 try-catch 块中捕获 CloneNotSupportedException。有人可以解释为什么这是关于捕获该异常的“规则”的例外。谢谢!!!

【问题讨论】:

  • 编译器知道数组总是可克隆的,因此数组上的clone() 不会引发CloneNotSupportedException
  • “当使用克隆方法时你应该捕获 CloneNotSupportedException”是什么让你产生了这个想法?

标签: java cloning


【解决方案1】:

Object.clone() 的 javadoc 说:

注意所有数组都被认为实现了接口Cloneable

由于编译器知道数组总是可克隆的,它知道数组上的clone() 不会引发CloneNotSupportedException。它不会对其他 Cloneable 类做出这种假设,但数组似乎像往常一样被视为一种特殊情况。

【讨论】:

    【解决方案2】:

    这是根据定义。 Java 语言规范says

    10.7。数组成员
    数组类型的成员有以下几种:
    ...
    公有方法clone,覆盖Object类中的同名方法,不抛出检查异常。

    【讨论】:

      猜你喜欢
      • 2015-06-06
      • 2015-05-06
      • 2015-07-16
      • 1970-01-01
      • 2019-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-13
      相关资源
      最近更新 更多