0

Java.IO.FileInputStream から継承するクラスがあります。次のようになります。

public class DeviceInputStream : FileInputStream
{
    private FileDescriptor descriptor = null;
    private byte currentValue;

    public DeviceInputStream(FileDescriptor fd) : base(fd)
    {
        descriptor = fd;
    }

    public DeviceInputStream(File file) : base(file){}

    public DeviceInputStream(string fileName):base(fileName){}

    public override int Read()
    {
        int byteRead = base.Read();
        currentValue = (byte) byteRead;
        return byteRead;
    }

    public byte CurrentValue
    {
        get { return currentValue; }
    }
}

ただし、これをコンパイルすると、次のエラーが発生します。

報告されていない例外 FileNotFoundException; スーパー(p0)をキャッチまたはスローするように宣言する必要があります。DeviceInputStream.java:20

この問題の原因について何か考えはありますか? ありがとう。

-ショーン

4

1 に答える 1

0

これは Xamarin Monodroid の問題のようで、ExportAttribute をコンストラクターに拡張するバグとして報告されています。詳細はこちらから:

http://forums.xamarin.com/discussion/500/inheriting-from-file入力ストリーム

ビルド時に、DeviceInputStream タイプを含む各 Java.Lang.Object サブクラスに対して Android Callable Wrappers (ACW) が生成されます。

public class DeviceInputStream
extends java.io.FileInputStream
implements
    mono.android.IGCUserPeer
{
static final String __md_methods;
static {
    __md_methods = 
        "n_read:()I:GetReadHandler\n" +
        "";
    mono.android.Runtime.register ("Scratch.ContentProvidersHateApplications.DeviceInputStream, Scratch.ContentProvidersHateApplications, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", DeviceInputStream.class, __md_methods);
}


public DeviceInputStream (java.io.File p0)
{
    super (p0);
    if (getClass () == DeviceInputStream.class)
        mono.android.TypeManager.Activate ("Scratch.ContentProvidersHateApplications.DeviceInputStream, Scratch.ContentProvidersHateApplications, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", "Java.IO.File, Mono.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken=c4c4237547e4b6cd", this, new java.lang.Object[] { p0 });
}


public DeviceInputStream (java.io.FileDescriptor p0)
{
    super (p0);
    if (getClass () == DeviceInputStream.class)
        mono.android.TypeManager.Activate ("Scratch.ContentProvidersHateApplications.DeviceInputStream, Scratch.ContentProvidersHateApplications, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", "Java.IO.FileDescriptor, Mono.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken=c4c4237547e4b6cd", this, new java.lang.Object[] { p0 });
}


public DeviceInputStream (java.lang.String p0)
{
    super (p0);
    if (getClass () == DeviceInputStream.class)
        mono.android.TypeManager.Activate ("Scratch.ContentProvidersHateApplications.DeviceInputStream, Scratch.ContentProvidersHateApplications, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", "System.String, mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e", this, new java.lang.Object[] { p0 });
}


    public int read ()
    {
        return n_read ();
    }

    private native int n_read ();

/* ... */
}

ACW は Java コードであるため、有効な Java コードである必要があります。残念ながら、この状況ではそうではありません。たとえば、DeviceInputStream(String) コンストラクターでの super(p0) 呼び出しは FileInputStream(String) であり、FileNotFoundException をスローするためです。

DeviceInputStream(String) コンストラクターは、例外をスローする可能性のあるメソッドを呼び出すため、DeviceInputStream(String) には throws 句を含めるか、super(p0) ステートメントの周りに try/catch ブロックを含める必要があります。どちらも起こらないため、コンパイラ エラーが発生します。

残念ながら、現時点では回避策はありません。コンストラクター本体の ACW にスローを追加する方法はなく、ACW のコンストラクターをカスタマイズする方法は他にないため、行き詰まっています。:-(

これが機能するように ExportAttribute を拡張するサポートは、バグ 8754で提出されています。

于 2012-12-05T14:27:10.347 に答える