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

Java接口抛出异常,但接口实现不抛出异常?

陈知
2023-03-14

我读过这段代码,其中接口抛出异常,但实现它的类没有抛出异常或捕获异常,这是为什么?它在java中是合法的还是安全的?

import java.rmi.*;
public interface MyRemote extends Remote {
    public String sayHello() throws RemoteException;
}

import java.rmi.*;
import java.rmi.server.*;
public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote{
    public String sayHello() {
        return "Server says, 'Hey'";
    }
    public MyRemoteImpl() throws RemoteException {}
    public static void main (String[] args) {
        try {
             MyRemote service = new MyRemoteImpl();
             Naming.rebind("RemoteHello", service);
        } catch(Exception ex)
        {
            ex.printStackTrace();
        }
    }
}

共有3个答案

令狐翰
2023-03-14

谢特·哈明的回答很好。

一种看待这个问题的方法,我发现它很容易记住,就是接口的实现可以更具体,但不能更通用。

例如,在接口无效测试()抛出异常意味着测试可能抛出异常

然后实现可以是void test()表示“测试不会引发异常”(更具体)

或者实现可以是void test()抛出NullpointerException(更具体)

interface x {
    void testException() throws Exception;
}

public class ExceptionTest implements x {
    @Override
    public void testException() {   //this is fine
    }

    ////// or

    @Override
    public void testException() throws NullPointerException {  // this is fine
    }
}
慕容昊焜
2023-03-14

如果Java方法重写父类中的另一个方法,或者实现接口中定义的方法,它可能不会抛出额外的检查异常,但可能抛出更少的异常。

public class A {
    public void thrower() throws SQLException {...}
}

public class B extends A {
    @Override
    public void thrower() throws SQLException, RuntimeException, NamingException {...}
}

SQLException可以;它在重写的方法中声明。它甚至可以被一个子类替换,比如SerialException

可以在任何地方使用。

NamingException是非法的。它不是运行时异常,也不在的列表中,甚至作为子类型。

解柏
2023-03-14

实现和扩展的一般规则是,您可以使您的新类或接口“限制更少”,但不能“限制更多”。如果将处理异常的要求视为限制,则不声明异常的实现限制较少。任何编写接口代码的人都不会在你的类上遇到麻烦。

-斯坦·詹姆斯

作为会议讨论的一部分http://www.coderanch.com/t/399874/java/java/Methods-throwing-Exception-Interface

 类似资料:
  • 我正在尝试为一个简单的web应用程序创建一个存储库。似乎导入和使用导入组织。springframework。数据存储库。积垢会导致错误。我不确定如何开始调试收到的错误消息。 这是我的实体 这是我的存储库 这是我的控制器 还有我的pom.xml

  • 抛出异常的行为是否可能抛出不同的异常? 为了抛出异常,必须(可选地)分配新对象,并调用其构造函数(隐式调用fillinstacktrace)。在某些情况下,听起来像addSupressed也被称为。那么如果没有足够的内存会发生什么呢?JVM是否需要预分配内置异常?例如,(1/0)会抛出OutOfMemoryError而不是ArithmeticException吗? 此外,构造函数是一个方法调用,因

  • 最近我遇到了这段代码。 后来,它变成了这个项目的一般惯例。这是否被认为是一种良好的做法?

  • 问题内容: 我目前正在使用play2框架。 我有几个正在抛出的类,但是play2s全局处理程序使用throwable而不是异常。 例如我的一门课是抛出一个。我是否可以检查可抛物体(如果是)? 问题答案: 您可以使用它来检查它是否存在。 例: 假设是参考。

  • 问题内容: 我在接口抛出异常的地方读了这段代码,但是实现它的类却没有抛出异常或捕获异常,这是为什么呢?在Java中合法或安全吗? 问题答案: 实现和扩展的一般规则是,您可以使新类或接口的限制较少,而不能限制较多。如果您认为将异常作为限制进行处理的要求,则未声明异常的实现的限制性较小。对该接口进行编码的任何人都不会遇到您的课的麻烦。 -斯坦·詹姆斯 作为http://www.coderanch.co

  • 问题内容: 除了抛出,这意味着我方法的所有调用者都需要捕获Exception(可以包含RuntimeExceptions),我想在出现问题时抛出一种更特定类型的异常。 我可以创建自己的扩展了Exception或其他异常类型的异常类型,但是我很好奇是否可以重用Java语言所附带的一些异常,例如: IllegalArgumentException UnsupportedOperationExcepti