2015-04-05 48 views
0

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

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的东西太混乱了,并且很烦人。

+0

你是什么原因不内联这个声明? – 2015-04-05 23:06:31

回答

2

你可以在重新抛出任何异常的运行时异常(或任何未捕获的异常)的函数包装Thread.sleep

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

我一直认为Thread.sleep必须在它运行的线程中?如果你在construtor'Test()'中调用它,它将不起作用。 – FOD 2015-04-05 23:07:02

+2

@FOD当你从'run'里面调用'trySleep'时,你会在当前线程中调用它。功能定义在哪里并不重要。 – axblount 2015-04-05 23:08:50

1

我不明白这个问题。如果将三行添加到trySleep方法体中,您将得到一个方法,该方法将让线程休眠。

所以答案是肯定的。

顺便说一句: 您写了无尽的睡眠循环

+0

我知道这是无止境的,这只是我选择的一个快速示例,示例中的其他任何内容都是毫无意义和无关紧要的。 – FOD 2015-04-05 23:07:59

+0

这不提供问题的答案。要批评或要求作者澄清,请在其帖子下方留言。 – 2015-04-06 04:16:13

+1

@HarshalPatil:有关“如果将三行添加到trySleep方法”的部分就是答案。我在这个问题上遇到了一些问题,因为问题中包含了答案。 – 2015-04-06 18:06:43

1

是的,你可以做到这一点,但不完全是你现在描述的方式。无论你使用Thread.sleep()你必须抓住InterruptedException,所以你必须附上电话在这样的方法:

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

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

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

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

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

+0

由于[Thread.sleep(...)'](http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#“target”参数是多余的和误导性的sleep%28long%29)是导致_current_线程休眠的静态方法。为了可读性,静态方法不应该通过实例引用来调用。 – 2015-04-05 23:47:11

0

我认为你真的需要考虑的一件重要事情(除了如何正确执行此操作的答案之外),是了解你所调用的代码。

在您的代码:

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

特别是这一行:

trySleep(Thread.sleep(333)); 

你基本上说

  • 与值调用该方法的Thread.sleep() 333.

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

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

而且在你的代码:

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

您应该检查this stackoverflow post了为什么这是不好的做法(如你会尝试调用静态方法的实例对象)。

其他人已经回答了您的问题,但我强烈建议您对这些问题进行研究,因为这表明您可能会遗漏某些重要概念的重要知识。

0

您可以使用Java 8的Lambda表达式做类似这样的东西:

@FunctionalInterface 
interface InterruptedExceptionRunnable { 
    void run() throws InterruptedException; 
} 

void trySleep(InterruptedExceptionRunnable exRunnable) { 
    try { 
     exRunnable.run(); 
    } catch(InterruptedException ex) { 
     ex.printStackTrace(); 
    } 
} 

它允许你这样写:与Java 8 Lambda表达式

trySleep(()->Thread.sleep(333)); 
0

是的,你可以做的基本上是这样的。

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