CloneNotSupportedException
日本語 | 複製不可能例外 |
英語 | clone not supported exception |
ふりがな | くらすのっとさぽーてっどえくせぷしょん |
フリガナ | クラスノットサポーテッドエクセプション |
J2SEに含まれるクラスのひとつ。パッケージも含めたクラス名はjava.io.CloneNotSupportedException。
例外の一種。
Cloneableインターフェイスの実装クラス以外でObjectクラスのclone()メソッドを呼び出すと投げられる。
例外の一種。
Cloneableインターフェイスの実装クラス以外でObjectクラスのclone()メソッドを呼び出すと投げられる。
// Sample.java
public class Sample
{
public static void main( String[] args )
{
try
{
// DataUseSuperクラスの使用例。
// 元インスタンスを作ります。
DataUseSuper data = new DataUseSuper();
data.setData( 100 );
System.out.println( data.getData() );
// 100
// clone()メソッドで複製を作ります。
DataUseSuper dataCloned = (DataUseSuper)data.clone();
// 出力します。
System.out.println( dataCloned.getData() );
// 100
}
catch( CloneNotSupportedException e )
{
e.printStackTrace();
}
try
{
// DataNotCloneableImplementedクラスの使用例。
// 元インスタンスを作ります。
DataNotCloneableImplemented data = new DataNotCloneableImplemented();
data.setData( 200 );
System.out.println( data.getData() );
// 200
// clone()メソッドで複製を作ります。
DataNotCloneableImplemented dataCloned = (DataNotCloneableImplemented)data.clone();
}
catch( CloneNotSupportedException e )
{
// DataNotCloneableImplementedクラスは、Cloneableインターフェイス
// の実装クラスじゃないのに、Objectクラスのclone()メソッドで
// 複製を作ろうとしたので、CloneNotSupportedException例外が投げられます。
e.printStackTrace();
// java.lang.CloneNotSupportedException: DataNotCloneableImplemented
// at java.lang.Object.clone(Native Method)
// at DataNotCloneableImplemented.clone(Sample.java:113)
// at Sample.main(Sample.java:39)
}
}
}
/**
* Objectクラスのclone()メソッドをオーバーライドして、
* Objectクラスのclone()メソッドを使用して複製を作ります。
*/
class DataUseSuper implements Cloneable
{
private int data;
public void setData( int i )
{
data = i;
}
public int getData()
{
return data;
}
/**
* Objectクラスのclone()メソッドをオーバーライドします。
*/
protected Object clone() throws CloneNotSupportedException
{
// Objectクラスのclone()メソッドで複製を作ります。
// Cloneableインターフェイスの実装クラスでないと
// CloneNotSupportedException例外が投げられます。
return super.clone();
}
}
/**
* Objectクラスのclone()メソッドをオーバーライドして、
* Objectクラスのclone()メソッドを使用して複製を作ります。
* ただし、Cloneableインターフェイスの実装クラスでは
* ありません(つまり間違った例です)。
*/
class DataNotCloneableImplemented
{
private int data;
public void setData( int i )
{
data = i;
}
public int getData()
{
return data;
}
/**
* Objectクラスのclone()メソッドをオーバーライドします。
*/
protected Object clone() throws CloneNotSupportedException
{
// Objectクラスのclone()メソッドで複製を作ります。
// でも、Cloneableインターフェイスの実装クラスではないので
// CloneNotSupportedException例外が投げられます。
return super.clone();
}
}
public class Sample
{
public static void main( String[] args )
{
try
{
// DataUseSuperクラスの使用例。
// 元インスタンスを作ります。
DataUseSuper data = new DataUseSuper();
data.setData( 100 );
System.out.println( data.getData() );
// 100
// clone()メソッドで複製を作ります。
DataUseSuper dataCloned = (DataUseSuper)data.clone();
// 出力します。
System.out.println( dataCloned.getData() );
// 100
}
catch( CloneNotSupportedException e )
{
e.printStackTrace();
}
try
{
// DataNotCloneableImplementedクラスの使用例。
// 元インスタンスを作ります。
DataNotCloneableImplemented data = new DataNotCloneableImplemented();
data.setData( 200 );
System.out.println( data.getData() );
// 200
// clone()メソッドで複製を作ります。
DataNotCloneableImplemented dataCloned = (DataNotCloneableImplemented)data.clone();
}
catch( CloneNotSupportedException e )
{
// DataNotCloneableImplementedクラスは、Cloneableインターフェイス
// の実装クラスじゃないのに、Objectクラスのclone()メソッドで
// 複製を作ろうとしたので、CloneNotSupportedException例外が投げられます。
e.printStackTrace();
// java.lang.CloneNotSupportedException: DataNotCloneableImplemented
// at java.lang.Object.clone(Native Method)
// at DataNotCloneableImplemented.clone(Sample.java:113)
// at Sample.main(Sample.java:39)
}
}
}
/**
* Objectクラスのclone()メソッドをオーバーライドして、
* Objectクラスのclone()メソッドを使用して複製を作ります。
*/
class DataUseSuper implements Cloneable
{
private int data;
public void setData( int i )
{
data = i;
}
public int getData()
{
return data;
}
/**
* Objectクラスのclone()メソッドをオーバーライドします。
*/
protected Object clone() throws CloneNotSupportedException
{
// Objectクラスのclone()メソッドで複製を作ります。
// Cloneableインターフェイスの実装クラスでないと
// CloneNotSupportedException例外が投げられます。
return super.clone();
}
}
/**
* Objectクラスのclone()メソッドをオーバーライドして、
* Objectクラスのclone()メソッドを使用して複製を作ります。
* ただし、Cloneableインターフェイスの実装クラスでは
* ありません(つまり間違った例です)。
*/
class DataNotCloneableImplemented
{
private int data;
public void setData( int i )
{
data = i;
}
public int getData()
{
return data;
}
/**
* Objectクラスのclone()メソッドをオーバーライドします。
*/
protected Object clone() throws CloneNotSupportedException
{
// Objectクラスのclone()メソッドで複製を作ります。
// でも、Cloneableインターフェイスの実装クラスではないので
// CloneNotSupportedException例外が投げられます。
return super.clone();
}
}
// Sample.java public class Sample { public static void main( String[] args ) { try { // DataUseSuperクラスの使用例。 // 元インスタンスを作ります。 DataUseSuper data = new DataUseSuper(); data.setData( 100 ); System.out.println( data.getData() ); // 100 // clone()メソッドで複製を作ります。 DataUseSuper dataCloned = (DataUseSuper)data.clone(); // 出力します。 System.out.println( dataCloned.getData() ); // 100 } catch( CloneNotSupportedException e ) { e.printStackTrace(); } try { // DataNotCloneableImplementedクラスの使用例。 // 元インスタンスを作ります。 DataNotCloneableImplemented data = new DataNotCloneableImplemented(); data.setData( 200 ); System.out.println( data.getData() ); // 200 // clone()メソッドで複製を作ります。 DataNotCloneableImplemented dataCloned = (DataNotCloneableImplemented)data.clone(); } catch( CloneNotSupportedException e ) { // DataNotCloneableImplementedクラスは、Cloneableインターフェイス // の実装クラスじゃないのに、Objectクラスのclone()メソッドで // 複製を作ろうとしたので、CloneNotSupportedException例外が投げられます。 e.printStackTrace(); // java.lang.CloneNotSupportedException: DataNotCloneableImplemented // at java.lang.Object.clone(Native Method) // at DataNotCloneableImplemented.clone(Sample.java:113) // at Sample.main(Sample.java:39) } } } /** * Objectクラスのclone()メソッドをオーバーライドして、 * Objectクラスのclone()メソッドを使用して複製を作ります。 */ class DataUseSuper implements Cloneable { private int data; public void setData( int i ) { data = i; } public int getData() { return data; } /** * Objectクラスのclone()メソッドをオーバーライドします。 */ protected Object clone() throws CloneNotSupportedException { // Objectクラスのclone()メソッドで複製を作ります。 // Cloneableインターフェイスの実装クラスでないと // CloneNotSupportedException例外が投げられます。 return super.clone(); } } /** * Objectクラスのclone()メソッドをオーバーライドして、 * Objectクラスのclone()メソッドを使用して複製を作ります。 * ただし、Cloneableインターフェイスの実装クラスでは * ありません(つまり間違った例です)。 */ class DataNotCloneableImplemented { private int data; public void setData( int i ) { data = i; } public int getData() { return data; } /** * Objectクラスのclone()メソッドをオーバーライドします。 */ protected Object clone() throws CloneNotSupportedException { // Objectクラスのclone()メソッドで複製を作ります。 // でも、Cloneableインターフェイスの実装クラスではないので // CloneNotSupportedException例外が投げられます。 return super.clone(); } }