Java开发常见异常|错误

常见异常

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

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. 辅助工具类(读取流)


/**
 * 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("/**");
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值