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);
    }
}