我有类似以下情况:
/** Get a list of records */
public ArrayList<Record> foo() throws BazException{
// Create the list
static ArrayList<Record> records = new ArrayList<Record>();
// Use MyLibrary to load a list of records from the file
String str = SomeoneElsesLibrary.loadData(new File("mydata.dat"), new DataLoader(){
// will be called once for each record in the file
String processRecord(Record r){
// if there's no "bar", invalid record
if( ! r.hasField("bar") ){
throw new BazException();
}
records.add(r);
}
});
return records;
}
Run Code Online (Sandbox Code Playgroud)
显然这不起作用,因为SomeoneElsesLibrary不知道是什么BazException.我也不能说processRecord() throws BazException因为那时原型将不再匹配.我开始认为这个实现的整体结构是错误的.(我正在从一小部分Node.JS成瘾中恢复过来,不得不重新学习一些 大多数Java模式.)我如何重构我的代码以使其更加惯用Java?
伪代码很好,甚至只是描述.另外,不要觉得你需要使用一个匿名的内部课程,就像我第一次使用它一样; 我只是在寻找"Java方式"来做到这一点.
Ryan,确保您的BazException是RuntimeException(未经检查的异常)的扩展,而不是Exception(已选中).
否则,正如您可能已经注意到的那样,编译器会抱怨不处理您自己的异常.
有关更多信息,请查看有关未经检查的异常的一些信息(即RuntimeException或Error):
http://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html
异常是指可以抛出它的方法,而不是类(SomeoneElsesLibrary)。
有两种类型的异常:已检查(Exception 的子类型)和未检查(RuntimeException 的子类型)。检查必须在可以抛出它的方法的签名中显式声明。未检查的可以传播,无需在方法的签名中声明,也无需由 try/catch 块处理。
通常,当引发异常的方法的调用者可以补救时,使用检查型,否则使用未检查型。
您可以通过 try/catch ...处理foo() 方法中的未经检查的异常
public ArrayList<Record> foo(){
static ArrayList<Record> records = new ArrayList<Record>();
try{
SomeoneElsesLibrary.loadData( ... );
} catch (BazException be){ // you just handle the exception here
}
return records;
}
Run Code Online (Sandbox Code Playgroud)
... 或不
public ArrayList<Record> foo(){
static ArrayList<Record> records = new ArrayList<Record>();
// if SomeoneElsesLibrary.loadData raise the BazException
// it is propagated to the caller of foo()
SomeoneElsesLibrary.loadData( ... );
return records;
}
Run Code Online (Sandbox Code Playgroud)
相反,必须始终处理已检查的异常。
| 归档时间: |
|
| 查看次数: |
5154 次 |
| 最近记录: |