Tag: control flow

在Java中返回/停止在keypress上执行函数

我的程序中有一定的function,我想在按键时停止。 我为此设置了一个本机键盘钩子。 现在,当检测到该键时,我调用System.exit(0)。 但是,我不想退出程序,只是停止该操作并返回到它所调用的位置。 下面给出一个例子。 public class Main { public static void main(String[] args) { System.out.println(“Calling function that can be stopped with CTRL+C”); foo(); // Should return when CTRL+C is pressed System.out.println(“Function has returned”); } } 我已经尝试将调用foo()放在一个线程中,所以我可以调用Thread.interrupt()但我希望函数调用是阻塞的,而不是非阻塞的。 在foo()还有阻塞IO调用,所以我宁愿不处理中断,除非有必要,因为我必须处理ClosedByInterruptExceptionexception并且之前已经引起了问题。 foo()的主体也很长,里面有很多函数调用,所以写if (stop == true) return; 在函数中不是一个选项。 有没有比制作阻塞线程更好的方法呢? 如果是这样,怎么样? 如果没有,我将如何制作阻止线程?

设计问题:我应该在多大程度上依赖控制流程的例外?

我正在研究一个java Web应用程序,我有一些关于设计的问题。 基本上在其当前版本中,它在很大程度上依赖于捕获exception以确定控制流 。 例如,在我的一个Spring服务类中,我有以下方法来检查数据库中是否存在作为参数提供的电子邮件。 @Override public boolean validateEmailAddressDoesNotExist(String accountEmailAddress) { try { return !dao.checkIfEmailAddressAlreadyExists(accountEmailAddress); } catch (NoResultException re) { log.error(“NoResultException”, re); } catch (RuntimeException re) { log.error(“RuntimeException”, re); } return true; } //from “dao” class public boolean checkIfEmailAddressAlreadyExists(String accountEmailAddress) { return (loadAccountFromAccountEmailAddress(accountEmailAddress) == null ? false : true); } //also from “dao” class public […]

使用Java从具有访问者模式的AST构建控制流图

我正在试图弄清楚如何实现我的LEParserCfgVisitor类,以便从已经用JavaCC生成的Abstract-Syntax-Tree构建控制流图。 我知道有些工具已经存在,但我正在尝试为我的编译器最终做准备。 我知道我需要有一个数据结构,将图形保存在内存中,我希望能够在每个节点中保留IN,OUT,GEN,KILL等属性,以便以后能够进行控制流分析。 我的主要问题是我还没弄清楚如何将不同的块连接在一起,因为根据它们的性质在每个块之间有正确的边缘:分支,循环等。换句话说,我还没有找到一个明确的算法,可以帮助我建立我的访客。 这是我的空访客。 你可以看到它适用于基本的语言表达式,比如if,while和基本操作(+, – ,x,^,…) public class LEParserCfgVisitor implements LEParserVisitor { public Object visit(SimpleNode node, Object data) { return data; } public Object visit(ASTProgram node, Object data) { data = node.childrenAccept(this, data); return data; } public Object visit(ASTBlock node, Object data) { } public Object visit(ASTStmt node, Object data) { } public […]

如何避免使用exception进行流量控制?

我被分配了一个项目来开发一组类,这些类充当存储系统的接口。 要求是该类支持具有以下签名的get方法: public CustomObject get(String key, Date ifModifiedSince) 基本上,当且仅当在ifModifiedSince之后修改了对象时,该方法才会返回与key关联的CustomObject 。 如果存储系统不包含key则该方法应返回null。 我的问题是: 如何处理密钥存在但未修改对象的方案? 这很重要,因为使用此类的一些应用程序将是Web服务和Web应用程序。 这些应用程序需要知道是返回404(未找到),304(未修改)还是200(OK,这是数据)。 我正在权衡的解决方案是: 当存储系统不包含key时,抛出自定义exception ifModifiedSince失败时抛出自定义exception。 将状态属性添加到CustomObject。 要求来电者检查财产。 我对这三个选项中的任何一个都不满意。 我不喜欢选项1和2,因为我不喜欢使用流控制的exception。 当我的目的是表明没有价值时,我也不喜欢返回一个值 。 尽管如此,我倾向于选择3。 有没有我不考虑的选择? 有没有人对这三种选择中的任何一种都有强烈的感受? 这个问题的答案,转述: 提供一个contains方法并要求调用者在调用get(key, ifModifiedSince)之前调用它,如果key不存在则抛出exception,如果没有修改object则返回null。 将响应和数据(如果有)包装在复合对象中。 使用预定义常量表示某个状态( UNMODIFIED, KEY_DOES_NOT_EXIST )。 调用者实现了用作回调的接口。 设计很糟糕。 为什么我不能选择答案#1 我同意这是理想的解决方案,但我已经(不情愿地)被解雇了。 这种方法的问题在于,在大多数使用这些类的情况下,后端存储系统将是第三方远程系统,如Amazon S3。 这意味着contains方法需要往返存储系统,在大多数情况下会进行另一次往返。 因为这会花费时间和金钱 ,所以不是一种选择。 如果不是因为这个限制,这将是最好的方法。 (我意识到我没有在这个问题中提到这个重要元素,但我试图保持简短。显然它是相关的。) 结论: 在阅读完所有答案后,我得出的结论是,在这种情况下,包装器是最好的方法。 基本上我会模仿HTTP,包括响应代码和内容正文(消息)的元数据(标题)。