我知道这很简单,但作为java的新手,我有问题!
这是一个简单的Java Card小程序,在收到任何命令后返回SW = 0xEE 0xFF
:
package secondStep;
import javacard.framework.*;
public class BadRepeater extends Applet
{
public static void install(byte bArray[], short bOffset, byte bLength) throws ISOException
{
new BadRepeater().register();
}
public void process(APDU arg0) throws ISOException
{
ISOException.throwIt((short)0xeeff);
}
}
我从throws ISOException
方法声明行的末尾删除了process
:
package secondStep;
import javacard.framework.*;
public class BadRepeater extends Applet
{
public static void install(byte bArray[], short bOffset, byte bLength) throws ISOException
{
new BadRepeater().register();
}
public void process(APDU arg0)
{
ISOException.throwIt((short)0xeeff);
}
}
上述两个程序都运行良好。
问题是“有什么区别?”
当我必须在行末使用throws ...
时,何时不使用?{/ p>
答案 0 :(得分:3)
您必须仅声明已检查的例外。您可以声明未经检查的异常,以表明它们可能会被抛出。
例如parseInt(String s)
声明它会抛出NumberFormatException
,即使它未被选中,因为它很可能会这样做(传递它不是数字是一种常见的情况)。
从文档(强调我的):
运行时异常可以发生在程序的任何地方,而在典型的程序中,它们可能非常多。必须在每个方法声明中添加运行时异常会降低程序的清晰度。因此,编译器不要求您捕获或指定运行时异常(尽管您可以)。
检查或取消选中异常取决于它扩展/实现的内容。
所有意外事件的根源是Throwable
接口。 Throwable
,Error
和Exception
有两种类型。
Error
用于致命的JVM事件,例如ThreadDeath
。您很少想要处理这些事件,因此它们会被分开。
Exception
是所有异常的根类型,已选中且未选中。将检查扩展Exception
而非RuntimeException
的例外情况。
RuntimeException
扩展Exception
并允许其取消选中。
ISOException
未经检查,因此会延伸RuntimeException
(或者它的父/祖父母/等等)。在这种情况下,它会扩展CardRuntimeException
,扩展RuntimeException
(based on the Javadoc I found)
答案 1 :(得分:2)
如果以下两个条件均为真,则必须使用throw
:
RuntimeException
,throw
该异常的代码路径,或者在throws
声明中调用具有此异常的方法。 ISOException
不符合第一个标准,因为它来自RuntimeException
。因此,它的声明是可选的。
请注意,添加throws
是一个重大变化,因为调用您的方法的代码需要捕获您的异常。这就是为什么您可以添加throws
来实现您从未实际throw
的异常,以便稍后可以为其添加throw
。
答案 2 :(得分:1)
ISOException是RuntimeException的子类,因此它不是一个经过检查的异常,因此不需要throws子句。
答案 3 :(得分:1)
如果它抛出的异常是一个经过检查的异常,你只需要在方法中包含一个“throws”子句。如果方法抛出运行时异常,则是可选的。在这种情况下,作为ISOException is a runtime exception,两个程序都可以正常工作。
问候
答案 4 :(得分:0)
普遍的共识似乎是,当你期望抛出它时,你应该在方法的JavaDoc中记录一个异常。对于RuntimeException
来说,情况确实如此。您可以使用@throws
来记录它们。
在JavaCard中,许多例外也需要reason
(简短)。在这些情况下,您应该清楚地指出可以生成哪些原因代码(使用列表,HTML中带有标记<ul>
或<ol>
,每个项目带有<li>
。对于ISOException
个实例,原因代码将被转换为ISO 7816状态字(如果未捕获异常,则在process
方法的末尾)。在状态字的情况下,您甚至可能希望指定可以出现状态字的 order 。
运行时异常通常不是方法签名的一部分,因此 - 再次通过一般共识 - 您应该不在方法签名中使用throws
声明它们。当前的已检查异常将放入方法签名中。
基本上所有JavaCard异常(UserException
除外)都是运行时异常,因此可以安全地忽略有关已检查异常的部分。有关如何描述异常的一个很好的示例,请查看Java Card API。