我将 java.sql.RecordSet 包装在 java.util.Iterator 中。我的问题是,如果任何记录集方法抛出 SQLException,我应该怎么办?
java.util.Iterator javadoc解释在各种情况下抛出哪些异常(即 NoSuchElementException,以防您在最后一个元素之后调用 next())
但是,它没有提到当出现完全不相关的问题时该怎么做,例如网络或磁盘 IO 问题。
简单地在 next() 和 hasNext() 中抛出 SQLException 是不可能的,因为它与 Iterator 接口(interface)不兼容。
这是我当前的代码(已简化):
public class MyRecordIterator implements Iterator<Record>
{
private final ResultSet rs;
public MyRecordIterator() throws SQLException
{
rs = getConnection().createStatement().executeQuery(
"SELECT * FROM table");
}
@Override
public boolean hasNext()
{
try
{
return !rs.isAfterLast();
}
catch (SQLException e)
{
// ignore, hasNext() can't throw SQLException
}
}
@Override
public Record next()
{
try
{
if (rs.isAfterLast()) throw new NoSuchElementException();
rs.next();
Record result = new Record (rs.getString("column 1"), rs.getString("column 2")));
return result;
}
catch (SQLException e)
{
// ignore, next() can't throw SQLException
}
}
@Override
public void remove()
{
throw new UnsupportedOperationException("Iterator is read-only");
}
}
最佳答案
我会将已检查的异常包装在未检查的异常中,允许在不破坏 Iterator 的情况下抛出它。
我建议应用程序特定的异常扩展 RuntimeException,实现构造函数(String,Throwable),以便您可以保留对原因的访问。
例如。
@Override
public boolean hasNext() {
try {
return !rs.isAfterLast();
} catch (SQLException e) {
throw new MyApplicationException("There was an error", e);
}
}
更新:要开始查找更多信息,请尝试使用谷歌搜索“checked unchecked java sqlexception”。在 'Best Practises for Exception Handling' on onjava.com 上对已检查异常处理与未检查异常处理进行了相当详细的讨论。和关于 IBM Developerworks 的一些不同方法的讨论.
关于java - Iterator 实现应该如何处理已检查的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2346978/
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我在理解Enumerator.new方法的工作原理时遇到了一些困难。假设文档中的示例:fib=Enumerator.newdo|y|a=b=1loopdoy[1,1,2,3,5,8,13,21,34,55]循环中断条件在哪里,它如何知道循环应该迭代多少次(因为它没有任何明确的中断条件并且看起来像无限循环)? 最佳答案 Enumerator使用Fibers在内部。您的示例等效于:require'fiber'fiber=Fiber.newdoa=b=1loopdoFiber.yieldaa,b=b,a+bendend10.times.m
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
我正在学习Rails,并阅读了关于乐观锁的内容。我已将类型为integer的lock_version列添加到我的articles表中。但现在每当我第一次尝试更新记录时,我都会收到StaleObjectError异常。这是我的迁移:classAddLockVersionToArticle当我尝试通过Rails控制台更新文章时:article=Article.first=>#我这样做:article.title="newtitle"article.save我明白了:(0.3ms)begintransaction(0.3ms)UPDATE"articles"SET"title"='dwdwd
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查
我的日期格式如下:"%d-%m-%Y"(例如,今天的日期为07-09-2015),我想看看是不是在过去的七天内。谁能推荐一种方法? 最佳答案 你可以这样做:require"date"Date.today-7 关于ruby-检查日期是否在过去7天内,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/32438063/