1、检查有没有报错信息
日志文件中登记的错误,这个算是最简单的,在定位错误时,也最希望问题在这一步得到确认。在打印异常时,通常会打印异常的调用栈信息,通过调用栈信息就可以很便捷的定位问题了。
例如:
![在这里插入图片描述](https://img-blog.csdnimg.cn/36d79906d6ee43eca85224b14a0411e5.png
JDK中定义了一套完整的异常机制,所有的异常都是Throwable的子类,分为Error(致命异常)和Exception(非致命异常)。
Error是一种非常特殊的异常类型,它的出现标识着系统发生了不可控的错误,例如StackOverFlowError或者OutOfMemoryError。针对此类错误,程序无法处理,只能人工介入。
Exception又分为checked异常(受检异常)和unchecked异常()。
checked异常时需要在代码中显式处理的异常,否则会编译报错。如果能自行处理则可以在当前方法中捕获异常,如果无法处理则继续向调用方抛出异常对象。常见的checked异常包括JDK中定义的SQLException、ClassNotFoundException等。checked异常可以进一步细分为两类:
无能为力、引起注意型。针对此类异常,程序无法处理,如字段超长导致的SQLException,即使做再多的重试也无法解决异常,一般处理此类异常是完成的保存异常现场,供开发工程师介入解决。
力所能及、坦然处置型。如发生未授权异常(UnAuthorizedException),程序可跳转至权限申请页面。
在Exception中,unchecked异常时运行时异常,他们都继承自RuntimeException,不需要程序显式的捕捉和处理,unchecked异常可以进一步细分为3类:
可预测异常(Predicted Exception):常见的可预测异常包括IndexOutOfBoundsException、NullPointerException等,基于对代码的性能和稳定性要求,此类异常不应该被产生或者抛出,而应该提前做好边界检查、空指针判断等处理。显式的声明或者捕获此类异常会对程序的可读性和运行效率产生很大影响。
需捕获异常(Caution Exception),例如在使用Dubbo框架进行RPC调用时产生的远程服务超时异常DubboTimeoutException,此类异常是客户端必须显式处理的异常,不能因服务端的异常导致客户端不可用,此时的处理方案可以是重试,或者降级处理等。
可透出异常(Ignored Exception),主要是指框架或者系统产生的且会自行处理的异常,而程序无需关心。例如针对Spring 框架中抛出的NoSuchRequestHandingMethodException异常,Spring框架会自己完成异常的处理,默认将自身抛出的异常自动映射到合适的状态码,比如启动防护机制跳转到404页面
2.结合系统资源使用情况
如果没有报错的信息,这时候可能需要结合当前的CPU使用率等情况进行分析了。
可以从以下几个方面着手
是否CPU占用过高
是否内存占用过高
是否磁盘占用过高
是否网络故障
查看后台日志
是否是数据库问题(比如:索引失效、死锁)
是否是垃圾回收导致
是否死锁等