Java:是否可以缩短 try/catch?
Java: Is it possible to make try/catch shorter?
例如:
try {
Thread.sleep(333);
} catch (InterruptedException e) {
e.printStackTrace();
}
我能否以某种方式使用上面的 try/catch,使用像 trySleep(Thread.sleep(333));
这样的创建方法,它与原始尝试完全相同?
使用示例:
public class Test implements Runnable {
public Test() {
Thread thisThread = new Thread(this);
thisThread.start();
}
@Override
public void run() {
while (true){
System.out.println("Testing");
trySleep(Thread.sleep(333));
}
}
public void trySleep(/*Thread object*/){
//Code for try/catch
}
public static void main(String[] args) {
new Test();
}
}
当然上面的代码不会通过,只是为了提问。
我想要这种东西的原因是因为我发现 try/catch 东西太乱了,读起来很烦人。
我不明白这个问题。如果将这三行添加到 trySleep-method 主体中,您将获得一个方法,该方法将使线程休眠。
所以答案是肯定的。
顺便说一句:
你写了一个无尽的睡眠循环
您可以将 Thread.sleep
包装在一个函数中,该函数将任何异常作为运行时异常(或任何未捕获的异常)重新抛出。
public static void trySleep(long millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
throw new RuntimeException("Interrupted during sleep", e);
}
}
是的,你可以这样做,但不是你现在描述的那样。无论您在哪里使用 Thread.sleep()
,您都必须捕获 InterruptedException
,因此您必须将调用包含在这样的方法中:
public void trySleep(long ms) {
try {
Thread.sleep(ms);
} catch (InterruptedException e) {
e.printStackTrace(); //handle exception here
}
}
您可以这样调用此方法:trySleep(333)
有时只向您的方法添加一个 throws 声明或重新抛出一个更有意义的异常会更好,除非您知道这是捕获异常最有意义的位置。
您可以按照您的建议用另一种方法包装休眠代码。
public static void trySleep(Thread target, long millis){
try{
target.sleep(millis);
} catch(InterruptedException e) {
System.err.println("Exception Occurred while trying to sleep!");
}
}
事实上,您可能应该这样做,因为将代码模块化是正确的方法。
我认为您真正需要考虑的一件重要事情(除了如何正确执行此操作的答案之外)是了解您正在调用的代码。
在您的代码中:
@Override
public void run() {
while (true){
System.out.println("Testing");
trySleep(Thread.sleep(333));
}
}
特别是这一行:
trySleep(Thread.sleep(333));
你基本上是在说
调用方法Thread.sleep(),值为333。
任何值 Thread.sleep() returns,将其传递给另一个方法。
但是the Javadocs说这是一个无效的方法。
也在您的代码中:
public void trySleep(/*Thread object*/){
//Code for try/catch
}
您应该检查 this Whosebug post 为什么这不是好的做法(因为您将尝试在实例对象上调用静态方法)。
其他人已经回答了你关于这个的问题,但我强烈建议复习这些领域,因为这表明你可能缺少一些重要概念的关键知识。
您可以使用 java 8 的 lambda 表达式来做类似的事情:
@FunctionalInterface
interface InterruptedExceptionRunnable {
void run() throws InterruptedException;
}
void trySleep(InterruptedExceptionRunnable exRunnable) {
try {
exRunnable.run();
} catch(InterruptedException ex) {
ex.printStackTrace();
}
}
允许你这样写:
trySleep(()->Thread.sleep(333));
是的,你基本上可以用 Java 8 个 lambda 表达式来做到这一点。
class Example {
@FunctionalInterface
interface InterruptableRunnable {
void run() throws InterruptedException;
}
static void tryRun(InterruptableRunnable r) {
try {
r.run();
} catch(InterruptedException ie) {
ie.printStackTrace();
}
}
public static void main(String[] args) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
// passing a lambda
tryRun( () -> Thread.sleep(333) );
}
});
t.start();
// passing a method reference
tryRun(t::join);
}
}
例如:
try {
Thread.sleep(333);
} catch (InterruptedException e) {
e.printStackTrace();
}
我能否以某种方式使用上面的 try/catch,使用像 trySleep(Thread.sleep(333));
这样的创建方法,它与原始尝试完全相同?
使用示例:
public class Test implements Runnable {
public Test() {
Thread thisThread = new Thread(this);
thisThread.start();
}
@Override
public void run() {
while (true){
System.out.println("Testing");
trySleep(Thread.sleep(333));
}
}
public void trySleep(/*Thread object*/){
//Code for try/catch
}
public static void main(String[] args) {
new Test();
}
}
当然上面的代码不会通过,只是为了提问。
我想要这种东西的原因是因为我发现 try/catch 东西太乱了,读起来很烦人。
我不明白这个问题。如果将这三行添加到 trySleep-method 主体中,您将获得一个方法,该方法将使线程休眠。
所以答案是肯定的。
顺便说一句: 你写了一个无尽的睡眠循环
您可以将 Thread.sleep
包装在一个函数中,该函数将任何异常作为运行时异常(或任何未捕获的异常)重新抛出。
public static void trySleep(long millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
throw new RuntimeException("Interrupted during sleep", e);
}
}
是的,你可以这样做,但不是你现在描述的那样。无论您在哪里使用 Thread.sleep()
,您都必须捕获 InterruptedException
,因此您必须将调用包含在这样的方法中:
public void trySleep(long ms) {
try {
Thread.sleep(ms);
} catch (InterruptedException e) {
e.printStackTrace(); //handle exception here
}
}
您可以这样调用此方法:trySleep(333)
有时只向您的方法添加一个 throws 声明或重新抛出一个更有意义的异常会更好,除非您知道这是捕获异常最有意义的位置。
您可以按照您的建议用另一种方法包装休眠代码。
public static void trySleep(Thread target, long millis){
try{
target.sleep(millis);
} catch(InterruptedException e) {
System.err.println("Exception Occurred while trying to sleep!");
}
}
事实上,您可能应该这样做,因为将代码模块化是正确的方法。
我认为您真正需要考虑的一件重要事情(除了如何正确执行此操作的答案之外)是了解您正在调用的代码。
在您的代码中:
@Override
public void run() {
while (true){
System.out.println("Testing");
trySleep(Thread.sleep(333));
}
}
特别是这一行:
trySleep(Thread.sleep(333));
你基本上是在说
调用方法Thread.sleep(),值为333。
任何值 Thread.sleep() returns,将其传递给另一个方法。
但是the Javadocs说这是一个无效的方法。
也在您的代码中:
public void trySleep(/*Thread object*/){
//Code for try/catch
}
您应该检查 this Whosebug post 为什么这不是好的做法(因为您将尝试在实例对象上调用静态方法)。
其他人已经回答了你关于这个的问题,但我强烈建议复习这些领域,因为这表明你可能缺少一些重要概念的关键知识。
您可以使用 java 8 的 lambda 表达式来做类似的事情:
@FunctionalInterface
interface InterruptedExceptionRunnable {
void run() throws InterruptedException;
}
void trySleep(InterruptedExceptionRunnable exRunnable) {
try {
exRunnable.run();
} catch(InterruptedException ex) {
ex.printStackTrace();
}
}
允许你这样写:
trySleep(()->Thread.sleep(333));
是的,你基本上可以用 Java 8 个 lambda 表达式来做到这一点。
class Example {
@FunctionalInterface
interface InterruptableRunnable {
void run() throws InterruptedException;
}
static void tryRun(InterruptableRunnable r) {
try {
r.run();
} catch(InterruptedException ie) {
ie.printStackTrace();
}
}
public static void main(String[] args) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
// passing a lambda
tryRun( () -> Thread.sleep(333) );
}
});
t.start();
// passing a method reference
tryRun(t::join);
}
}