如果父类中的方法"抛出异常",我们可以在重写方法中删除它

时间:2018-05-27 10:07:03

标签: java exception

如果父类中的方法抛出CREATE TABLE [dbo].[houses] ( [Id] INT IDENTITY (1, 1) NOT NULL, [Code] VARCHAR(50) NULL, [Status] VARCHAR(50) NULL, PRIMARY KEY CLUSTERED ([Id] ASC) ); CREATE TABLE [dbo].[customers] ( [Id] INT IDENTITY (1, 1) NOT NULL, [Forename] VARCHAR(50) NULL, [Surname] VARCHAR(50) NULL, [Email] VARCHAR(50) NULL, PRIMARY KEY CLUSTERED ([Id] ASC) ); CREATE TABLE [dbo].[reservations] ( [Id] INT IDENTITY (1, 1) NOT NULL, [HouseId] INT NULL, [CustomerId] INT NULL, [StartDate] DATE NULL, [EindDate] DATE NULL, PRIMARY KEY CLUSTERED ([Id] ASC), CONSTRAINT [FK_HouseId] FOREIGN KEY ([HouseId]) REFERENCES [houses]([Id]), CONSTRAINT [FK_CustomerId] FOREIGN KEY ([CustomerId]) REFERENCES [customers]([Id]) ); ,我们可以在重写方法中删除它吗?

Exception

2 个答案:

答案 0 :(得分:2)

是的,允许:子类可以告诉Java它不会抛出某个异常,而Java会接受它。

这在您确实知道调用点的确切类时非常有用。

考虑以下设置:

class A {
    public void foo() throws Exception {}
}
class B extends A {
    public void foo() {}
}

您可以在无法捕获Exception的上下文中执行此操作:

B b = new B();
b.foo();

Java看到b的类型为B,其方法不会抛出已检查的异常,因此允许调用foo()

但是,这会导致错误:

A a = new B();
a.foo();
  

未报告的例外例外;必须被抓住或宣布被抛出

现在Java必须考虑调用的A.foo()签名。签名包括throws Exception部分,因此Java必须验证已正确处理已检查的异常。

答案 1 :(得分:1)

是。您可以从重写的方法签名中删除但不添加已检查的异常。