Java 异常 + Error

目录

一、Java异常

1、Java异常1

1、Log异常

2、Spring Boot 异常

3、@Autowired不生效

4、@PostConstruct

5、Idea连接Mysql报错

6、Intellij IDEA 提示Cannot resolve symbol 'log' 的解决方法

7、SLF4J: Class path contains multiple SLF4J bindings.

8、Null pointer access: The variable al can only be null at this location问题的解决

9、ClassNotFoundException

java.lang.ClassNotFoundException: org.apache.log4j.Logger

10、java -jar 解决配置文件乱码问题

2、Java异常2

1、SLF4J: Class path contains multiple SLF4J bindings.

2、java.lang.ArrayIndexOutOfBoundsException

3、NOAUTH Authentication required

4、RabbitMQ - access to vhost 'XXX' refused for user 'guest'

5、org.apache.poi.openxml4j.exceptions.invalidformatexception: package should contain a content type part [m1.13]

6、使用EasyExcel报错NoClassDefFoundError: org/apache/poi/util/TempFileCreationStrategy

7、JDK21运行报错java: java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field 'com.sun.tools.javac.tree.JCTree qualid'

8、Caused by: java.net.SocketException: No buffer space available (maximum connections reached?)


一、Java异常

1、Java异常1

1、Log异常

报错信息:The type org.apache.log4j.Logger cannot be resolved.It is indirectly referenced from required .class

问题原因:循环依赖log4j。

jar包中:.class 文件中引入import org.apache.log4j.Logger;

工程中引入:import org.slf4j.Logger;slf4j依赖于slf4j-log412,后者又依赖于log4j。

2、Spring Boot 异常

报错信息:Parameter 0 of constructor in com.test.service.impl.XXXServiceImpl required a bean of type 'java.lang.String' that could not be found.

Action:

Consider defining a bean of type 'java.lang.String' in your configuration.

报错信息是由于XXXServiceImpl中定义了含参数的构造函数,Spring自动构造和注入时未为该Bean传入参数,引起报错。

解决方案:

1.定义Config类

@Configuration
public class XXXConfig {
    @Bean
    XXXService xXXService(){
        return new XXXServiceImpl("test");
    }
}

2.修改XXXServiceImpl

//@Service
public class XXXServiceImpl implements XXXService {
    @Autowired
    private XXXDao xXXDao;
 
    private String test;
 
    public XXXServiceImpl(String str) {
        test = str;
    }
...
}

注意,其中的@Service(或者@Component、@Controller、@Repository、@Configuration这些用来定义Bean的注解)注解一定要注释掉或者删掉,这样才能够让自己手动构建的Bean起作用

3、@Autowired不生效

1.如果一个类没有加注解如@component, @controller, @service等扫描这个类到容器中
在类中的变量加@Autowired注解无法生效。
2.因为如果一个类new对象生成的,那么这个类就不归spring容器管理,IOC等spring的功能也就无法使用了。

@Autowired是通过spring容器自动创建对象属性方法,@Service注解告诉spring这是Service类,才能实现注入,而我的demo类并没有使用注解交给spring管理,导致无法依赖注入,@Component注解刚好可以用于无法定义属于什么类型,但又想交给spring管理时使用。

静态工具类中使用@Autowired的方法

在Spring Boot想把方法提取出来,还需要是一个JPA访问数据库,通过@Autowired导入repository,操作发现报了NullPointerException,发现导入的repository为null,分析原因发现Spring不支持依赖注入static静态变量,静态变量/类变量不是对象的属性而是一个类的属性,spring则是基于对象层面上的依赖注入。

解决方案:

提取共通方法:

@Component
public class CommonUtils {
    private static final Logger logger = LoggerFactory.getLogger(CommonUtils .class);
    private static CommonUtils utils;

    @Autowired
    private TestRepository testRepository ;

    @PostConstruct
    public void init() {
        utils = this;
    }

    public static List<TestEntity> getTestEntityList(Integer id) {
        List<TestEntity> list= utils.testRepository.findAll();
        return list;
    }

}

Repository

@Repository
public interface TestRepository extends JpaRepository<TestEntity,long>{

}

TestEntity 省略

4、@PostConstruct

1、从Java EE5规范开始,Servlet中增加了两个影响Servlet生命周期的注解,@PostConstruct和@PreDestroy,这两个注解被用来修饰一个非静态的void()方法。写法有如下两种方式:

@PostConstruct
public void init(){

}
public @PostConstruct void init(){}

被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。PreDestroy()方法在destroy()方法执行之后执行

执行顺序:spring中Constructor→→@Autowired→→@PostConstruct的顺序

5、Idea连接Mysql报错

报错如下:

 Tue Nov 09 21:15:01 CST 2021 WARN: Establishing SSL connection without server's identity
 verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+
 requirements SSL connection must be established by default if explicit option isn't set.
 For compliance with existing applications not using SSL the verifyServerCertificate
 property is set to 'false'. You need either to explicitly disable SSL by setting
 useSSL=false, or set useSSL=true and provide truststore for server certificate
 verification.

翻译:

        不建议在没有服务器身份验证的情况下建立SSL连接,根据MySQL 5.5.45+、5.6.26+和5.7.6+的要求,如果没有设置显式选项,则必须默认建立SSL连接。为了符合不使用SSL的现有应用程序,verifyServerCertificate属性被设置为“false”。您需要通过设置useSSL=false显式禁用SSL,或者设置useSSL=true并为服务器证书验证提供信任存储。

解决方式:

数据库连接:jdbc:mysql://localhost:3306/testdb?useSSL=false

6、Intellij IDEA 提示Cannot resolve symbol 'log' 的解决方法

IDEA中没安装lombok插件的原因

安装lombok插件

7、SLF4J: Class path contains multiple SLF4J bindings.

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/D:/repo/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/D:/repo/org/slf4j/slf4j-log4j12/1.7.29/slf4j-log4j12-1.7.29.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]

SLF4Jjar包冲突: Class path contains multiple SLF4J bindings.

在dependency中加入下面排除解决报错
<exclusions>
    <exclusion>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
    </exclusion>
</exclusions>

8、Null pointer access: The variable al can only be null at this location问题的解决

问题分析:al.add();下出现警告信息Null pointer access: The variable al can only be null at this location

解决方案:

ArrayList<String> sList=null 改为:ArrayList<String> sList=new ArrayList<String>();

9、ClassNotFoundException

ClassNotFoundException的产生原因:
Java支持使用Class.forName方法来动态地加载类,任意一个类的类名如果被作为参数传递给这个方法都将导致该类被加载到JVM内存中,如果这个类在类路径中没有被找到,那么此时就会在运行时抛出ClassNotFoundException异常。

ClassNotFoundException解决
解决该问题需要确保所需的类连同它依赖的包存在于类路径中,常见问题在于类名书写错误。
另外还有一个导致ClassNotFoundException的原因就是:当一个类已经某个类加载器加载到内存中了,此时另一个类加载器又尝试着动态地从同一个包中加载这个类。通过控制动态类加载过程,可以避免上述情况发生。

pom依赖中未引入jar包等。

java.lang.ClassNotFoundException: org.apache.log4j.Logger

未引入log4j.jar包。

10、java -jar 解决配置文件乱码问题

java项目以jar包的方式启动时,application.yml中或者application.properties文件中
难免会有一些中文出现,如果这个时候我们直接以java -jar jar包名称启动时,虽然启动能
够成功,但是在加载配置文件时会出现意想不到的问题,这个时候我们只要改下启动jar包的命令即可
//增加-Dfile.encoding=utf-8参数
java -Dfile.encoding=utf-8 -jar xxx.jar

2、Java异常2

1、SLF4J: Class path contains multiple SLF4J bindings.

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/xxxxxx/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/xxxxx/.m2/repository/org/apache/logging/log4j/log4j-slf4j-impl/2.12.1/log4j-slf4j-impl-2.12.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]

这种异常好多种

org/slf4j/slf4j-jdk14/1.7.30/slf4j-jdk14-1.7.30
org/slf4j/slf4j-log4j12/1.7.30/slf4j-log4j12-1.7.30
ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3

寻找pom依赖关系

Intellij IDEA Terminal终端--> 在pom.xml 目录执行 mvn dependency:tree
会输出依赖关系

在 pom.xml 排除多余的这个jar

<dependency>
    <groupId>xxxx</groupId>
    <artifactId>xxxxx</artifactId>
    <version>xxxx</version>
    <exclusions>
        <exclusion>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>xxxx</groupId>
    <artifactId>xxxxx</artifactId>
    <version>xxxx</version>
    <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </exclusion>
    </exclusions>
</dependency>

2、java.lang.ArrayIndexOutOfBoundsException

An exception occurred: java.lang.ArrayIndexOutOfBoundsException
数组位置算错误,数组越界异常

3、NOAUTH Authentication required

NOAUTH Authentication required
微服务启动报如上错误
解决方向:
1、微服务需要连接redis服务端,配置文件中未配置redis密码等信息
2、使用nacos,但是未添加此项目的配置文件,即:未读取到redis配置
3、看redis是否能单独连接上

4、RabbitMQ - access to vhost 'XXX' refused for user 'guest'

RabbitMQ - access to vhost 'XXX' refused for user 'guest'

rabbitmq 用户权限相关的问题
vhost添加?

5、org.apache.poi.openxml4j.exceptions.invalidformatexception: package should contain a content type part [m1.13]

要解决这个问题,您可以尝试以下几个步骤:
1、确认您正在处理的文件格式是Apache POI库支持的格式。您可以查看官方文档以获取更多信息。
2、确认您的代码中已经正确地设置了Apache POI库。如果您没有正确地设置库,则可能会导致无法正确处理文件。
3、确认文件没有被损坏。您可以尝试使用其他软件打开文件以确认文件是否可读。

6、使用EasyExcel报错NoClassDefFoundError: org/apache/poi/util/TempFileCreationStrategy

我遇到解决方式是即导入poi依赖又导入easyexcel,easyexcel中在poi基础上进行封装,版本有冲突。我把poi依赖注释掉,问题解决。

7、JDK21运行报错java: java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field 'com.sun.tools.javac.tree.JCTree qualid'

lombok版本兼容性的问题,更新新版 lombok即可

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.30</version>
</dependency>

8、Caused by: java.net.SocketException: No buffer space available (maximum connections reached?)

大同小异,我是连接mongodb跑程序12小时左右,程序会崩掉报此错误

翻译:引起原因:java.net.SocketException:没有可用的缓冲区空间(达到最大连接数?)

解决方案:关闭连接,程序中肯定有连接未关闭

执行命令:netstat -ano (windows下查看当前所有的连接),发现大量的TCP连接,如图

打开任务管理器,查看PID为60204的进程,发现是个Java进程,如图:

参考文章:java.net.SocketException: No buffer space available (maximum connections reached?): connect

9、java.lang.ClassNotFoundException:com.google.common.collect.SingletonImmutableList

有依赖引用了com.google.guava,找到哪个依赖引用了排除此依赖

<dependency>
    <groupId>xxx</groupId>
    <artifactId>xxxx</artifactId>
    <exclusions>
        <exclusion>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
        </exclusion>
    </exclusions>
</dependency>

Go 异常 + Error

Web 异常 + Error

Sql 异常 + Error

懂与不懂都是收获。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杀神lwz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值