我会尽量详细说明。也就是说,这是我的第一篇文章,所以请随意批评表格/结构/不管,谢谢!
我正在实现MessageListener
(javax.jms.MessageListener
),当我开始时,我的IDE(Netbeans)请求我设置ExceptionListener
。代码如下:
public class MessageQueueListener implements MessageListener
{
public void run()
{
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(<ActiveMQ-address>);
Connection connection = connectionFactory.createConnection();
connection.setExceptionListener(new ExceptionListener()
{
@Override
public void onException(JMSException jmse)
{
//Handle Exception
}
});
Session session = _connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue("NotificationMessageQueue");
Consumer consumer = _session.createConsumer(destination);
consumer.setMessageListener(this);
connection.start();
}
}
我当时并没有多想,因为为潜在的连接问题设置一个监听器是有意义的。但是,当我继续执行我的实现时,我在次要方法上添加了try/catch
语句,这些语句更具体地针对我的用例。
例如:
public boolean postNotification(Message message)
{
String urlParameters = "dummy=dummy";
try
{
postRequest(urlParams); //Below
}
catch (MalformedURLException mfe)
{
//Handle Exception
}
catch (IOException ioe)
{
String eMessage = ioe.getMessage();
if(eMessage.contains("401"))
{
//Handle Exception
}
return false;
}
return true;
}
public void postRequest(String urlParams) throws MalformedURLException, IOException
{
URL url = new URL(<url-to-post-to>);
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.addRequestProperty("Authorization", "Basic " + encodedLogin);
con.setRequestMethod("POST");
con.setDoOutput(true);
DataOutputStream wr = new DataOutputStream(con.getOutputStream());
wr.writeBytes(urlParams);
wr.flush();
wr.close();
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
{
System.out.println(inputLine);
}
in.close();
con.disconnect();
}
无论如何,现在我的run()
方法正在请求try/catch
,项目开头的ExceptionListener
不再有用。使用try/catch
es似乎一切正常,所以我很好奇发生了什么变化。我试图自己发现原因,但没有运气。
因此,所有这些都是要问的背景:使用ExceptionListener
与try/catch
之间的区别是什么?使用其中一个是否有优势,至少对于像我这样的实现?
答案 0 :(得分:2)
他们不是替代品。消费者需要ExceptionListener
因为它是MessageListener,
并且不调用连接上的任何方法,因此无法知道连接失败。但是,当您调用抛出已检查异常的方法时,您必须捕获它。编译器会让你。
答案 1 :(得分:0)
try/catch
是Java构造的基础之一。它用于处理意外错误。所以,你会经常使用try/catch
:
通过提供一个或,将异常处理程序与try块关联 try块后直接捕获更多块。之间没有代码 try块的结束和第一个catch块的开始。
尝试{
} catch(ExceptionType名称){
} catch(ExceptionType名称){
}
每个catch块都是一个异常处理程序并处理其类型 其论点表明的例外情况。参数类型,ExceptionType, 声明处理程序可以处理的异常类型,必须是 从Throwable类继承的类的名称。该 handler可以引用带有名称的异常。
另一方面,ExceptionListener
仅适用于JMS:
如果JMS提供程序检测到Connection对象出现严重问题, 它通知Connection对象的ExceptionListener,如果有的话 注册。它通过调用侦听器的onException方法来完成此操作, 传递一个描述问题的JMSException参数。一个 异常监听器允许客户端收到问题通知 异步。有些连接只消耗消息,所以他们会这样做 没有其他方法可以了解他们的连接失败了。 JMS提供程序应尝试自行解决连接问题 在它通知客户之前。
在您的情况下,您必须同时使用try/catch
和ExceptionListener
。 ExceptionListener
是特定于JMS的,因此您不会使用它。 try/catch
是Java的基础。