Java 如何捕获NoRouteToHostException

Java 如何捕获NoRouteToHostException,java,exception,Java,Exception,我被指派做一个方法来检查互联网是否可以访问。 所以,如果连接不可能,我尝试这个虚拟方法返回false public static boolean isInternetReachable() { try { //make a URL to a known source URL url = new URL("http://www.google.com"); //open a connection to that source

我被指派做一个方法来检查互联网是否可以访问。 所以,如果连接不可能,我尝试这个虚拟方法返回false

 public static boolean isInternetReachable()
 {
     try {
         //make a URL to a known source
         URL url = new URL("http://www.google.com");

         //open a connection to that source
         HttpURLConnection urlConnect = (HttpURLConnection)url.openConnection();

         //trying to retrieve data from the source. If there
         //is no connection, this line will fail
         urlConnect.setConnectTimeout(1000);
         Object objData = urlConnect.getContent();

     } catch (UnknownHostException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
         return false;
     }

     catch (IOException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
         return false;
     } 
     catch(Exception e){
         e.printStackTrace();
         return false;
     }
     return true;
 }
但是,我没有捕获异常,而是得到了这个错误(并且能够返回false)

java.net.NoRouteToHostException:没有到主机的路由:connect
位于java.net.DualStackPlainSocketImpl.waitForConnect(本机方法)
位于java.net.DualStackPlainSocketImpl.socketConnect(未知源)
位于java.net.AbstractPlainSocketImpl.doConnect(未知源)
位于java.net.AbstractPlainSocketImpl.connectToAddress(未知源)
位于java.net.AbstractPlainSocketImpl.connect(未知源)
位于java.net.PlainSocketImpl.connect(未知源)
位于java.net.socksocketimpl.connect(未知源)
位于java.net.Socket.connect(未知源)
位于sun.net.NetworkClient.doConnect(未知源)
位于sun.net.www.http.HttpClient.openServer(未知来源)
位于sun.net.www.http.HttpClient.openServer(未知来源)
在sun.net.www.http.HttpClient。(来源不明)
位于sun.net.www.http.HttpClient.New(未知来源)
位于sun.net.www.http.HttpClient.New(未知来源)
位于sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(未知源)
位于sun.net.www.protocol.http.HttpURLConnection.plainConnect(未知源)
位于sun.net.www.protocol.http.HttpURLConnection.connect(未知源)
位于sun.net.www.protocol.http.HttpURLConnection.getInputStream(未知源)
位于java.net.URLConnection.getContent(未知源)
在log2.isInternetReachable(log2.java:59)
在log2$7.actionPerformed(log2.java:319)
在javax.swing.AbstractButton.fireActionPerformed(未知源)
位于javax.swing.AbstractButton$Handler.actionPerformed(未知源)
在javax.swing.DefaultButtonModel.fireActionPerformed(未知源)
位于javax.swing.DefaultButtonModel.setPressed(未知源)
位于javax.swing.plaf.basic.BasicButtonListener.mouseReleased(未知源代码)
位于java.awt.Component.ProcessMouseeEvent(未知源)
位于javax.swing.JComponent.ProcessMouseeEvent(未知源)
位于java.awt.Component.processEvent(未知源)
位于java.awt.Container.processEvent(未知源)
位于java.awt.Component.dispatchEventImpl(未知源)
位于java.awt.Container.dispatchEventImpl(未知源)
位于java.awt.Component.dispatchEvent(未知源)
位于java.awt.LightweightDispatcher.RetargetMouseeEvent(未知源)
位于java.awt.LightweightDispatcher.ProcessMouseeEvent(未知源)
位于java.awt.LightweightDispatcher.dispatchEvent(未知源)
位于java.awt.Container.dispatchEventImpl(未知源)
位于java.awt.Window.dispatchEventImpl(未知源)
位于java.awt.Component.dispatchEvent(未知源)
位于java.awt.EventQueue.dispatchEventImpl(未知源)
位于java.awt.EventQueue.access$200(未知源)
在java.awt.EventQueue$3.run处(未知源)
在java.awt.EventQueue$3.run处(未知源)
位于java.security.AccessController.doPrivileged(本机方法)
位于java.security.ProtectionDomain$1.doIntersectionPrivilege(未知源)
位于java.security.ProtectionDomain$1.doIntersectionPrivilege(未知源)
在java.awt.EventQueue$4.run处(未知源)
在java.awt.EventQueue$4.run处(未知源)
位于java.security.AccessController.doPrivileged(本机方法)
位于java.security.ProtectionDomain$1.doIntersectionPrivilege(未知源)
位于java.awt.EventQueue.dispatchEvent(未知源)
位于java.awt.EventDispatchThread.pumpOneEventForFilters(未知源)
位于java.awt.EventDispatchThread.pumpEventsForFilter(未知源)
位于java.awt.EventDispatchThread.pumpEventsForHierarchy(未知源)
位于java.awt.EventDispatchThread.pumpEvents(未知源)
位于java.awt.EventDispatchThread.pumpEvents(未知源)
位于java.awt.EventDispatchThread.run(未知源)
我不能仅仅使用catch(noroutetohestException e)来捕获异常。
如果无法连接,如何正确返回false。

您可以像捕获其他异常一样捕获它

 public static boolean isInternetReachable()
 {
     try {
         //make a URL to a known source
         URL url = new URL("http://www.google.com");

         //open a connection to that source
         HttpURLConnection urlConnect = (HttpURLConnection)url.openConnection();

         //trying to retrieve data from the source. If there
         //is no connection, this line will fail
         urlConnect.setConnectTimeout(1000);
         Object objData = urlConnect.getContent();

     } catch (UnknownHostException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
         return false;
     }

     catch (IOException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
         return false;
     } 
     catch(Exception e){
         e.printStackTrace();
         return false;
     }
     return true;
 }

此外,如果您只能使用
异常
,它是所有异常的超类,可以捕获任何
异常
(所有异常之父)

还有一件事,你正在一个接一个地捕捉异常,如果你想的话,你可以尝试一次并使用多个捕捉


此外,您只捕获了
IOException
,因此不会捕获其他异常。

很抱歉,无论我放置了多少异常,该错误仍然会发生。我尝试将所有代码打包到一次尝试中,但没有任何帮助。
e.printStackTrace()
将打印异常堆栈检查您是否通过了正确的路由,因此我应该删除它们?不,一点也不。它们将引导您找到异常发生的来源。请转到生成异常的第59行和第102行,并解决问题。我将引导您回答您提出的问题…如果您愿意知道为什么会生成此异常,您可以问另一个问题:0
try
{
}
catch(Exception e){}
try
    {
    }
    catch(NoRouteToHostException e){}