为什么我不能在applet的process方法中抛出异常?

时间:2015-03-18 12:07:40

标签: javacard

下面你看到一个程序在SELECT APDU命令之后接收任何命令时抛出异常:

public class MyApp extends Applet  {


    private MyApp() {
    }

    public static void install(byte bArray[], short bOffset, byte bLength)
            throws ISOException {
        new MyApp().register();
    }

    public void process(APDU arg0) throws ISOException {
        if (selectingApplet()){
            return;
        }
        ISOException.throwIt((short) 0x0002);

    }

}

问题是:为什么传输任何APDU命令(SELECT APDU命令除外)都会失败?

OSC: opensc-tool -s 00a404000b0102030405060708090002 -s 0000000
Using reader with a card: ACS CCID USB Reader 0

Sending: 00 A4 04 00 0B 01 02 03 04 05 06 07 08 09 00 02
Received (SW1=0x90, SW2=0x00)

Sending: 00 00 00 00
APDU transmit failed: Transmit failed

是否仅限于在流程方法体中使用异常?

2 个答案:

答案 0 :(得分:3)

不,但您的问题可能与使用的状态字有关。您应该遵守ISO 7816-4定义的状态字。尝试6xxx范围内的一些。对于T = 0和T = 1,您可能会有不同的响应。

答案 1 :(得分:1)

异常状态字必须符合7816规范。例如ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);

也许你的程序需要写:

public void process(APDU apdu)     {

    if (selectingApplet())
    {
        return;
    }

    byte[] buf = apdu.getBuffer();
    switch (buf[ISO7816.OFFSET_INS])
    {
    case (byte)0x00:
        //......
        break;
    default:
        ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
    }
}