Java追求的是无故障,健壮的代码,因此对一些可预知和不可预知的错误(如设备错误,算法缺陷等)要进行处理,有两种方法:
一种是捕获: 一种是抛出 .
你可以尝试自己写一个父类,方法中有抛出异常,然后继承这个方法的子类,就必须要捕获,或者也throws 一个异常。
java.io.Reader
是BufferedReader 的父类,它本身方法会抛出一个异常。所以它的子类继承了这个方法也需要捕获或者抛出一个异常。这个BufferedReader 继承的父类的方法就必须要处理异常,是因为JDK里面的java.io.Reader 方法有抛出异常的需要。
更多可以参看下面IBM网站链接的“Java 异常处理及其应用”
2. 异常非要捕获吗直接抛出不可以吗
可以倒是可以, 不过如果这么无限的抛下去, 可能到最后会累积很多的异常, 导致你都无法发现实际问题到底是在哪里出现的, 异常的捕捉可以体现出代码的严谨性, 你逻辑的合理性.
所以我们正常工作当中的规范是: 哪里有可能出现异常就在哪里捕捉, 问题出现了在开发阶段就解决它.
3. 网络请求异常或精灵不在线
如果您连接的网络是联通宽带,网络连接失败,可能存在以下原因:
1、宽带欠费或到期,需要及时缴费或续期。
2、网线松动,需将网线的两端插紧。
3、设备长时间使用造成,可把光猫、路由器、电脑等上网设备断电10-20秒,再接通电源重启。
4、如上述方法不能恢复建议联系当地客服热线工作人员。
4. java中涉及IO操作时,为什么需要捕获异常
IO操作一般是与系统外的数据有交换,比如读文件,读网络数据等,这类操作往往会有很多意外发生,比如文件类型不对,没有权限,网络超时等等,这类意外事件如果不捕获的话用户不好查找问题原因。所以sun定义时需要捕获的是因为如果不捕获的话可能产生不可预测的问题.
5. 程序中凡是可能出现异常的地方必须进行捕获或抛出对吗
一、异常的种类
java异常可以分成两大类:Exception和RuntimeException(虽然RuntimeException是从Exception继承的)。exception异常代表“无法避免的异常” 如io异常 往往这类异常是由于外部原因造成的,程序本身无法保证他们不发生,所以这类异常必须捕获。如果在函数内部无法处理这个异常必须再次抛出(在函数后面用throws语句),如果什么都不做就出现编译错误。
runtimexception是指“可以避免的异常”,如 null引用异常,这类异常都是由程序内部原因造成的,是可以避免的。对于这类异常可以忽略他们,但一旦发生程序就会异常终止。这类异常对debug非常有帮助,当然,如果需要也可以catch。
另外,有些地方即使不会有exception,但是从商业逻辑上是错误的、非预期的,也可以抛出user exception。例如,用户输入非法,bank account非法透支等等。
二、主要原则
处理意外的一个重要原则,就是要么处理,要么接着抛,决不能吃掉(You either handle it, or throw it. You don’t eat it.)这就是说,当你捕获一个异常之后,必须决定是否立即处理这个异常,或者继续抛出这个异常(或者另一个自定义异常),以便由调用的客户端捕获之。当客户端捕获到以后,又会继续进行类似的判断。
一般来说,GUI端是要处理异常的,比如JSP捕获到异常之后,需要先是给用户一个友好的出错信息,而不要给出系统的出错信息。系统的出错信息一方面不太友好,另一方面提供了太多的系统信息,容易被恶意用户用来攻击系统。
换句话说,所有的异常最终必须有一个终极的处理者,这就是GUI。至于中间的环节,比如在服务器端运行的JavaBean是否要处理捕获到的异常,还是继续抛出所捕获的异常,需要视具体情况处理。
除非你想把异常处理的责任交给调用者,一般不用throws。比如你要读入一些文件,如果你想通知调用者,让调用者决定如何处理这个异常,你就把这个异常throws给调用者;如果你知道应该如何处理这个异常,或者你想把异常马上解决,你可以就地catch她。
这完全取决于你想把异常自己立即处理还是想把处理责任返回给调用者。取决于你的程序的结构和要求。
需要注意的有:
1、如果无法处理某个异常,那就不要捕获它。
2、如果捕获了一个异常,请不要胡乱处理它。
3、尽量在靠近异常被抛出的地方捕获异常。
4、在捕获异常的地方将它记录到日志中,除非您打算将它重新抛出。
5、按照您的异常处理必须多精细来构造您的方法。
6、需要用几种类型的异常就用几种,尤其是对于应用程序异常。
三、异常嵌套和捕获适当的异常
按照Java语言的定义,所谓异常(Exception)指的就是向调用方法(calling method)表示发生非正常情况的习惯方式。下面讨论两种在处理异常时可兹利用的技术:异常嵌套和捕获适当的异常。
异常嵌套
你在试图捕获异常并打算扔出异常时该采取什么措施呢?同时,你希望原始的异常信息可用吗?
要回答以上的问题你不妨尝试一下NestedException类。具体的编程并不难,唯一要做的无非是利用构造器并且重载printStackTrace()以便显示出正确的数据。
此外,你还应当考虑封装Throwable而非Exception类来创建更具有重用性的组件。之后,你可以创建NestedRuntimeException变量封装Throwable但无需对其进行声明。
捕获适当的异常
正确地处理异常并不是一项轻松的任务,这是因为异常的处理有时会导致程序出现其他不明行为。不过,以下三条规则可以帮助你避免错误处理异常所可能遭遇的风险。
规则 #1: 总是捕获扔出异常的类型而不要理睬异常的超类。为了遵守通常的代码习惯,你可以采用Exception类的大写字母作为变量名,如下所示:
catch(FileNotFoundException fnfe)
以及
catch(SQLException sqle)
规则 # 2: 决不让catch块留空。在很多情况下虽然确实编写了try/catch块但在代码的catch部分却什么都没有做。或者,如果采用了日志API(Logging API),那么请编写代码把异常写到日志中。
规则 # 3: 决不扔出Exception基类的实例。开发人员应当总是扔出自己创建的异常类。
扔出异常的API很难处理。在声明方法扔出java.lang.Exception的情况下,所有的问题都会强加在API用户的头上,这样他们就无法以一种专业的编程方式来处理异常。通过为扔出API声明Exception类的子类这一举措,API开发人员就可以减轻用户的负担。
以上提到的两种技术在处理异常时还可能用得更好、更适当。嵌套技术令异常扔到另一异常的内部,而捕获适当的异常令程序调试大大简化。
6. 系统检测到网络中存在异常访问请求 是什么情况
如果是这种情况的话,网络首先保证是通畅的前提下,但是在访问网络的过程中检测到在整个网络中存在异常访问请求,那么就极有可能是有人在攻击网络。你可以从网络上下载一个专业的网络管理软件并安装它,然后设置各种条件捕获所需要的数据包进行详细的分析,这样肯定能够找到问题根源所在。
7. 网络请求出错什么意思
一般来说是由于自己本身网络的问题造成网络请求失败,但也存在服务器出现问题,导致网络请求错误。
自身网络造成的网络请求错误非常常见,也非常容易解决。如果用户当前的信号较差或者网速较差,这些都会出现网络请求错误的发生。建议用户更换质量较好的网络,比如WiFi网络。或者去一些信号较好的地方解决该问题。
如果用户的信号网速都没有问题,但是依旧出现网络请求错误,可以看看用户的移动数据有没有打开,如果移动数据没有打开也是会出现网络请求错误的。如果只是个别软件出现网络请求错误,用户可以在设置中看看有没有禁止该软件使用网络数据。禁用后的软件也会出现网络请求错误。如果这个软件没有被禁用数据,但是依旧提示网路请求错误,这就表明该软件的服务器出现了问题,一般都是访问量突然增大,造成服务器崩溃显示网络请求错误。
8. 网络抓包原理
本文以App作为例子,实际应用不限于App范围。
大部分场合都可以通过程序调试来定位问题,但有些场景使用抓包来定位接口问题更准确、更方便,如以下场景:
要实现对App的网络数据抓包,需要监控App与服务器交互之间的网络节点,监控其中任意一个网络节点(网卡),获取所有经过网卡中的数据,对这些数据按照网络协议进行解析,这就是抓包的基本原理。
但是中间网络节点,不受我们控制,所以基本无法实现抓包的,只能在客户端和服务端进行抓包。
通常我们监控本地网卡数据,如下图:
本地网络 指的是WIFI的路由,如果直接抓路由器的包还是比较麻烦的,因此我们会在 手机 和 本地路由 之间加一层 代理服务 ,这样只要抓代理服务的网络数据即可:
虽然在 手机 侧也可实现抓包,但和 本地路由 一样,抓包比较麻烦,如果不是没有办法,尽量还是不在手机侧抓包。但是有一种情况必须在手机端抓包,那就是在4G网络情况下:
4G网络状态下如何抓包,以及它的劣势,我们后面章节再细讲。
抓包实际上是分析网络协议的一种过程,尽管繁琐的细节劳动都让抓包工具做了,但我们还是需要了解下基础的网络协议,好帮助我们更好的分析问题。
首先需要了解下经典的OSI七层网络模型,以及每层的作用,其次对TCP、HTTP协议简单了解。
HTTPS是基于HTTP协议的一种改进,在 TCP之上 的会话层增加安全处理。对于应用层来说,HTTPS和HTTP没有什么不同,也就是说,HTTPS是保证网络传输的安全性,对业务数据无侵入。
简化理解大概是这个样子:
SSL和TLS是保证安全传输的协议,包括证书认证、加解密和数字签名。
项目中HTTPS的链路:
因此,客户端与后台,编写网络接口时,不需要关心SSL或TLS,按照HTTP协议处理即可。
既然HTTPS在网络传输是经过加密的,那么抓包抓到的数据就是密文,不经过解密是无法看到报文的。针对这个问题,如上图WIFI环境下设置代理的方式可以解决,具体思路是:
所以整个网络链路依然是HTTPS在传输,但代理服务自己可以获取到明文数据。
比较常用的抓包工具大概有4个,主要用作互补,配合使用基本所有平台、所有抓包需求都能满足:
需要说明的是,tcpmp可将数据保存成文件,直接用wireShark打开分析,针对后台或手机抓包使用起来十分方便。
几个工具间的使用关系:
为什么要真机抓包?必定是没有办法设置代理服务了,如4G网络情况下直接和移动基站链接,没法设置代理服务。凡是非4G网络状态下,都不建议真机抓包。
iOS 5后,apple引入了RVI remote virtual interface的特性,它只需要将iOS设备使用USB数据线连接到mac上,然后使用rvictl工具以iOS设备的UDID为参数在Mac中建立一个虚拟网络接口rvi,就可以在mac设备上使用tcpmp,wireshark等工具对创建的接口进行抓包分析。
具体步骤:
android是linux系统,和后台一样可以使用tcpmp命令来抓包,但是需要root权限,因为一般手机系统不带有抓包命令 tcpmp ,需要自行安装。
安装tcpmp:
使用tcpmp:
这是就已经进入抓包状态,手机所有的网络请求都会被捕获,并保存到capture文件中。
导出capture文件:
原文: 网络抓包