一、异常的分类
01、Throwable
1.1、异常简介:Java异常的顶级类,所有异常都继承于这个类。
1.2、常见异常:Error / Exception
02、Error
2.1、异常简介:非程序异常,即程序不能捕获的异常,一般是编译或者系统性的错误。
2.2、常见异常:OutOfMemorry - 内存溢出异常
03、Exception
3.1、异常简介:程序异常类,由程序内部产生。
3.2、常见异常:运行时异常 / 非运行时异常
04、RuntimeException
4.1、异常简介:运行时异常的特点是java编译器不会检查它,也就是说,当程序中可能出现这类异常时,会编译通过,但是在运行时会出现错误。
4.2、常见异常:NullPointException / ArrayIndexoutOfBuoundsException
二、运行/编译常见异常
01、运行时异常
编号 | 异常解读 | 异常名称 | 备注 |
1.1 | 空指针异常 | NullPointerException | \ |
1.2 | 类型转换异常 | ClassCastException | \ |
1.3 | 算术异常 | ArithmeticException | 除数为0的算术异常 |
1.4 | 非法的参数异常 | IllegalArgumentException | \ |
1.4.1 | 数字格式化异常 | NubmerFormatException | \ |
1.5 | 非法状态异常 | IllegalStateException | \ |
1.6 | 下标越界异常 | IndexOutOfBoundsException | \ |
1.6.1 | 数组下标越界异常 | ArrayIndexOutOfBoundsException | \ |
1.6.2 | 字符串下标越界异常 | StringIndexOutOfBoundsException | \ |
1.7 | 没有这样的元素异常 | NoSuchElementException | \ |
1.7.1 | 输入类型不匹配异常 | InputMisMatchException | \ |
02、编译时异常
编号 | 异常解读 | 异常名称 |
2.1 | 输入\输出异常 | IOException |
2.1.1 | 文件未找到异常 | FileNotFoundException |
2.1.2 | EOF异常 | EOFException |
2.1.3 | 格式错误的 URL 异常 | MalformedURLException |
2.1.4 | 未知主机异常 | UnknownHostException |
2.2 | SQL异常 | SQLException |
2.3 | 不支持克隆异常 | CloneNotSupportedException |
2.4 | 反射操作异常 | ReflectiveOperationException |
2.4.1 | 类未找到异常 | ClassNotFoundException |
三、常见的异常
01、NullPointerException(空指针异常)
异常简介
空指针异常,操作一个 null 对象的方法或属性时会抛出这个异常。
这个异常的常见原因是程序中存在空指针,即调用了未经初始化或不存在的对象。
这些代码经常出现在对象创建和数组调用中,例如对象未初始化或图片路径错误时。对数组代码中出现空指针,是把数组的初始化和数组元素的初始化搞混淆了。数组的初始化是对数组分配空间,而数组元素的初始化,是给数组中的元素赋初始值。
02、OutofOutofMemoryError(内存异常)
异常简介
内存出现异常的一种异常,这不是程序能控制的,是指要分配的对象的内存超出了当前最大的堆内存,需要调整堆内存大小(-Xmx)以及优化程序。
03、IOException(IO流异常)
异常简介
IO,即:input, output,我们在读写磁盘文件、网络内容的时候经常会生的一种异常,这种异常是受检查异常,需要进行手工捕获。
04、FileNotFoundException(文件找不到异常)
异常简介
文件找不到异常,如果文件不存在就会抛出这种异常。FileNotFoundException 其实是 IOException 的子类,同样是受检查异常,需要进行手工捕获。如定义输入输出文件流,文件不存在会报错。
当程序打开一个不存在的文件来进行读写时将会引发该异常。该异常由FileInputStream, FileOutputStream, RandomAccessFile 的构造器声明抛出,即使被操作的文件存在,但是由于某些原因不可访问,比如打开一个只有只读权限的文件并向其中写入数据,以上构造方法依然会引发异常。
05、ClassNotFoundException(指定的类不存在异常)
异常简介
类找不到异常,Java开发中经常遇到,这是在加载类的时候抛出来的,即在类路径下不能加载指定的类。它是受检查异常,需要进行手工捕获。
当试图将一个String类型数据转换为指定的数字类型,但该字符串不满足数值型数据的要求时,就抛出这个异常。在将数据从String类型转换为数值型时,例如将"123456"转换为数值型的操作是可行的。但是如果String类型的数据中包含了非数字型的字符,如123*56,此时转换为数值型时就会出现异常。系统就会捕捉到这个异常,并进行处理。
06、ClassNotFoundExceptio(指定的类不存在异常)
异常简介
这个问题的根源在于类的名称和路径不正确,在程序试图通过字符串加载某个类时,可能会导致异常。例如:
调用Class.forName()、或者调用ClassLoad的finaSystemClass()、或者是LoadClass()时出现异常。
07、ClassCastException(类转换异常)
异常简介
类转换异常,将一个不是该类的实例转换成这个类就会抛出这个异常,这是运行时异常,不需要手工捕获,如将一个数字强制转换成字符串就会报这个异常。
当试图将对某个对象强制执行向下转换,但该对象又不可转换或又不可转换为其子类的实例时将出现该异常。
08、IndexOutOfBoundsException(索引越界异常)
异常简介
索引越界异常,当操作一个字符串或者数组的时候经常遇到的异常。它是运行时异常,不需要手工捕获。一个ArrayList数组中没有元素,而你想获取第一个元素,运行时就会报此类型的错误。
查看程序中调用的数组或者字符串的下标值是不是超出了数组的范围,一般来说,显示调用数组不太容易出这样的错,但隐式调用就有可能出错了,还有一种情况,是程序中定义的数组的长度是通过某些特定方法决定的,不是事先声明的,这个时候可以先查看一下数组的length,以免出现这个异常。
09、ArithmeticException(算术异常)
异常简介
发生在数字的算术运算时的异常,如一个数字除以 0 就会报这个错。
10、NumberFormatException(数字格式异常)
异常简介
当试图将一个String 转换为指定的数字类型,而该字符串确不满足数字类型要求的格式时,抛出该异常。
11、StringIndexOutOfBoundsException(字符串索引越界异常)
异常简介
当使用索引值访问某个字符串中的字符,而该索引值小于0或大于等于序列大小时,抛出该异常。
12、IllegalArgumentException(方法参数错误异常)
异常简介
例如g.setColor(int red,int green,int blue)这个方法中的三个值,如果有超过255的会出现这个异常,如果程序中存在这个异常,就要去检查一下方法调用中的参数传递或参数值是不是有错。
13、IllegalAccessException(没有访问权限异常)
异常简介
当程序要调用一个类,但当前的方法即没有对该类的访问权限便会出现这个异常。如果程序中用了Package的情况下有可能出现这个异常。
14、ArrayStoreException(数组存储异常)
异常简介
当试图将类型为不兼容类型的对象存入一个Object[]数组时将引发异常。
15、NoSuchMethodException(方法不存在异常)
异常简介
当程序试图通过反射来创建对象,访问(修改或读取)某个方法,但是该方法不存在就会引发异常。
16、EOFException(文件已结束异常)
异常简介
当程序在输入的过程中遇到文件或流的结尾时,引发异常。因此该异常用于检查是否达到文件或流的结尾。
17、InstantiationException(实例化异常)
异常简介
当试图通过Class的newInstance()方法创建某个类的实例,但程序无法通过该构造器来创建该对象时引发。Class对象表示一个抽象类,接口,数组类,基本类型 。该Class表示的类没有对应的构造器。
18、InterruptedException(被中止异常)
异常简介
当某个线程处于长时间的等待、休眠或其他暂停状态,而此时其他的线程通过Thread的interrupt方法终止该线程时抛出该异常。
19、CloneNotSupportedException(不支持克隆异常)
异常简介
当没有实现Cloneable接口或者不支持克隆方法时,调用其clone()方法则抛出该异常。
20、OutOfMemoryException(内存不足异常)
异常简介
当可用内存不足以让Java虚拟机分配给一个对象时抛出该错误。
21、NoClassDefFoundException(未找到类定义异常)
异常简介
当Java虚拟机或者类装载器试图实例化某个类,而找不到该类的定义时抛出该错误。
22、RedisCommandTimeoutException(缓存/服务器命令超时异常)
异常简介
①、redis服务器的负载过高,处理命令的时间超过了客户端设置的超时时间。 ②、redis客户端和服务器之间的网络延迟过大,导致命令无法及时到达或者返回。 ③、redis客户端使用了不合适的连接池配置,导致连接不够用或者连接泄露。
可以尝试以下方法来解决这个问题: ①、检查redis服务器的性能指标,如CPU、内存、网络等,看是否有异常或者瓶颈。 ②、检查redis客户端和服务器之间的网络状况,看是否有丢包或者延迟过高的情况。 ③、调整redis客户端的超时时间和连接池参数,根据业务需求和实际情况来设置合理的值。
23、InvalidCredentialsException(用户凭据无效异常)
异常简介
InvalidCredentialsException错误通常表示用户凭据无效,这可能是由于用户的凭据过期、用户凭据填写错误、权限问题或其他身份验证问题导致的。
一、用户凭据过期
对于一些需要身份验证的应用程序或网站,用户的凭据可能会在一段时间后过期。如果未在适当的时间内更新凭据,那么就有可能出现InvalidCredentials错误。
为了解决这个问题,我们可以尝试更新用户的凭据。如果我们处于一个企业或组织中,可以尝试联系管理员或负责人进行凭据更新。如果我们是普通用户,可以尝试重新登录账户并更新凭据。同时,也可以尝试重新授权应用程序、清除浏览器缓存和cookies来解决这一问题。
二、用户名或密码填写错误
当我们在进行身份验证时,通常需要填写用户名和密码。如果我们在填写用户名或密码时出现了错误,那么也有可能导致InvalidCredentials错误的出现。这时我们需要检查一下用户名和密码是否填写正确。
如果我们确信填写的凭据是正确的,但仍然出现InvalidCredentials错误,这时候我们可以尝试重置密码或生成新的凭据。在使用第三方应用程序或服务时,通常可以在应用程序的授权设置或API密钥中生成新的凭据来解决这个问题。
三、权限问题
有时,InvalidCredentials错误也可能是由于权限不足或被禁止访问的问题导致的。这种情况下,我们需要检查一下我们的账户是否具备足够的权限来访问所需的资源或进行所需的操作。
如果我们确信自己有足够的权限,但仍然出现了这个问题,这时候我们可以联系管理员或负责人来检查我们的账户或权限。
四、其他身份验证问题
在某些情况下,InvalidCredentials错误可能也可能是由其他身份验证问题导致的。这时候我们需要仔细检查错误信息并寻找相关的解决方案。
对于一些特定的应用程序或服务,可能存在特定的解决方案或说明文档来帮助我们解决这个问题。如果我们找不到解决方案,可以考虑在相关的技术社区或论坛上咨询其他开发者或专家。
24、ConnectException(连接被拒绝异常)
异常简介
该异常出现的原因,大多数人给出的答案是端口号被占用,或者在启动本次 Tomcat 服务器之前“关闭”的 Tomcat 服务器没有被彻底关闭,因此才导致此异常的发生。也就是说,此异常一般不会在初次启动 Tomcat 服务器的时候出现。
1)端口号被占用:杀死占用端口号(一般为8080)的进程,释放端口;彻底关闭 Tomcat 服务器,或者重新启动项目。
2)使用以下命令检查服务器中允许的最大进程数:ulimit -u。如果将此值设置为较低值,例如1024,则使用以下值将其增加到131072或无限制:ulimit -u 131072 或者 ulimit -u无限制 。
3)客户端和服务器,它们中的任何一个或两个都不在网络中:它们可能没有连接到LAN或互联网或任何其他网络,在这种情况下,Java将会抛出客户端的“ java.net.ConnectException:Connection refused ”异常。
4)服务器未运行用:是服务器已关闭但未运行。在这种情况下,你也会得到java.net.ConnectException:连接被拒绝错误。可ping来检查服务器是否正在运行并侦听端口。
5)服务器正在运行但没有侦听端口,客户端正在尝试连接:服务器正在运行但是正在侦听不同的端口。验证配置。如果你正在处理一个大项目,并有一个分层配置文件,它可能是默认配置或其他一些设置覆盖了您正确的设置。
6)主机端口组合不允许使用防火墙:几乎每个企业网络都受防火墙保护。如果您正在连接其他公司网络,例如在任何电子交易系统中,需要提高防火墙 双方要求确保他们允许彼此的IP地址和端口号。如果防火墙不允许连接,也会收到相同的java.net.ConnectException:Java应用程序中的连接拒绝异常。
7)主机端口组合不正确:提供的主机端口组合不正确,或者服务器端的早期主机端口组合已经更改。检查客户端和服务器端的最新配置。
8)连接字符串中的协议不正确:TCP是许多高级协议的基础协议,包括HTTP,RMI等。通过连接时字符串,你需要确保你传递正确的协议,服务器期望。例如服务器已暴露,通过 RMI 而不是连接字符串的服务应该以rmi:// 开头。
25、HttpHostConnectException(网络请求异常)
异常简介
HttpHostConnectException常常出现在网络请求中,很多时候这是由于网络连接问题导致的错误。
一、检查网络连接
当我们遇到httpHostConnectException报错时,第一步应该是检查网络连接,确保网络正常。可以使用如下代码段检查网络连接:
如果网络连接正常,就需要考虑其他可能导致这个问题的因素。
try { URL url = new URL("https://www.baidu.com/"); HttpURLConnection urlConn = (HttpURLConnection) url.openConnection(); urlConn.setConnectTimeout(3000); int responseCode = urlConn.getResponseCode(); if (responseCode == 200) { // 网络正常 } else { // 网络异常 } } catch (Exception e) { // 网络异常 }
二、检查网络访问权限
如果我们没有获取网络访问权限就进行网络请求,那么就会出现httpHostConnectException的错误。此时,我们需要在AndroidManifest.xml文件中添加以下权限声明:
<uses-permission android:name="android.permission.INTERNET" />
注意:如果我们使用了https协议,请务必加上以下声明:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
三、检查URL格式
当URL格式错误时,也会出现httpHostConnectException的错误。因此,我们需要检查URL格式是否正确。以下是正确的URL格式:
http://www.example.com/path https://www.example.com/path
需要注意的是URL不支持中文字符,必须将中文字符转换成URL编码格式:
String encodedPath = URLEncoder.encode("你好", "UTF-8"); String url = "http://www.example.com/" + encodedPath;
四、检查网络请求方式
我们常用的网络请求方式包括GET和POST,当我们使用错误的请求方式时,也会出现httpHostConnectException的错误。以下是GET和POST请求方式的示例代码:
// GET请求 URL url = new URL("http://www.example.com/path?key=value"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.connect(); // POST请求 URL url = new URL("http://www.example.com/path"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setDoOutput(true); OutputStream out = new BufferedOutputStream(conn.getOutputStream()); out.write(data.getBytes()); out.flush(); out.close();
要注意POST请求需要写入RequestBody,如果RequestBody为空,需要设置Content-Length为0:
conn.setFixedLengthStreamingMode(0);
26、BindingException(Mapper绑定异常)
异常简介
在MyBatis中我们需要先定义一个Mapper接口,在接口中定义方法。然后再定义一个Mapper.xml,在XML文件中编写方法对应的SQL语句,这也是java代码和sql语句分离的体现。我们在调用Mapper接口中的方式时MyBatis会给我们创建一个该接口的代理类,通过代理类来调用Mapper接口中的方法。
现在有了代理就可以调用方法了,但是怎么找到这个方法对应的SQL语句呢?此时就需要把Mapper接口和Mapper.xml进行绑定,只有绑定了MyBatis才知道方法对应的sql语句,我们通过代理调用方法时才能正常运行sql语句。那么这个异常就是报的绑定异常,说没有找到com.qf.mapper.EmpMapper.list()对应的sql语句。
异常解决:对于上面的异常,其实我们只需要在Mapper.xml中添加对应的sql语句就可以解决。该学员的这个bug的原因是因为没有写sql语句导致的。但是除了这个原因外,还有其他的场景也会导致出现这个bug。
-
Mapper.xml中的namespace属性写错了
-
Mapper.java中的方法名称和Mapper.xml中标签id的属性不一致
-
Mapper.java中定义了方法,但是没有写Mapper.xml中对应的slq语句
-
Mapepr.xml没有给MyBatis注册
-
Mapepr.xml中的id最好和方法名称保持一致,而且Mapper.java中的方法名称不要重载。方法中是可以重载的,但是Mapepr.xml中的id是不允许重复的。