当我必须使用" throws"声明方法中的单词?

时间:2015-02-10 12:00:54

标签: java javacard

我知道这很简单,但作为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>

5 个答案:

答案 0 :(得分:3)

您必须仅声明已检查的例外。您可以声明未经检查的异常,以表明它们可能会被抛出。

例如parseInt(String s)声明它会抛出NumberFormatException,即使它未被选中,因为它很可能会这样做(传递它不是数字是一种常见的情况)。

从文档(强调我的):

  

运行时异常可以发生在程序的任何地方,而在典型的程序中,它们可能非常多。必须在每个方法声明中添加运行时异常会降低程序的清晰度。因此,编译器不要求您捕获或指定运行时异常(尽管您可以)。

例外Heirarchy

The Exception Heirarchy

检查或取消选中异常取决于它扩展/实现的内容。

所有意外事件的根源是Throwable接口。 ThrowableErrorException有两种类型。

Error用于致命的JVM事件,例如ThreadDeath。您很少想要处理这些事件,因此它们会被分开。

Exception是所有异常的根类型,已选中且未选中。将检查扩展Exception而非RuntimeException的例外情况。

RuntimeException扩展Exception并允许其取消选中。

ISOException未经检查,因此会延伸RuntimeException(或者它的父/祖父母/等等)。在这种情况下,它会扩展CardRuntimeException,扩展RuntimeExceptionbased 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。