Java:是否可以缩短try / catch?

时间:2015-04-05 23:00:32

标签: java try-catch thread-sleep

例如:

try {
        Thread.sleep(333);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

我可以使用像trySleep(Thread.sleep(333));之类的创建方法以某种方式使用上面的try / catch吗?它会和原始的尝试完全相同吗?

使用示例:

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事情非常混乱并且安静地阅读。

7 个答案:

答案 0 :(得分:2)

您可以将Thread.sleep包装在一个函数中,该函数将任何异常重新抛出为运行时异常(或任何未捕获的异常)。

public static void trySleep(long millis) {
    try {
        Thread.sleep(millis);
    } catch (InterruptedException e) {
        throw new RuntimeException("Interrupted during sleep", e);
    }
}

答案 1 :(得分:1)

我不明白这个问题。如果将三行添加到trySleep-method Body中,则会得到一个让线程休眠的方法。

所以答案是肯定的。

顺便说一下: 你写了一个无尽的睡眠循环

答案 2 :(得分:1)

是的,您可以这样做,但不完全按照您现在描述的方式。无论你使用Thread.sleep()的哪个地方,你都必须抓住InterruptedException,所以你必须将调用包含在这样的方法中:

public void trySleep(long ms) {
    try {
        Thread.sleep(ms);
    } catch (InterruptedException e) {
        e.printStackTrace(); //handle exception here
    }
}

您可以这样调用此方法:trySleep(333)

有时候最好只为你的方法添加一个throws声明,或者重新抛出一个更有意义的异常,除非你知道这是捕获异常最有意义的位置。

答案 3 :(得分:0)

您可以按照建议将其睡眠代码包装在另一种方法中。

public static void trySleep(Thread target, long millis){
    try{
        target.sleep(millis);
    } catch(InterruptedException e) {
         System.err.println("Exception Occurred while trying to sleep!");
    }
}

事实上,您可能应该这样做,因为使代码模块化是正确的方法。

答案 4 :(得分:0)

我认为你真正需要考虑的一件重要的事情(除了正确解决这个问题的答案之外),就是要了解你所调用的代码。

在您的代码中:

@Override
public void run() {
    while (true){
        System.out.println("Testing");
        trySleep(Thread.sleep(333));
    }
}

特别是这一行:

trySleep(Thread.sleep(333));

你基本上是在说

  • 使用值333调用方法Thread.sleep()。

  • 无论Thread.sleep()返回什么值,都将其传递给另一个方法。

但是the Javadocs说这是一种无效的方法。

同样在您的代码中:

public void trySleep(/*Thread object*/){
    //Code for try/catch
}

您应该检查this stackoverflow post为什么这不是一个好习惯(因为您将尝试在实例对象上调用静态方法)。

其他人已就此回答了您的问题,但我强烈建议您对这些方面进行梳理,因为这表明您可能会错过一些重要概念的重要知识。

答案 5 :(得分:0)

您可以使用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));

答案 6 :(得分:0)

是的,基本上可以使用Java 8 lambdas。

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