常见异常
空指针异常: NullPointerExeption
类型转换异常:ClassCastException
数组下标越界异常:ArrayIndexOutOfBoundsException
数字格式化异常:NuberFormatException
文件找不到异常:FileNotFoundException (编译时)
不支持序列化:NotSerializableException
序列化版本号不一致:InvalidClassException (无效的类异常)
IllegalMonitorStateException:异常发生是由于程序员没有注意notify(),notify(),wait()方法的使用条件,没有真正理解线程同步机制。如果当前的线程不是此对象锁的所有者,却调用该对象的notify(),notify(),wait()方法时抛出该异常。
Wrong number of parameters: expected 6, was given 5
SQL:错误的参数数量:需要6个只传了5个
java.lang.RuntimeException: Unknown column 'id1' in 'field list' Query
表中没有此字段:id1
导入scanner时:
2021.12.29
import jdk.nashorn.internal.parser.Scanner; //错误?
import java.util.Scanner; //正确
辨别用户输入的是否为int,否则重新输入
public static void main(String[] args) {
public static void main(String[] args) {
Scanner scanner; //声明类型,不赋值
int i;
System.out.println("请输入数字:");
while(true){
scanner = new Scanner(System.in); //关键,写在循环内
if(scanner.hasNextInt()){
i = scanner.nextInt();
return; //结束循环
}
System.out.println("输入错误,请重新输入!");
}
}
方法递归调用时:
1.5
错误:该程序始终返回false
//递归查找每一个节点,返回,int 下标
public boolean queryNode(Node node,Object data){
if(node.equals(data)){
return true;
}
if(node.next!=null){
queryNode(node.next,data); // ←——没有return,结果并未成功返回
}
return false;
}
修改后:
//递归查找每一个节点,返回,int 下标
public boolean queryNode(Node node,Object data){
if(node.equals(data)){
return true;
}
if(node.next!=null){
return queryNode(node.next,data); // ←——添加了return
}
return false;
}
原因,举例说明:
public static void main(String[] args) {
//使用递归写一个方法,查找数组中是否存在某个元素
int[] a = {1,2,3,4,5,6};
System.out.println(query(a,6));
}
static int index = 0;
public static boolean query(int[] r,int i){
if(index < r.length){
if(r[index] == i){ //如果找到该元素,返回true
return true;
}
if(r[index] != i){ //没有找到该元素,递归继续查找
index++;
query(r, i); //关键,递归后的结果并没有继续返回,程序将会继续进行
}
}
return false; //以至于程序永远返回false
}
equlse、"=="
如果两个变量进行比对时结果发生错误,请务必检查二者是否为同一类型。
很有可能误将内存地址当做内容进行判断
引用变量不能使用“==”进行判断
使用增强for循环(forach)时:
错误:数组下标越界
for (int i :arr){
System.out.println(arr[i]);
}
正确:
// for (int i :arr){
// System.out.println(i);
// }
xxx instanceof List 判断错误时:
代码没有错误,反序列化时判断对象是否为集合却为false
原因:导入了错误的包,(导入了之前学习笔记中的List类)
总结:以后类名避免使用List、TreeMap、Map等关键字,以免误用
Comparable 实现接口、重写方法后报错
Class 'Student' must either be declared abstract or implement abstract method 'compareTo(T)' in 'Comparable'
原因:没有加入泛型
synchronized
synchronized的位置很重要,如果同步代码块内有循环,在循环结束之前都不会解锁。
锁循环:
锁方法:
将火车售卖程序套用消费者、生产者模式时: IllegalMonitorStateException
官方的解释:抛出该异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器,然而本身没有指定的监视器的线程。
也就是当前的线程不是此对象监视器的所有者。当前线程要锁定该对象之后,才能用锁定的对象执行这些方法,这里需要用到synchronized关键字,锁定哪个对象就用哪个对象来执行notify(), notifyAll(),wait(), wait(long), wait(long, int)操作,否则就会报出IllegalMonitorStateException异常。
此处同步代码块监控的属性为ticket 车票,
而多线程车票售卖程序并未进行修改,synchronized作为修饰符时,监控指定的为this 当时的this为saleThread(车票售卖线程)对象,没有监控ticket,因此无法对ticket使用wait方法。
修改售卖程序时,调用了ticket对象.notify、wait方法,因此出现大片爆红。
修复BUG:
@Test测试单元不能存在有参构造
异常信息: Test class should have exactly one public zero-argument constructor
可以通过配置修改,详见万能青年
IDEA——万能青年操作指南_焰火青年·的博客-CSDN博客
i++ 与 ++i
count++ 为先执行后赋值,所以统计次数依旧是1
统计字母次数
开发提示:可以使用Map,key是字母,value是该字母的次数
效果演示:例如:String str = "Your future depends on your dreams, so go to sleep.";
Mysql & JDBC
XML解析时报红:
发生了非法的反射访问操作
原因:使用了高版本的JDK11.
解决方案:An illegal reflective access operation has occurred_lizz666的博客-CSDN博客
JDBC 增删改查中 占位符不需要'?' 包裹
JavaWeb
CSS样式无法渲染问题:
项目名错误,改为th获取项目名访问
项目文件增加时候缓存问题:
如果还是不行,直接把源码复制到项目路径
web文件夹在,web项目图标没了,重命名导致异常,手动添加Web
之后可能需要更新
项目在,war包不见了 — 手动导入
注:之后需要在Tomcat内重新配置
Thymeleaf —— 500报错,地址出问题
1.如果500报错,前缀 后缀没有问题,就是逻辑视图问题,请检查web.xml配置文件与视图基础类 对象中的参数名是否匹配,前后缀与processTemplate()传入的参数是否正确。
2.如果出现其他未知问题,可能是Toncat、Jar包、jdk版本兼容性问题。
Vue引入错误 :Uncaught ReferenceError: Vue is not defined
产生原因:没有正确引入vue.js文件
解决方案:
1.检查自己引入的文件的路径是否书写正确
2.尝试重构,服务器端文件没有载入Vue
书城六:由于Fliter 配置路径导致无法重定向到自己的404页面
原因:因为页面跳转时为了被异常Filter 捕获加入了protected,导致地址编号,Thmeleaf无法成功解析 。
解决:把error移出WEB-INF,使用重定向的方式跳转404页面。(WEB-INF内文件只能请求转发)
DBUtil ,解析到了对象,但属性值全部为null
原因:实体对象getset错误使用了Builder方式自动生成,导致BeanListHandler 无法解析?
(实体类时用了一下,忘记修改回来)
修改后:
Maven
web.xml还在,Maven消失了
选中pom.xml 配置文件,添加作为Maven的项目
Maven pom.xml图标变成了灰色 或 添加了依赖但不起作用
原因:操作的时候不小心点到了ignore pom.xml
即pom.xml文件被设置在maven忽略文件清单中
解决方案:
电影表单:首页访问500,web.xml配置总控制器没问题,springmvc.xml视图控制器没问题,jar包没问题
An error happened during template parsing (template: "ServletContext resource [/WEB-INF/templates/portal.html]")
Could not open ServletContext resource [/WEB-INF/templates/portal.html]
最后发现templates,文件夹少了个l
导致Thymeleaf视图解析失败!!!!!@!@!!!
idea启动时,显示8080端口被占用
1、win+R打开window窗口,执行命令:netstat -ano
1、window+R,输入cmd,回车启动
2、输入netstat -ano | findstr 8080 (如果是其他端口就改一下)
3、输入taskkill /pid 19112 /f (这个19112是对应上一条语句搜索出来的PID)
2、执行命令:tasklist
根据PID确定是哪一个进程
3、通过任务管理器,终止进程
4、重启tomcat
Maven 设置编码问题
在父项目版本管理中加入
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
网页404
检查 命名、注解、配置文件扫描包、端口、ip、视图前后缀配置!!
Git push报错: error: failed to push some refs to ‘https://gitee.com/
在 git 执行命令git push origin master时,报错error: failed to push some refs to ‘https://gitee.com/
根本原因是远程仓库和本地仓库内容不同,将远程仓库中不同的内容pull到本地,就好了。
比如,我是新建了一个远程仓库,准备把本地内容上传时,忘记把远程仓库的redme.md文件同步出错的。
解决方法:
git pull --rebase origin master
将redme.md文件同步到本地,然后再次执行git push origin master就好了
类型不匹配问题 Required type:Role Provided:Rule!!
没有看清,u和o。以后遇到这种问题,首先排查是否导错包!名字是否错误!找不同!!
然后发现service层也错了!全错了!
503:映射重复
Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'roleController' method
com.atguigu.controller.RoleController#index(HttpServletRequest, Map) 批量修改时注意,选择注解修改这里也是
org.springframework.web.servlet.DispatcherServlet' is not assignable to 'javax.servlet.Servlet,jakarta.servlet.Servlet'
IDEA SpringMVC web.xml报错 org.springframework.web.servlet.DispatcherServlet' is not assignable to javax.servlet.Servlet
解决方法:ProjectStructure-Dependencies-右上角绿色小加号-添加Tomcat的包即可
Dubbo,远程服务类,空指针
systemctl status NetworkManager 应该是active
systemctl disable NetworkManager 下次开机不会自动开启,现在没有关
systemctl stop NetworkManager 现在是开启状态,现在就关掉
systemctl start network.service 现在就开启network网络服务
reboot 重新启动
jetty 启动失败 [WARNING] Failed startup of context o.e.j.m.p.JettyWebAppContext@7f572c37{/, (学习Dubbo时)
报错:
正确的:
判断:Jar包问题,尝试清理仓库重新下载,clean,重新安装。
解决:引入Jar包顺序导致的!把dubbo相关的五个jar包移到下边,启动成功!
原理:未知。maven依赖添加顺序会影响????dubbo包含了spring某些jar包引起冲突??
Linux ip错了??
Mysql 远程访问失败
Nacos 集群部署时,持久化到Windows的本地Mysql,无法建立连接!
问题:ip、端口、用户名、密码全都正确,Mysql依旧无法远程访问!
org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.
原因:root用户没有远程访问权限
解决:
1. 查看是否能远程调用:
mysql -u root -p -h 192.168.68.1
2. 不能访问,进行设置
mysql -u root -p登录数据库,use mysql 使用数据库
下面语句运行与mysql5.7及以前版本
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
mysql 8版本执行下面语句
#Mysql8 创建用户
CREATE USER 'root'@'%' IDENTIFIED BY '你的密码';
#进行授权
grant all privileges on *.* to 'root'@'%' ;
#刷新用户权限
FLUSH PRIVILEGES;
3. 执行查询,查看数据库当前有访问权限的信息 (或图形化界面查看)
SELECT User,Host FROM user;
4. 再次尝试远程调用,成功
mysql -u root -p -h 192.168.68.1
参考:MySQL允许root远程登录_小gu的博客-CSDN博客_mysql允许root远程连接
properties 配置文件中文注解??乱码
idea - tomcat控制台乱码 - 尝试在idea中设置 utf-8
Maven 父依赖 爆红,依赖始终下载不下来
原因:父依赖只是版本控制,由于子模块并未导入,所以依赖不会进行下载?
Autowired、OpenFeign爆红
请求https 报错 java.security.cert.CertificateException: No subject alternative DNS name matching hjy-frs.dev.wisdomin.cn found.
证书过期了,找运维吧
端口被占用
The Tomcat connector configured to listen on port 8089 failed to start. The port may already be in use or the connector may be misconfigured.
打开cmd命令行
Cannot call getInputStream(), getReader() already called
原因:request输入流只能被读取一次,再次获取会返回-1,拦截器中如何获取requestBody?
拦截器读取参数后,controller会报错:Cannot call getInputStream(), getReader() already called
解决:
1. 辅助工具类(读取流)
/**
* description:http辅助工具类
* @Date 2023/12/22 16:02
* @Author by:rty
*/
public class HttpHelper {
/**
* description:从request获取body的json数据
*
* @param
* @return
*/
public static String getBodyString(ServletRequest request) {
StringBuilder sb = new StringBuilder();
ServletInputStream inputStream = null;
BufferedReader reader = null;
try {
inputStream = request.getInputStream();
reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
String line = "";
while ((line = reader.readLine()) != null) {
sb.append(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return sb.toString();
}
/**
* description:从request获取body的json数据,并格式化成map形式
*
* @param
* @return
*/
@SuppressWarnings("all")
public static Map<String, Object> getBodyMap(ServletRequest request) {
Map<String, Object> params = new HashMap<>();
String bodyString = getBodyString(request);
if (StringUtil.isNotNullToObj(bodyString)) {
params = JSON.parseObject(bodyString, Map.class);
}
return params;
}
}
2. 包装body,处理类
/**
* 解决: request.getInputStream()只能读取一次的问题
* @Date 2023/12/22 15:47
* @Author by:rty
*/
public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper {
private byte[] body;
public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
super(request);
// 将body数据存储起来
body = HttpHelper.getBodyString(request).getBytes(StandardCharsets.UTF_8);
}
@Override
public BufferedReader getReader() throws IOException {
return new BufferedReader(new InputStreamReader(getInputStream()));
}
@Override
public ServletInputStream getInputStream() throws IOException {
final ByteArrayInputStream bais = new ByteArrayInputStream(body);
return new ServletInputStream() {
@Override
public int read() throws IOException {
return bais.read();
}
@Override
public boolean isFinished() {
return false;
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener readListener) {
}
};
}
public void setInputStream(byte[] body) {
this.body = body;
}
}
3. 过滤器
/**
* 解决: request.getInputStream()只能读取一次的问题
* @Date 2023/12/22 15:31
* @Author by:rty
*/
@Order(3)
@Component
public class RequestWrapperFilter implements Filter {
private Logger log = LoggerFactory.getLogger(RequestWrapperFilter.class);
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException
, IOException {
ServletRequest requestWrapper = null;
if (request instanceof HttpServletRequest) {
requestWrapper = new BodyReaderHttpServletRequestWrapper((HttpServletRequest) request);
}
if (null == requestWrapper) {
log.error("过滤器包装request失败 返回原来的request");
chain.doFilter(request, response);
} else {
log.info("过滤器包装request成功");
chain.doFilter(requestWrapper, response);
}
}
@Override
public void destroy() {
}
}
启动类中加入过滤器
@SpringBootApplication(scanBasePackages = "cn.qtone")
@MapperScan("cn.qtone.dao")
public class VideoPhoneApplication implements WebMvcConfigurer
{
@Autowired
private CutOverInterceptor cutOverInterceptor;
public static void main(String args[])
{
SpringApplication.run(VideoPhoneApplication.class, args);
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(cutOverInterceptor).addPathPatterns("/**");
}
}