Java开发问题汇总

标签: 无 分类: 未分类 创建时间:2023-07-06 11:55:08 更新时间:2024-11-15 10:49:43

2.Could not load native libraries

3.Cannot resolve method ‘iterator’ in ‘Map’

在一个 Map 对象上调用 iterator() 方法,提示这个问题。

4.Non-static method cannot be referenced from a static context

这个问题真是非常的奇怪,就是在idea中编写lambda表达式,总是无法实现类型推断,例如下面的代码,理论上这么写应该是已经知道了 VFielaName,vField 的类型,但是在idea中就是会报错。vField 变成了 Object 类型,没有 .label 属性。

1
2
3
4
5
vLayer.fields.forEach((vFieldName, vField) -> {
if (vField.label != null && !vField.geometry) {
fields.add(vFieldName);
}
});

像下面这种代码,Map.Entry::getKey, Map.Entry::getValue 就会报:“Map.Entry::getKey, Map.Entry::getValue” 错误。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
this.layerGeometryTypeMapping.forEach((layerId, geometryTypes) -> {
VLayer source = (VLayer)this.layers.get(layerId);
Map filterFields = (Map)source.fields.entrySet().stream().filter((entry) -> {
return ((VField)entry.getValue()).label != null;
}).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
geometryTypes.forEach((layerName, geometryType) -> {
VLayer target = new VLayer();
target.id = layerName;
target.minzoom = source.minzoom;
target.maxzoom = source.maxzoom;
target.fields = filterFields;
target.geometrytype = geometryType;
vLayers.add(target);
});
});

【解决方案】
其实我是从源头解决这个问题,比如 layerGeometryTypeMapping 这是是map,那就直接写成 Map<String,Integer> t, 而不是 Map t。

参考文章:
1.Non-static method cannot be referenced from a static context in java 8 streams 这里说是 idea 的一个bug,已经在2017版本解决了,我现在使用的是2023版本,不应该出现这个问题啊。
2.idea使用1.8版本jdk但是使用lambda表达式报错 基本上都是这个套路,就是设置 Moules 的 Language level。
3.Intellij IDEA使用 lambda表达式报错-source1.5中不支持lambda表达式
4.JDK1.8新特性(三):Lambda表达式,让你爱不释手
5.idea中项目启动 出现不兼容的类型,无法推断类型变量问题 设置了 Project Stucture 和 SDKs 两个。

5.找不到或无法加载主类 Application

在使用 maven-jar-plugin 插件打包后,显示找不到主类,但是我的jar包下明明有 Application.class。

【解决方案】
最后的解决方案就是修改配置,注意 “/C:/Program%20Files%20(x86)/ArcGIS/Desktop10.2/java/lib/arcobjects.jar”,不能写为:“C:/Program Files (x86)/ArcGIS/Desktop10.2/java/lib/arcobjects.jar” 否则就会出现问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>Application</mainClass>
</manifest>
<manifestEntries>
<Class-Path>. /C:/Program%20Files%20(x86)/ArcGIS/Desktop10.2/java/lib/arcobjects.jar lib/jts-core-1.15.0.jar lib/gt-geojson-20.5.jar</Class-Path>
</manifestEntries>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.10</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
参考文章:
1.IDEA 错误 找不到或无法加载主类(完美解决)
2.Maven maven-jar-plugin
3.maven pom 配置 学习笔记(五)之 maven-jar-plugin
4.maven 打包jar 找不到主类 主类不在 jar 包的根目录下:如果主类不在 jar 包的根目录下,可能会出现找不到主类的错误。请确保主类在 jar 包的根目录下,或者在 pom.xml 中配置正确的路径。
5.Manifest Entries
6.Maven 打包可执行 JAR
7.Maven工程产生Jar时Main-Class和Class-Path的配置文件 由于某些原因,如果maven生成的MANIFEST.MF中的Class-Path的内容缺少一些内容,比如当前执行目录(.),那么可以通过上面manifestEntries的方式增加进来

6.SLF4J: No SLF4J providers were found

我用的是 2.0.7 的版本。

【解决方案】
将pom.xml中的slf4j-api的版本改成1.7.26

7.SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”

在执行 jar 的时候,出现了这个问题,我很纳闷啊:“SLF4J: Defaulting to no-operation (NOP) logger implementation”

【解决方案】
添加了 slf4j-simple 配置。 最后的解决方法,就是使用了下面的三个依赖。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>

8.PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

在我向一个https域名推送数据的时候,出现了这个问题。我在浏览器中打开这个 https 链接,显示的就是不信任的证书。

【解决方案】
解决方案就是创建一个信任任何证书的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
* 创建一个可以任意信任的 ssl 证书
*/
public static CloseableHttpClient createSSLClientDefault() {
try {
SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
// 信任所有证书
public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
return true;
}

}).build();
SSLConnectionSocketFactory sslFactory = new SSLConnectionSocketFactory(sslContext);
return HttpClients.custom().setSSLSocketFactory(sslFactory).build();
} catch (Exception e) {
logger.error("处理Https证书异常", e);
}
return HttpClients.createDefault();
}

// 将 CloseableHttpClient client = HttpClients.createDefault(); 改为
CloseableHttpClient client = createSSLClientDefault();

9. Type definition error: [simple type, class org.joda.time.DateTime]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Joda date/time type org.joda.time.DateTime not supported by default: add Module “com.fasterxml.jackson.datatype:jackson-datatype-joda” to enable handling

在将 yyyy-MM-DD HH:mm:ss 格式的时间转换成java DateTime类型的时间时出现了问题。

【解决方案】
在实体类注解上增加

1
@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")

10.Java 8 date/time type java.time.LocalDateTime not supported by default

(1) 引入依赖

1
2
3
4
5
6
<!-- support for "Java 8 Dates" -->
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>${jackson.version}</version>
</dependency>

(2) 注入 JavaTimeMoudle

1
2
3
4
5
6
7
8
9
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;


ObjectMapper om = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());

// convert object to json
String result = om.writeValueAsString(book);

11.Unable to find a single main class from the following candidates

我在一个包里面引用了另外一个包里面的内容,结果导致打包的时候出现了错误。

【解决方案】
(1) 我发现了是因为 io.agora.sample.AccessTokenInspector, io.agora.sample.ChatTokenBuilder2Sample 等代码中,包含了 main 方法,需要删除。
(2) 还需要删除自模块pom.xml中的 spring-boot-maven-plugin

参考文章:
1.解决Unable to find a single main class from the following candidates
2.spring boot打包时Unable to find a single main class的解决方法
3.Spring Boot Maven Plugin打包异常及三种解决方法:Unable to find main class 项目内有两个带有main方法的类并且都使用了@SpringBootApplication注解(或者另一种情形:你有两个main方法并且所在类都没有使用@SpringBootApplication注解)
4.maven package异常repackage failed: Unable to find main class 工具类,不需要main入口,可以直接删除pom.xml中的build标签;如果是子模块可以使用skip跳过spring打包

12.-source 8 中不支持 ‘<>’ 具有匿名的内部类

主要原因就是在 pom.xml 指定了 jdk 版本。

1
2
3
4
5
6
7
8
9
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>

【解决方案】
把1.8改成1.9就行了。

13.no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator

【解决方案】
然后进入dto类中发现,代码中自定义了有参数的构造函数,导致默认无参构造函数失效,需要手动添加无参构造函数,用于对象的json序列化。

参考文章:
1.参数json序列化报错: (no Creators, like default construct, exist): cannot deserialize from Object value (no
2.反序列化报错:cannot deserialize from Object value (no delegate- or property-based Creator) 因为Json反序列化需要一个无参构造器。正常情况下JVM会默认给类加个无参构造器,我遇到这个场景是因为我主动给这个类加了一个有参的构造器,这就导致JVM不会再给这个类加无参的构造器了。所以才会报这个错。手动添加一个无参构造器即可解决问题。
3.接口请求报错cannot deserialize from Object value 单独使用@Data时是会创建对象无参构造方法的,加上@Builder之后,无参构造就没了 并且在对象内手动增加无参构造编译也不通过
4.@Data注解 有参构造和无参构造问题
5.接口请求报错cannot deserialize from Object value ObjectMapper在转化json为对象时,需要对象存在无参构造方法。而对象上增加了Lombok 的@Builder注解时,是不会增加无参构造方法的。使用@Tolerate 增加一个构造方法,在构造方法上增加注解,这是lombok提供的一个冲突兼容方式。

14.上传文件总是报错

系统运行运行着,结果就无法上传了,弄了很久都没有解决,但是报错又不是报的上传文件的问题,报的是其他的问题。

【解决方案】
最后我偶然间去查看服务器的磁盘使用情况,发现了根目录竟然满了,于是我就花了很大的力气开始解决这个目录的问题。

15.上线接口慢

不知道为什么,使用 jeecgboot 的时候,后台接口请求总是特别的慢,上线部署之后,有些接口竟然能达到 7s 中,但是实际上我的网络也不是特别的差。

【尝试方案】
(1)借助于 AOP,我进行了接口请求时间的调用输出,可以查看每个接口的花费时间。
(2)我尝试了使用不同的数据库进行测试,发现线上的数据库确实很慢,但是本地数据库同样的接口却很快。

参考文章:
【1】.SpringBoot 接口:响应时间优化9个技巧 1、使用异步处理;2、缓存机制;3、数据库查询优化;4、使用数据压缩技术;5、使用WebFlux进行响应式编程;6、优化日志记录;7、利用索引优化数据库查询;8、使用连接池来管理数据库连接;9、使用Content Delivery Network (CDN) 加速静态资源加载
【2】.一次线上java应用响应时间过长问题的排查 看监控平台,有问题的机器,cpu占用很高,这。。。更不科学了。理论上,这应用cpu能到1%就不错了,现在居然80%,吓得我赶紧跑到机器上,top了一把,确实是java应用占用cpu很高。
【3】.为什么我的接口响应时间这么长?记一次接口响应时间过长问题排查 这里的aop,我们使用的是同步的方法,只有在aop执行完,接口才会返回,经过日志排查,发现@Log日志入库的时间,耗时2秒多,问题出现在系统日志入库这一步,进一步排查数据库问题mysql自带的库information schema中有张表 rocesslist,可以查看所有的进程,通过查看这张表的数据,发现有一个进程一直在定时执行,经过和同事的咨询沟通,有人写了个定时任务,定时入库数据,占用了数据库资源
【4】.导致数据库慢查询的12个常见原因,以及对应的解决方法。

16.No primary or single unique constructor found for interface

这里在上传文件的时候出现了这个问题。

【解决方案】
使用 jakarta.servlet-api 代替 javax.servlet。

小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。