首页 \ 问答 \ 处理Java中重写接口中的异常(Dealing with Exception in Overridden Interface in Java)

处理Java中重写接口中的异常(Dealing with Exception in Overridden Interface in Java)

我有一个我正在实现的Java接口(来自JGraphT的EdgeProvider),并且不允许为null 。 但是,我在重写方法中实例化泛型类型,并且无法弄清楚如何以一种我可以检测并干净地突破执行流的方式处理InstantiationExceptionIllegalAccessException

EdgeProvider<V, E> ep = new EdgeProvider<V, E>() {
      @Override
      public E buildEdge(V from, V to, String label, Map<String, String> attributes) {
        try {
          return eClass.newInstance();
        } catch (InstantiationException | IllegalAccessException e) {
          return null;
        }
      }
    };

如果我重新抛出,我只是得到一个警告,我有未处理的异常。 有什么建议么?


I have a Java interface that I am implementing (EdgeProvider from JGraphT) and which is not allowed to be null. However, I'm instantiating a generic type in an overridden method and can't figure out how to deal with either InstantiationException or IllegalAccessException in a way that I can detect and cleanly break out of the execution flow.

EdgeProvider<V, E> ep = new EdgeProvider<V, E>() {
      @Override
      public E buildEdge(V from, V to, String label, Map<String, String> attributes) {
        try {
          return eClass.newInstance();
        } catch (InstantiationException | IllegalAccessException e) {
          return null;
        }
      }
    };

If I rethrow I just get a warning that I have unhandled exceptions. Any suggestions?


原文:https://stackoverflow.com/questions/44988659
更新时间:2019-12-07 12:40

最满意答案

有一种方法可以使用构造函数引用实例化一个没有异常的类。 例如:

Supplier<SomeType> eCons = SomeType::new;

Supplier用于默认构造函数,但您可以使用与要引用的构造函数的签名匹配的任何功能接口类型(例如,此处列出的其中一个: 链接 )(例如,带参数的构造函数)。

对于Supplier ,您可以调用get()来创建新实例:

EdgeProvider<V, E> ep = new EdgeProvider<V, E>() {
    @Override
    public E buildEdge(V from, V to, String label, Map<String, String> attributes) {
        return eCons.get();
    }
};

There is a way to instantiate a class without exceptions, using a constructor reference. For instance:

Supplier<SomeType> eCons = SomeType::new;

Supplier is used for a default constructor, but you can use any functional interface type (for instance one of the ones listed here: Link) that matches the signature of the constructor you want to reference (for instance one that takes arguments).

In the case of Supplier, you can call get(), to create a new instance:

EdgeProvider<V, E> ep = new EdgeProvider<V, E>() {
    @Override
    public E buildEdge(V from, V to, String label, Map<String, String> attributes) {
        return eCons.get();
    }
};
2017-07-08

相关问答

更多

audio onError参数(audio onError arguments)

我可能发现了错误消息对象。 错误代码位于sound.error.code或e.currentTarget.error.code属性中,它可以包含以下4位数之一: MEDIA_ERR_ABORTED=1 MEDIA_ERR_NETWORK=2 MEDIA_ERR_DECODE=3 MEDIA_ERR_SRC_NOT_SUPPORTED=4 检查了它@jsfiddle I probably found that error message object. The error code is in

如何解决此错误:传递给Zend_Mail_Message :: __ construct()的参数1必须是类型数组,没有给出(How to resolve this error: Argument 1 passed to Zend_Mail_Message::__construct() must be of the type array, none given)

根据Zend文档, Zend_Mail_Message接受一个参数作为参数。 您没有传递任何参数。 这就是你得到这个错误的原因。 __construct(array $ params) 除了Zend_Mail_Part :: __ construct()的参数之外,这个构造函数还支持: 具有原始消息内容的文件的文件名或文件句柄 带有消息标志的flags数组,忽略键,使用Zend_Mail_Storage中定义的常量Inherited_from \ Zend_Mail_Part :: __ con

将提示弹出窗口定位在javascript中(positioning the prompt popup in javascript)

根据您使用的浏览器, prompt (和alert )弹出窗口的实现方式不同。 这是因为弹出窗口是浏览器功能,它们不是JavaScript对象或类似的东西。 (就像每个浏览器的控制台不同,它取决于实现。) 如果你真的想要一致地定位/设置你的提示,你将不得不建立自己的提示。 最简单的方法是使用像jQueryUI这样的库。 另一方面,您可以自己构建它: <html> <body> <input id="showPromptButton" type="button" value

java防止大量if,并用设计模式替换它(s)(java prevent a lot of if and replace it with design pattern(s))

你至少可以做的是声明处理依赖于ApplicationCategories enum的行为的方法。 通过这种方式,如果您要向枚举中添加新值,则只会将代码相对于枚举更改。 通过这种方式,您的代码遵守Open Closed原则,因此更容易维护。 enum ApplicationCategories { PROJECTS, CALENDAR, // And so on... WORKINGBOOK; public static void handle(Appli

如何通过镀铬弧焊机部署Android应用程序的数据库?(How do I view the database of an android app when deployed through chrome arc welder?)

编辑:是的,据我所知(刚刚测试过),您只能在VM或真实设备上运行时调试/监控(使用DDMS)您的应用程序。 那么什么有效(没有DDMS): 打开JavaScript控制台(chrome:// inspect / #apps) Chrome中的plugin.shell('adbd') 终端中的adb pull /data/data/your.package.name/databases/name.db 旧答案(使用DDMS): 如果仅获取数据快照就足够了,您可以使用DDMS。 您可以直接从控制台运

如何在TYPO3 7.6中启用header_position(How to enable header_position in TYPO3 7.6)

你必须建立一个可以重新启用领域的快速扩展。 您需要创建如下文件夹和文件: your_ext / Configuration / TCA / Overrides / tt_content.php该文件的内容是: use TYPO3\CMS\Core\Utility\ExtensionManagementUtility; ExtensionManagementUtility::addTCAcolumns('tt_content',[ 'header_position' => [

防止列宽调整大小(Prevent column width resizing)

防止调整列的大小 从这里 ,我们可以知道setResizable(boolean)允许您选择用户是否可以调整列的大小。 将max和min width设置为相同的值会阻止用户调整列的大小,但不会阻止用户调整列的大小。 此外,用户在尝试调整列大小时将看到调整大小光标但不会看到默认光标。 防止重新排序列 JavaFX 9 为了防止用户重新排序列,在JavaFX 9之前没有直接的解决方案,它引入了setReorderable(boolean) , isReorderable() , reorderabl

添加'www。'(Add 'www.' to URL with htaccess)

尝试放: ErrorDocument 401 "Unauthorized Access" RewriteEngine off ... Authorisation lines 在包含授权指令的.htaccess文件中。 Try putting: ErrorDocument 401 "Unauthorized Access" RewriteEngine off ... Authorisation lines In the .htaccess file containing your auth

相关文章

更多

最新问答

更多
  • asp.net任意用户信息(asp.net arbitrary user info)
  • 如何使用python计算docx文件中表中行的值(How to count the row's values in tables in docx file by using python)
  • MySQL:用户访问和数据库覆盖(MySQL: User access and DB overwriting)
  • 还有另一种“使用未分配的局部变量”的问题(Yet Another “Use of unassigned local variable 'whatever' ” question)
  • 开源证书颁发机构软件(Open source certificate authority software)
  • Rails中的迭代form_for是在create上添加模型的所有实例(Iteration in Rails form_for is adding all instances of model on create)
  • 如何扩展我的表视图单元格?(How to expand my table view cell?)
  • 如何使用SPARQL区分Thing和无生命对象(How to differentiate between a Thing and an inanimate object with SPARQL)
  • 在IdentityServer中,Client Secrets和Scope Secrets有什么区别?(In IdentityServer, what is the difference between Client Secrets and Scope Secrets?)
  • 如何在具有附加类时重写类(How do I override a class when it has a attached class)
  • 如何使用Git在Azure上部署C#,MVC4应用程序(How to deploy a C#, MVC4 application on Azure using Git)
  • Sitecore 7内容搜索爬网程序根目录之外的索引项(Sitecore 7 Content Search indexing items outside of crawler root)
  • 我应该在线课程使用utf-8编码吗?(Should I use utf-8 encoding for an online course?)
  • 如何在Cucumber-JS步骤定义中使用Node-mysql连接到MySQL?(How to connect to MySQL using Node-mysql in a Cucumber-JS step definition?)
  • 在MVC 4中的google.maps.LatLng(lat,lon)中将JSON字符串值分配给纬度和经度(Assign the JSON string value to Latitude and Longitude in google.maps.LatLng(lat,lon) in MVC 4)
  • awk:通过特定的分隔符删除字符串(awk: remove strings by specific delimiter)
  • 如何测试Vista的应用程序(How to test app for Vista)
  • Elasticsearch聚合器 - 缺失值的工作原理(Elasticsearch aggregators - How missing values work)
  • 绘制datetime.date熊猫(Plot datetime.date pandas)
  • PostgreSQL作为WSO2 EI和APIM + IS的数据源(PostgreSQL as datasource for WSO2 EI and APIM+IS)
  • 如何使用bash在postgres中运行alter table脚本(How to run alter table script in postgres using bash)
  • 可能使用PHP阻止整个美国州访问我的网站?(Might it be possible to block an entire US state from accessing my site, using PHP?)
  • restangular删除并输入错误网:: ERR_NAME_NOT_RESOLVED(restangular remove and put error net::ERR_NAME_NOT_RESOLVED)
  • 常见问题解答的Modx(Revolution)搜索功能(Modx(Revolution) search function for FAQs)
  • Rubymine如何使用远程口译员和Git?(How Does Rubymine Work With Remote Interpreters and Git?)
  • prepareForSegue和PerformSegueWithIdentifier发件人(prepareForSegue and PerformSegueWithIdentifier sender)
  • postgrsql与PowerShell无提示安装问题(postgresql silent installation issue with powershell)
  • 比较两个greps的输出(Comparing output from two greps)
  • 使用.NET RIA Data Services删除Silverlight 3中的数据(Deleting data in Silverlight 3 with .NET RIA Data Services)
  • 此行中AND运算符的含义(meaning of the AND operator in this line)