问题描述
说我们有很多方法要使用System.out.println(...)
打印fx
然后我们可以创建一个类似
public void print(String msg) {
System.out.println(...)
}
然后我们可以做:print("Some message")
,它更快,节省了我们每次写System.out.println(...)
的时间。
现在来看情况。我正在使用Java I / O进行练习,它需要大量try/catch
。因此,不必每次都写一个try/catch
块,我可以做类似的事情
public sometype tryCatch (String objThatCanThrowExc) {
clause = "try {
" + objThatCanThrowExc + "
} catch(Exception e) {
print(e);
} "
return clause;
}
然后执行类似的操作
public void server(int port) {
ServerSocket ss = null;
//Assume ss is not null,and client is a Socket
tryCatch("client = ss.accept();");
...
}
使用上面的代码,我只是想表达我想做的事情。我不确定是否有什么聪明的方法可以帮助我实现这一目标。另一种可能更好的方法是,如果我可以做这样的事情
public void server(int port) {
ServerSocket ss = null;
tryCatch() {
client = ss.accept();
}
...
}
我没有太多的编程经验,所以我知道这是一个愚蠢的问题,但是谁知道呢,也许有些聪明
解决方法
您要寻找的概念称为 Try type 。它类似于java.util.Optional
,可以是“存在”或“空”。尝试可以是“成功”或“失败”。它不是Java内置的,但是Vavr库是一种常用的实现。
如果我正确理解,您想要做的是调用可能抛出的多个IO函数,但无需为每个函数编写相同的“捕获”逻辑。
您说对了,您想要做的就是以某种方式“传递”可能会扔到另一个为您处理捕获方法的代码中。在Java中,此机制不是字符串,而是 lambda 函数。
我们可以这样使用它们:
import java.io.*;
class Main {
@FunctionalInterface
public interface Action {
void run() throws Exception;
}
private static void printExceptionAndContinue(final Action action) {
try {
action.run();
} catch(Exception error) {
System.out.println(error.toString());
}
}
public static void main(String[] args) {
printExceptionAndContinue(() -> {
// Here goes some code that might throw!
throw new Exception("Oh no!");
});
printExceptionAndContinue(() -> {
// And some more
System.out.println("Still gets called!");
});
}
}
对于那些说不能使用强类型的编译语言键入和解释代码“字符串”的人,我鼓励他们研究F# quotations。
,在您的示例中,您使用的“子句”是一个字符串,因此,除非您尝试将其解析为代码(这很复杂),否则它将无法正常工作。
相反,最好在try部分和catch部分使用不同的return语句。如果出现错误提示您什么都不返回,请尝试在try / catch语句后放置一个虚拟return语句,该语句返回null或零或空字符串。
,如果try-catch需要对对象执行某些特定操作,则为是。我们可以。
说。我们有一个界面
公共接口-oneOperation
public interface oneOperation{
public void execute() throws Exception;
default void invoke(){
try {
this.execute();
} catch (Exception e) {
e.printStackTrace();
}
}
}
现在接口的impls仅实现execute()方法。
使用impls的其他对象可以调用invoke()方法,以防它们不引发异常
不确定这是否是您想要的..