[Java] 异常
1. NullPointerException
NullPointerException
是Java中最常见的异常之一,通常在试图访问或操作一个null对象时引发。
示例代码:
String str = null;
int length = str.length();
解决方法:
在访问或操作对象之前,检查对象是否为null。
String str = null;
int length = 0;
if (str != null) {
length = str.length();
}
2. ArrayIndexOutOfBoundsException
ArrayIndexOutOfBoundsException
异常通常在试图访问数组的非法索引时引发。
示例代码:
int[] array = new int[10];
int number = array[10];
解决方法:
在访问数组元素之前,检查索引是否在有效范围内。
int[] array = new int[10];
int index = 10;
if (index >= 0 && index < array.length) {
int number = array[index];
}
3. ClassCastException
ClassCastException
异常通常在试图将一个对象强制转换为不兼容类型时引发。
示例代码:
Object obj = new Integer(1);
String str = (String) obj;
解决方法:
在执行类型转换之前,使用instanceof
运算符检查对象是否是目标类型。
Object obj = new Integer(1);
if (obj instanceof String) {
String str = (String) obj;
}
4. IOException
IOException
是Java处理I/O操作时常见的异常,例如读取文件、网络通信等。
示例代码:
InputStream is = new FileInputStream("non-exist-file.txt");
解决方法:
- 检查文件路径、网络连接等是否正确。
- 使用try-catch语句处理可能的
IOException
。
try {
InputStream is = new FileInputStream("non-exist-file.txt");
} catch (IOException e) {
e.printStackTrace();
}
5. FileNotFoundException
FileNotFoundException
是IOException
的一个子类,通常在试图打开不存在的文件时引发。
示例代码:
InputStream is = new FileInputStream("non-exist-file.txt");
解决方法:
- 检查文件路径是否正确。
- 使用try-catch语句处理可能的
FileNotFoundException
。
try {
InputStream is = new FileInputStream("non-exist-file.txt");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
6. NumberFormatException
NumberFormatException
通常在试图将一个不合法的字符串转换为数字时引发。
示例代码:
int number = Integer.parseInt("not a number");
解决方法:
在执行类型转换之前,检查字符串是否可以转换为数字。
String str = "not a number";
try {
int number = Integer.parseInt(str);
} catch (NumberFormatException e) {
e.printStackTrace();
}
[Spring Cloud] 异常
1. FeignClient 异常
Feign 是 Spring Cloud 中用于声明式 HTTP 客户端的工具,它简化了 HTTP 请求的发送和接收过程。然而,在使用 Feign 时,你可能会遇到一些问题。
1.1 RetryableException
Feign 在请求失败时会抛出 RetryableException
异常。这通常是由网络问题或远程服务无法正确响应请求所导致的。例如,以下代码可能会抛出 RetryableException
:
@FeignClient("remote-service")
public interface RemoteServiceClient {
@RequestMapping(method = RequestMethod.GET, value = "/data")
String getData();
}
@Autowired
private RemoteServiceClient remoteServiceClient;
public void requestData() {
String data = remoteServiceClient.getData(); // 这里可能会抛出 RetryableException
}
解决方法:
- 检查网络连接和远程服务的状态。
- 调整 Feign 的超时设置,例如
feign.client.config.default.readTimeout
和feign.client.config.default.connectTimeout
。 - 配置 Feign 的重试机制。
具体例子:
17|pic-policyservice | Exception in thread "pool-5-thread-46" feign.RetryableException: Read timed out executing POST http://xxx/importnewcont/customListState
17|pic-policyservice | at feign.FeignException.errorExecuting(FeignException.java:132)
17|pic-policyservice | at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:113)
17|pic-policyservice | at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:78)
17|pic-policyservice | at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:103)
17|pic-policyservice | at com.sun.proxy.$Proxy132.customListState(Unknown Source)
17|pic-policyservice | at com.riskeys.pic.policyservice.service.biz.impl.OfflinePolicyServiceImpl.lambda$policyImportNew$0(OfflinePolicyServiceImpl.java:334)
17|pic-policyservice | at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
17|pic-policyservice | at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
17|pic-policyservice | at java.lang.Thread.run(Thread.java:748)
17|pic-policyservice | Caused by: java.net.SocketTimeoutException: Read timed out
17|pic-policyservice | at java.net.SocketInputStream.socketRead0(Native Method)
17|pic-policyservice | at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
17|pic-policyservice | at java.net.SocketInputStream.read(SocketInputStream.java:171)
17|pic-policyservice | at java.net.SocketInputStream.read(SocketInputStream.java:141)
17|pic-policyservice | at org.apache.http.impl.io.SessionInputBufferImpl.streamRead(SessionInputBufferImpl.java:137)
17|pic-policyservice | at org.apache.http.impl.io.SessionInputBufferImpl.fillBuffer(SessionInputBufferImpl.java:153)
17|pic-policyservice | at org.apache.http.impl.io.SessionInputBufferImpl.readLine(SessionInputBufferImpl.java:280)
17|pic-policyservice | at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:138)
17|pic-policyservice | at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:56)
17|pic-policyservice | at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:259)
17|pic-policyservice | at org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:163)
17|pic-policyservice | at org.apache.http.impl.conn.CPoolProxy.receiveResponseHeader(CPoolProxy.java:157)
17|pic-policyservice | at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:273)
17|pic-policyservice | at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:125)
17|pic-policyservice | at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:272)
1.2 DecodeException
Feign 在无法解析 HTTP 响应时会抛出 DecodeException
异常。这通常是因为远程服务返回的数据格式和你的 Feign 客户端期望的格式不匹配。例如,以下代码可能会抛出 DecodeException
:
@FeignClient("remote-service")
public interface RemoteServiceClient {
@RequestMapping(method = RequestMethod.GET, value = "/data")
Data getData();
}
public class Data {
private String value;
// getters and setters...
}
@Autowired
private RemoteServiceClient remoteServiceClient;
public void requestData() {
Data data = remoteServiceClient.getData(); // 这里可能会抛出 DecodeException
}
解决方法:
- 检查远程服务返回的数据格式,确保它和你的 Feign 客户端期望的格式匹配。
- 如果需要,你可以自定义 Feign 的解码器来处理特殊的数据格式。
2. Hystrix 异常
Hystrix 是 Spring Cloud 中用于断路器和服务降级的工具。在使用 Hystrix 时,你可能会遇到一些问题。
2.1 HystrixRuntimeException
Hystrix 在断路器打开或命令执行失败时会抛出 HystrixRuntimeException
异常。这通常是由于远程服务的问题或命令的错误所导致的。例如,以下代码可能会抛出 HystrixRuntimeException
:
@HystrixCommand(fallbackMethod = "fallback")
public String requestData() {
return remoteServiceClient.getData(); // 这里可能会抛出 HystrixRuntimeException
}
public String fallback() {
return "Fallback data";
}
解决方法:
- 检查远程服务的状态和你的 Hystrix 命令。
- 调整 Hystrix 的配置,例如超时设置和断路器阈值。
- 确保你的 Hystrix 命令有一个合适的 fallback 方法。
3. Eureka 异常
Eureka 是 Spring Cloud 中用于服务发现和注册的工具。在使用 Eureka 时,你可能会遇到一些问题。
3.1 UnknownHostException
Eureka 在无法连接到注册中心时会抛出 UnknownHostException
异常。这通常是由于网络问题或注册中心的地址错误所导致的。例如,以下代码可能会抛出 UnknownHostException
:
@SpringBootApplication
@EnableEurekaClient
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args); // 这里可能会抛出 UnknownHostException
}
}
解决方法:
- 检查网络连接和注册中心的地址。
- 确保你的应用有正确的 Eureka 配置。
4. Config Server 异常
Config Server 是 Spring Cloud 中用于集中式配置管理的工具。在使用 Config Server 时,你可能会遇到一些问题。
4.1 NoSuchLabelException
Config Server 在无法找到指定的配置标签时会抛出 NoSuchLabelException
异常。这通常是由于配置仓库中没有对应的标签所导致的。例如,以下代码可能会抛出 NoSuchLabelException
:
@Value("${custom.property}")
private String customProperty;
解决方法:
- 检查你的配置仓库,确保它包含了你请求的标签。
- 确保你的应用有正确的 Config Server 配置。
5. Zuul 异常
Zuul 是 Spring Cloud 中用于路由和过滤的工具。在使用 Zuul 时,你可能会遇到一些问题。
5.1 ZuulException
Zuul 在路由失败或过滤器执行失败时会抛出 ZuulException
异常。这通常是由于网络问题、远程服务的问题或过滤器的错误所导致的。例如,以下代码可能会抛出 ZuulException
:
@SpringBootApplication
@EnableZuulProxy
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args); // 这里可能会抛出 ZuulException
}
}
解决方法:
- 检查网络连接、远程服务的状态和你的 Zuul 过滤器。
- 调整 Zuul 的配置,例如超时设置和路由规则。
这可能是由以下原因导致的:
-
服务端响应过慢:远程服务器在处理你的请求时花费了过多的时间,超过了 Feign 客户端的读取超时时间(默认是1秒)。
-
网络问题:你的服务和远程服务器之间的网络连接可能存在问题,导致数据传输速度过慢。
-
Feign 客户端的配置问题:你的 Feign 客户端的读取超时时间可能被设置得过短,不足以等待远程服务器的响应。
可以尝试以下方法来解决这个问题:
-
调整 Feign 客户端的读取超时时间:你可以增大 Feign 客户端的读取超时时间,给远程服务器更多的响应时间。你可以在 Feign 客户端的配置中设置
readTimeout
属性来实现这一点。 -
优化服务端处理速度:如果可能,你可以尝试优化远程服务器的处理速度,使其能在更短的时间内响应请求。
-
检查并优化网络连接:你可以检查你的服务和远程服务器之间的网络连接,看是否存在可以优化的地方。
-
使用重试机制:Feign 客户端提供了重试机制,你可以配置它在读取超时时自动重试请求。但请注意,这可能会增加服务的负载,只有在你确信远程服务器可以处理更多请求时,才应使用这种方法。
[MySQL]异常
1. JDBC连接异常
JDBC(Java Database Connectivity)是Java中用于连接数据库的一种技术。在使用JDBC连接MySQL时,你可能会遇到一些问题。
1.1 SQLException: No suitable driver found
当JDBC无法找到合适的驱动程序来连接MySQL时,会抛出这个异常。例如,以下代码可能会抛出这个异常:
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "user", "password");
解决方法:
- 确保你已经在项目中正确地引入了MySQL的JDBC驱动库。
- 在调用
DriverManager.getConnection()
之前,确保已经加载了驱动类,例如:
Class.forName("com.mysql.cj.jdbc.Driver");
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "user", "password");
1.2 SQLException: Access denied for user
当使用的用户名和密码无法连接到MySQL时,会抛出这个异常。例如,以下代码可能会抛出这个异常:
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "wrong-user", "wrong-password");
解决方法:
- 检查你的用户名和密码,确保它们是正确的。
- 如果你无法记住正确的用户名和密码,你可能需要联系数据库管理员。
2. SQL语法异常
在使用SQL语句操作MySQL时,如果SQL语句的语法有误,就可能会抛出异常。
2.1 SQLException: You have an error in your SQL syntax
当你的SQL语句语法有误时,会抛出这个异常。例如,以下代码可能会抛出这个异常:
Statement statement = connection.createStatement();
statement.execute("SELECT * FROM");
解决方法:
- 检查你的SQL语句,确保它的语法是正确的。
- 使用SQL工具(如MySQL Workbench)测试你的SQL语句。
3. 数据完整性异常
在操作MySQL数据时,如果违反了数据完整性约束,就可能会抛出异常。
3.1 SQLException: Duplicate entry
当插入的数据违反了唯一性约束时,会抛出这个异常。例如,以下代码可能会抛出这个异常:
Statement statement = connection.createStatement();
statement.execute("INSERT INTO users (id, name) VALUES (1, 'Alice')");
statement.execute("INSERT INTO users (id, name) VALUES (1, 'Bob')");
解决方法:
- 检查你的数据,确保它不违反任何唯一性约束。
- 如果需要插入重复的数据,你可能需要修改表的结构或使用其他的数据处理策略。
4. 并发控制异常
在多线程环境中操作MySQL时,如果没有正确地控制并发,就可能会抛出异常。
4.1 SQLException: Lock wait timeout exceeded
当一个线程等待锁超时时,会抛出这个异常。例如,以下代码可能会抛出这个异常:
// Thread 1
connection.setAutoCommit(false);
Statement statement1 = connection.createStatement();
statement1.execute("UPDATE users SET name = 'Alice' WHERE id = 1");
// Thread 2
Statement statement2 = connection.createStatement();
statement2.execute("UPDATE users SET name = 'Bob' WHERE id = 1");
解决方法:
- 检查你的并发控制策略,确保所有的线程都可以在合理的时间内获取到锁。
- 如果可能,尝试减少锁的使用,例如,通过使用乐观锁或者避免长时间持有锁
[调用外部接口]异常
1. IOException
IOException
是Java处理I/O操作时常见的异常,例如读取文件、网络通信等。在调用公众号接口时,如果网络连接出现问题,就可能会抛出这个异常。
示例代码:
URL url = new URL("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
解决方法:
- 检查网络连接是否正常。
- 检查URL是否正确。
- 使用try-catch语句处理可能的
IOException
。
try {
URL url = new URL("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
} catch (IOException e) {
e.printStackTrace();
}
2. JSONException
JSONException
通常在处理JSON数据时出现问题时抛出,例如JSON格式错误,或者试图访问不存在的JSON字段。
示例代码:
String jsonStr = "{\"access_token\":\"ACCESS_TOKEN\",\"expires_in\":7200}";
JSONObject jsonObject = new JSONObject(jsonStr);
String token = jsonObject.getString("token");
解决方法:
- 检查JSON数据的格式是否正确。
- 检查是否正确地访问了JSON字段。
- 使用try-catch语句处理可能的
JSONException
。
try {
String jsonStr = "{\"access_token\":\"ACCESS_TOKEN\",\"expires_in\":7200}";
JSONObject jsonObject = new JSONObject(jsonStr);
String token = jsonObject.getString("access_token");
} catch (JSONException e) {
e.printStackTrace();
}
3. IllegalArgumentException
IllegalArgumentException
通常在方法接收到非法参数时抛出。
示例代码:
String appid = null;
String secret = "APPSECRET";
URL url = new URL("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + secret);
解决方法:
- 检查参数是否正确。
- 使用try-catch语句处理可能的
IllegalArgumentException
。
try {
String appid = "APPID";
String secret = "APPSECRET";
URL url = new URL("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + secret);
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
4. NoSuchAlgorithmException
NoSuchAlgorithmException
通常在试图获取不存在的加密算法时抛出。
示例代码:
MessageDigest md = MessageDigest.getInstance("NoSuchAlgorithm");
解决方法:
- 检查加密算法的名称是否正确。
- 使用try-catch语句处理可能的
NoSuchAlgorithmException
。
try {
MessageDigest md = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
5. KeyManagementException
KeyManagementException
通常在处理Java密钥管理时出现问题时抛出。
示例代码:
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, null, null);
解决方法:
- 检查SSLContext的初始化是否正确。
- 使用try-catch语句处理可能的
KeyManagementException
。
try {
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, new TrustManager[]{new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain, String authType) {}
public void checkServerTrusted(X509Certificate[] chain, String authType) {}
public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[]{}; }
}}, new SecureRandom());
} catch (KeyManagementException e) {
e.printStackTrace();
}
[文件操作]异常
1. FileNotFoundException
FileNotFoundException
通常在试图打开不存在的文件或目录,或者因为某种原因无法创建文件或目录时抛出。
示例代码:
FileInputStream fis = new FileInputStream("non-exist-file.txt");
解决方法:
- 检查文件路径是否正确。
- 使用try-catch语句处理可能的
FileNotFoundException
。
try {
FileInputStream fis = new FileInputStream("non-exist-file.txt");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
2. IOException
IOException
是Java处理I/O操作时常见的异常,例如读取文件、网络通信等。
示例代码:
FileReader reader = new FileReader("file.txt");
int data = reader.read();
解决方法:
- 检查文件路径、网络连接等是否正确。
- 使用try-catch语句处理可能的
IOException
。
try {
FileReader reader = new FileReader("file.txt");
int data = reader.read();
} catch (IOException e) {
e.printStackTrace();
}
3. SecurityException
SecurityException
通常在试图访问没有权限的文件或目录时抛出。
示例代码:
File file = new File("restricted-file.txt");
file.delete();
解决方法:
- 检查应用程序是否有足够的权限访问文件或目录。
- 使用try-catch语句处理可能的
SecurityException
。
try {
File file = new File("restricted-file.txt");
file.delete();
} catch (SecurityException e) {
e.printStackTrace();
}
4. EOFException
EOFException
通常在试图读取超出文件末尾的数据时抛出。
示例代码:
RandomAccessFile raf = new RandomAccessFile("file.txt", "r");
byte[] b = new byte[1000];
raf.readFully(b);
解决方法:
- 检查文件的大小,确保读取的数据不超过文件的大小。
- 使用try-catch语句处理可能的
EOFException
。
try {
RandomAccessFile raf = new RandomAccessFile("file.txt", "r");
byte[] b = new byte[(int)raf.length()];
raf.readFully(b);
} catch (EOFException e) {
e.printStackTrace();
}
[浏览器]浏览器报错:
Failed to load response data: Request content was evicted from inspector cac:
这个错误常见于开发者使用浏览器的开发者工具(如 Chrome 的 DevTools)进行调试时。这个错误表明请求的内容已经从浏览器的检查器缓存(inspector cache)中移除了。
浏览器的检查器缓存有一个大小限制,当缓存的数据超过这个限制时,旧的数据会被移除。因此,如果你在 DevTools 中看到这个错误,那可能是因为你的请求响应数据太大,或者你在一个会话中发送了太多的请求,导致旧的请求数据被移除。
解决这个问题的一种方法是尝试减少你的请求数据的大小,或者减少在一个会话中发送的请求数量。你也可以考虑使用其他的工具或方法来查看你的请求响应数据,比如使用 Postman 这样的 API 测试工具,或者在你的代码中添加日志来记录请求响应数据。
另外,如果你只是想查看某个特定请求的响应数据,你可以尝试在发送请求后立即查看响应数据,而不是等到后面再去查看,这样可以避免数据被从检查器缓存中移除。
👉 💐🌸 公众号请关注 "果酱桑", 一起学习,一起进步! 🌸💐