当前位置:   article > 正文

Java开发常见异常|错误_org.springframework.web.servlet.dispatcherservlet'

org.springframework.web.servlet.dispatcherservlet' is not assignable to 'jav

常见异常

空指针异常: 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

  1. import jdk.nashorn.internal.parser.Scanner; //错误?
  2. import java.util.Scanner; //正确

辨别用户输入的是否为int,否则重新输入

  1. public static void main(String[] args) {
  2. public static void main(String[] args) {
  3. Scanner scanner; //声明类型,不赋值
  4. int i;
  5. System.out.println("请输入数字:");
  6. while(true){
  7. scanner = new Scanner(System.in); //关键,写在循环内
  8. if(scanner.hasNextInt()){
  9. i = scanner.nextInt();
  10. return; //结束循环
  11. }
  12. System.out.println("输入错误,请重新输入!");
  13. }
  14. }

方法递归调用时:

1.5

错误:该程序始终返回false

  1. //递归查找每一个节点,返回,int 下标
  2. public boolean queryNode(Node node,Object data){
  3. if(node.equals(data)){
  4. return true;
  5. }
  6. if(node.next!=null){
  7. queryNode(node.next,data); // ←——没有return,结果并未成功返回
  8. }
  9. return false;
  10. }

修改后:

  1. //递归查找每一个节点,返回,int 下标
  2. public boolean queryNode(Node node,Object data){
  3. if(node.equals(data)){
  4. return true;
  5. }
  6. if(node.next!=null){
  7. return queryNode(node.next,data); // ←——添加了return
  8. }
  9. return false;
  10. }

原因,举例说明:

  1. public static void main(String[] args) {
  2. //使用递归写一个方法,查找数组中是否存在某个元素
  3. int[] a = {1,2,3,4,5,6};
  4. System.out.println(query(a,6));
  5. }
  6. static int index = 0;
  7. public static boolean query(int[] r,int i){
  8. if(index < r.length){
  9. if(r[index] == i){ //如果找到该元素,返回true
  10. return true;
  11. }
  12. if(r[index] != i){ //没有找到该元素,递归继续查找
  13. index++;
  14. query(r, i); //关键,递归后的结果并没有继续返回,程序将会继续进行
  15. }
  16. }
  17. return false; //以至于程序永远返回false
  18. }

equlse、"=="

如果两个变量进行比对时结果发生错误,请务必检查二者是否为同一类型。

很有可能误将内存地址当做内容进行判断

引用变量不能使用“==”进行判断

使用增强for循环(forach)时:

错误:数组下标越界

  1. for (int i :arr){
  2. System.out.println(arr[i]);
  3. }

正确:

  1. // for (int i :arr){
  2. // System.out.println(i);
  3. // }

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版本执行下面语句 

  1. #Mysql8 创建用户
  2. CREATE USER 'root'@'%' IDENTIFIED BY '你的密码';
  3. #进行授权
  4. grant all privileges on *.* to 'root'@'%' ;
  5. #刷新用户权限
  6. FLUSH PRIVILEGES;

3. 执行查询,查看数据库当前有访问权限的信息 (或图形化界面查看) 

SELECT User,Host FROM user;

4. 再次尝试远程调用,成功

mysql -u root -p -h 192.168.68.1 

SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconn_焰火青年·的博客-CSDN博客

参考: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.

  1. 【netstat -aon|findstr “端口”】 (最后一列为XXX 进程id)

  2. 【tasklist|findstr “XXX”】

  3. taskkill /f /pid XXX

打开cmd命令行

Cannot call getInputStream(), getReader() already called

原因:request输入流只能被读取一次,再次获取会返回-1,拦截器中如何获取requestBody?

拦截器读取参数后,controller会报错:Cannot call getInputStream(), getReader() already called

解决:

1. 辅助工具类(读取流)

  1. /**
  2. * description:http辅助工具类
  3. * @Date 2023/12/22 16:02
  4. * @Author by:rty
  5. */
  6. public class HttpHelper {
  7. /**
  8. * description:从request获取body的json数据
  9. *
  10. * @param
  11. * @return
  12. */
  13. public static String getBodyString(ServletRequest request) {
  14. StringBuilder sb = new StringBuilder();
  15. ServletInputStream inputStream = null;
  16. BufferedReader reader = null;
  17. try {
  18. inputStream = request.getInputStream();
  19. reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
  20. String line = "";
  21. while ((line = reader.readLine()) != null) {
  22. sb.append(line);
  23. }
  24. } catch (IOException e) {
  25. e.printStackTrace();
  26. } finally {
  27. if (inputStream != null) {
  28. try {
  29. inputStream.close();
  30. } catch (IOException e) {
  31. e.printStackTrace();
  32. }
  33. }
  34. if (reader != null) {
  35. try {
  36. reader.close();
  37. } catch (IOException e) {
  38. e.printStackTrace();
  39. }
  40. }
  41. }
  42. return sb.toString();
  43. }
  44. /**
  45. * description:从request获取body的json数据,并格式化成map形式
  46. *
  47. * @param
  48. * @return
  49. */
  50. @SuppressWarnings("all")
  51. public static Map<String, Object> getBodyMap(ServletRequest request) {
  52. Map<String, Object> params = new HashMap<>();
  53. String bodyString = getBodyString(request);
  54. if (StringUtil.isNotNullToObj(bodyString)) {
  55. params = JSON.parseObject(bodyString, Map.class);
  56. }
  57. return params;
  58. }
  59. }

2. 包装body,处理类

  1. /**
  2. * 解决: request.getInputStream()只能读取一次的问题
  3. * @Date 2023/12/22 15:47
  4. * @Author by:rty
  5. */
  6. public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper {
  7. private byte[] body;
  8. public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
  9. super(request);
  10. // 将body数据存储起来
  11. body = HttpHelper.getBodyString(request).getBytes(StandardCharsets.UTF_8);
  12. }
  13. @Override
  14. public BufferedReader getReader() throws IOException {
  15. return new BufferedReader(new InputStreamReader(getInputStream()));
  16. }
  17. @Override
  18. public ServletInputStream getInputStream() throws IOException {
  19. final ByteArrayInputStream bais = new ByteArrayInputStream(body);
  20. return new ServletInputStream() {
  21. @Override
  22. public int read() throws IOException {
  23. return bais.read();
  24. }
  25. @Override
  26. public boolean isFinished() {
  27. return false;
  28. }
  29. @Override
  30. public boolean isReady() {
  31. return false;
  32. }
  33. @Override
  34. public void setReadListener(ReadListener readListener) {
  35. }
  36. };
  37. }
  38. public void setInputStream(byte[] body) {
  39. this.body = body;
  40. }
  41. }

3. 过滤器

  1. /**
  2. * 解决: request.getInputStream()只能读取一次的问题
  3. * @Date 2023/12/22 15:31
  4. * @Author by:rty
  5. */
  6. @Order(3)
  7. @Component
  8. public class RequestWrapperFilter implements Filter {
  9. private Logger log = LoggerFactory.getLogger(RequestWrapperFilter.class);
  10. @Override
  11. public void init(FilterConfig filterConfig) throws ServletException {
  12. }
  13. @Override
  14. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException
  15. , IOException {
  16. ServletRequest requestWrapper = null;
  17. if (request instanceof HttpServletRequest) {
  18. requestWrapper = new BodyReaderHttpServletRequestWrapper((HttpServletRequest) request);
  19. }
  20. if (null == requestWrapper) {
  21. log.error("过滤器包装request失败 返回原来的request");
  22. chain.doFilter(request, response);
  23. } else {
  24. log.info("过滤器包装request成功");
  25. chain.doFilter(requestWrapper, response);
  26. }
  27. }
  28. @Override
  29. public void destroy() {
  30. }
  31. }
  1. 启动类中加入过滤器
  2. @SpringBootApplication(scanBasePackages = "cn.qtone")
  3. @MapperScan("cn.qtone.dao")
  4. public class VideoPhoneApplication implements WebMvcConfigurer
  5. {
  6. @Autowired
  7. private CutOverInterceptor cutOverInterceptor;
  8. public static void main(String args[])
  9. {
  10. SpringApplication.run(VideoPhoneApplication.class, args);
  11. }
  12. @Override
  13. public void addInterceptors(InterceptorRegistry registry) {
  14. registry.addInterceptor(cutOverInterceptor).addPathPatterns("/**");
  15. }
  16. }

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号