当前位置: 首页 > 知识库问答 >
问题:

使用从不在方法主体中引发的throws子句声明检查异常

郑景胜
2023-03-14
try
{
}
catch(IOException e)
{
}
void test() throws IOException
{
}

请解释一下背后的原因。蒂娅。

共有1个答案

颛孙英勋
2023-03-14

如果catch子句可以捕获已检查异常类E1,并且与catch子句相对应的try块不能抛出E1的子类或超类已检查异常类,则这是编译时错误,除非E1是异常或异常的超类。

这告诉你所有这些都是有效的:

try { }
catch(Exception e){}

--

try{ }
catch(NullPointerException  e) {}
try{ }
catch(ArrayIndexOutOfBoundsException  e) {}
try{ }
catch(RuntimeException e) {}
try{ }
catch(Error e) {}
try{ }
catch(Throwable e){ }

throws的区别在于:在此上下文中不存在不可达代码的概念。方法抛出异常的可能性并不以该方法的缺陷而结束。例如:

abstract void readFile(String path) throws IOException;

这个方法甚至没有块,因为它是一个抽象方法。很容易猜测这一行不会抛出任何IOException。但它为将实现它的扩展定义了一种行为。为了重写它,您的方法必须抛出IOException

同样,如果有人重写了您的测试方法:

@Override
void test() throws IOException
{
   readFile(file);
}
 类似资料:
  • 问题内容: 我有以下情况。 我有一个从另一个基类继承并重写一个方法的Java类。基本方法不会引发异常,因此没有声明。 现在我自己的方法应该能够引发异常,但是我要么有选择 吞下异常 添加抛出声明 两者都不令人满意,因为第一个会默默地忽略异常(好的,我可以执行一些日志记录),第二个会因为方法头不同而产生编译器错误。 问题答案: 如果确实需要,可以抛出未经检查的异常而不必声明它们。未检查的异常扩展。扩展

  • 正如您所看到的,我正在方法和构造函数的子句中声明。但我不会在身体的任何地方抛出这个例外。因此,它应该是一个编译时错误,就像我们试图捕获不是从try块抛出的异常一样。但在这种情况下,它编译得很好。有人能解释一下这种行为背后的原因吗?

  • 问题内容: 我从来没有使用过“ throws”子句,今天有一位队友告诉我,我必须在方法声明中指定方法可能抛出的异常。但是,我一直在使用没有问题的异常而没有这样做,因此,如果实际上需要它,为什么还要使用它呢? 问题答案: Java有两种不同类型的异常: 选中的 异常和 未选中的 异常。 未检查的异常是的子类,您无需添加throws声明。所有其他异常都必须在方法体内使用try / catch语句或th

  • 更准确地说,假设是一个类或接口,是的超类或超接口,中的方法声明重写或隐藏中的方法声明。然后: > 如果有一个throws子句提到任何检查的异常类型,那么必须有一个throws子句,否则将发生编译时错误。 对于的throws子句中列出的每个检查异常类型,相同的异常类或其一个超类型必须出现在的throws子句的擦除(§4.6)中;否则,将发生编译时错误。 如果的未擦除的throws子句不包含的thro

  • 问题内容: 我在Java中进行异常处理时遇到问题,这是我的代码。尝试运行以下行时出现编译器错误:。错误是: 永远不会在相应的try语句的主体中引发MojException异常 这是代码: 这是MojException的代码: 谁能帮我这个? 问题答案: try语句中的catch块需要 精确 捕获-block 内的代码 可能 抛出的异常(或该异常的超类)。 您想做的是这样的: 这将导致编译器错误,因

  • 我正在尝试获得PSQLException异常,但是它告诉我这个块无法到达,有人知道为什么吗?我的意思是,我不能运行或任何东西,Eclipse标记为一个错误。但是,例如,如果我放置异常e,而不是PSQLException e,它不会给出错误。