一、JavaSE
1.1 集合中迭代器的归属问题
在刚接触测试驱动开发的过程中,一个测试一直无法通过,我当时很郁闷啊!代码检查了好几遍基本上没有错啊,最后DeBug
也没有发现问题,不过偶然间,我才注意到原来是位置出现了错误。
//错误源码
private void FuzzySearch(String searchString, int numOfSearch) {
List<AccountInfoOfall> list = new ArrayList<AccountInfoOfall>();// 1
Iterator<AccountInfoOfall> it = list.iterator(); // 2
int numOfSearchAccount = 0;
list = testInstance.getAccountByFuzzyName(searchString); // 3
while (it.hasNext()) {
AccountInfoOfall accountInfoOfall = it.next();
judgeAccountInfoOfAll_isNULL(accountInfoOfall);
numOfSearchAccount++;
}
assertEquals("查询出来数量不匹配", numOfSearch, numOfSearchAccount);
list.clear();
numOfSearchAccount = 0;
}
错误分析:当创建list
的时候,紧随其后生成其迭代器,则指向1
中的List
,但是由于函数返回的List
又使得list
指向了3
中的List
,但是迭代器还是指向1
中的List
,所以while
循环绝对不会执行,因为创建的空List
的内部没有值。
1.2 Syntax error on token “(“, ; expected
首先应该检查是否是括号的缺少匹配,如果没有的话,这个错误一般是在主函数main中出现,解决方案是将报错函数移出主函数,放到类中。
原因:方法的定义不能嵌套,也就是说方法中不能在定义方法,main
主函数就是一个方法,因此就不能再在其内部再声明及定义函数了。
1.3 eclipse 运行Java界面需要拉一下边框才能显示界面组件
解决方法:将setVisible(true);
放到构造函数的最后。
二、JavaEE
2.1 The superclass “javax.servlet.http.HttpServlet” was not found on the Java Build Path
场景:JSP
页面顶端出现“红色”的报错信息:The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
。原来Javaweb
工程类中没有添加Web
容器Runtime
相关类导致。
解决办法:添加一个Server Runtime
运行环境。右击web工程 → 属性 或 Build Path → Java Build Path → Libraries → Add Libray… → Server Runtime → 选择JBoss
或者Tomcat
就可以了。
2.2 EL表达式:’javax.el.ELException’ 的解决方式(failed to parse the expression [${xxx}])
场景:EL表达式 ——${pageContext.session.new}
,学习资料与网上教程都是这么写,而且逻辑上也是这么写,但是由于new
这个属性是一个Boolean
值,但是却报错为:The method getNew() is undefined for the type HttpSession
然而正确的解析应该是使用isNew()
方法获取啊!不过你发现了没有这个属性是new
,这个单词使我们开发中使用频率最高的单词。这也就是它解析错误的原因。
出错原因:tomcat
对EL表达式
的语法要求比较严格,例如"${owner.new}"
因包含关键字new就会导致解析出错。
解决办法:
- 第一种:严格遵守
Java
规范,修改对象的属性名称,要求不包含Java
关键字; - 第二种:修改
EL表达式
,例如"${owner.new}"
可以修改为"${owner['new']}"
; - 第三种:修改
tomcat
属性,忽略对EL表达式
的关键字检查。修改$CATALINA_BASE/conf/catalina.properties
文件,添加org.apache.el.parser.SKIP_IDENTIFIER_CHECK=true
选项。
上面场景最简单的修改方式:${pageContext.session[‘new’]
参考资料:Tomcat 7 ‘javax.el.ELException’ 的解决方式(failed to parse the expression [${xxx}])
2.3 The reference to entity “characterEncoding” must end with the ‘;’ delimiter
出错场景:数据源配置时加上编码转换格式后出问题了?The reference to entity "characterEncoding" must end with the ';' delimiter。
这个错误就是context.xml
中设置数据源链接URL的问题(其实就是使用转义字符):
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/bookstore?useUnicode=true&characterEncoding=UTF-8</param-value>
</context-param>
正确的配置:
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/bookstore?useUnicode=true&characterEncoding=UTF-8</param-value>
</context-param>
三、框架
3.1 Hibernate
3.1.1 Exception in thread “main” org.hibernate.MappingException: Unknown entity: org.crazyit.app.domain.News
场景说明:org.crazyit.app.domain.News
是一个News
类的全路径名,我根据《轻量级JavaEE 企业应用实战 第四版》实例运行其源代码的时候报的异常:
Exception in thread "main" org.hibernate.MappingException: Unknown entity: org.crazyit.app.domain.News
at org.hibernate.internal.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:776)
at org.hibernate.internal.SessionImpl.getEntityPersister(SessionImpl.java:1533)
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:104)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:192)
at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:38)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:177)
at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:32)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:73)
at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:682)
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:674)
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:669)
at lee.NewsManager.main(NewsManager.java:44)
搜索大部分的解决方案都是没有配置好<mapping class="org.crazyit.app.domain.News"/>
,但是我已经配置了!最终在一篇博客中找到了解决方案,出现错误的原因是我使用的Hibernate
环境的版本进行了一些变化,Hibernate 5
启用配置的方式跟原来的不一样了所导致的,这些代码在Hibernate4.*
版本下开发的,而我的环境是Hibernate5.*
,因此才出现的错误,解决方案是:
public static void setUp() throws Exception {
// A SessionFactory is set up once for an application!
StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
.configure() // configures settings from hibernate.cfg.xml
.build();
try {
SessionFactory sf = new MetadataSources( registry ).buildMetadata().buildSessionFactory();
Session session = sf.openSession();
Transaction transaction = session.beginTransaction();
User user = new User();
user.setName("笑笑熊");
user.setPassword("0719");
session.save(user);
transaction.commit();
session.close();
sf.close();
}
catch (Exception e) {
StandardServiceRegistryBuilder.destroy( registry );
e.printStackTrace();
}
}
参考资料:
3.1.2 Hibernate插入中文乱码
首先检查你的数据库配置的编码格式,我一开始设置的是Latin
,因此无法保存(或者说是显示)中文,我们保存成Latin
其实可以解码然后重新编码是没有问题的。然后我改为了UTF-8
格式,但是还是乱码。
解决办法:设置Hibernate
的hibernate.connection.url
属性时添加上使用字符集UTF-8
。
<property name="hibernate.connection.url">
<![CDATA[jdbc:mysql://localhost:3306/daycode?useUnicode=true&characterEncoding=utf8]]>
</property>
注意:此字符串不能写为jdbc:mysql://localhost:3306/daycode?useUnicode=true&characterEncoding=utf8
,不然会出现编译错误,错误提示为将&连接符改为;。
设置这些之后乱码问题就解决了。在写上面这段内容的时候,只是对其感到诧异,当深入学习XML
后才了解到由于在XML
中&
是一个非法字符,需要使用实体引用&
进行替换掉,而上面使用的专业术语为CDATA
,其作用是其中包含的文本会被XML解析器忽略,更确切的说是将其完全看做字符数据,其中的所有的标记、实体引用都不被解析。这样上面的URL中的&只是被看做字符,而不是解析其为实体引用的开始。
参考资料:解决hibernate向mysql插入中文乱码问题
3.2 Spring
3.2.1 java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
原因:Spring
核心容器必须依赖于common-logging
的JAR
包,由于没有导入这个JAR
包所导致的,解决方法当然是导入这个JAR
包就可以了。
3.2.2 导入了common-logging的JAR包,但还是报错java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
原因:暂不清楚,但是导致出错的原因是配置eclipse
的User Library
时配置Spring
的时候勾选上了System library
,如果取消勾选不会再报错了,具体是什么原因造成的暂不清楚。
暂时可参考资料:
在eclipse中创建User Library时遇到一个疑问
java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory spring启动时
3.2.3 java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
参考资料:java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderL
在学习spring
时候遇到一个问题:在web.xml
中配置了spring
的上下文监听器:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
随后启动tomcat
服务器,控制台提示如下错误:
严重: Error configuring application listener of class org.springframework.web.context.ContextLoaderListener
java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1333)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1167)
at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:518)
at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:499)
at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:118)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4775)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5314)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1408)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1398)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
感到疑惑的是:报错提示是找不到这个org.springframework.web.context.ContextLoaderListener
,但是已经导入了spring-web-*.jar
,应该不会有问题啊,我将所有的依赖包放到了WEB-INF/lib
包中就完全没有问题;而原来是配置user library
进行导入Spring依赖,却报错,真是纳了闷了。
原因解析:如果导入的仅仅是jar
包的引用,例如在eclipse
中通过build path
加进user lib……
(类似快捷方式)这种在Java Application
中没问题,但在web Application
中可能会出现找不到类的异常。在WEB Application中jar包最好放在webroot或webcontent下的WEB-INF/lib文件夹内,特别是xml中用到的jar包。
3.2.4 eclipse启动Tomcat时报超时未启动
详细信息:Server Tomcat v8.0 Server at localhost was unable to start within 45 seconds. If the server requires more time, try increasing the timeout in the server editor.
解决方法:双击在Eclipse
的Servers
视图中的Tomcat
,会进入配置编辑界面,在右侧有一个Timeouts
选项,选中后会出现如下界面,剩下就不多说了(延长时间)!
注:不过大部分的时候,不是这个配置的问题,而是项目的事,如果没有报异常,那就把时间延长,如果还启动不起来,肯定可以看到异常信息。
我的异常信息如下:
警告: com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask@72755139 -- Acquisition Attempt Failed!!! Clearing pending acquires. While trying to acquire a needed new resource, we failed to succeed more than the maximum number of allowed acquisition attempts (30). Last acquisition attempt exception:
java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
很显然,项目配置的数据库密码不正确。
四、数据库
4.1 JDBC设置编码问题
最佳的方式是在获取数据库连接的时候直接在URL中指定字符集,因为在开发过程中,我们经常使用的是中文所以要使用UTF-8字符集来防止乱码,如果我们获取连接的时候没有指定字符集,我们也可以使用“SET NAMES UTF8”
来进行设置,但是开发的时候仍然有时候是乱码,所以建议最好在URL中就指定字符集。
URL中最后添加上“?useUnicode=true&characterEncoding=UTF-8”
4.2 参数异常
java.sql.SQLException:Parameter index out of range (1 > number of parameters, which is 0).
原文错误代码为:
stmt = conn.prepareStatement("insert into users(name,password,email,birthday) values('?','?','?','?')")
修改为如下代码即可:
stmt = conn.prepareStatement("insert into users(name,password,email,birthday) values(?,?,?,?)");
4.3 通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败
com.microsoft.sqlserver.jdbc.SQLServerException
:通过端口1433
连接到主机 localhost
的 TCP/IP
连接失败。错误:“Connection refused: connect
。请验证连接属性,并检查SQL Server
的实例正在主机上运行,且在此端口接受 TCP/IP
连接,还要确保防火墙没有阻止到此端口的TCP
连接。”。
<1> 首先打开sql Server Configuration Manager,然后在SQL Server网络设置中的MSSQLSERVER的协议中查看TCP/IP协议是否已启用
<2> 打开SQL Native Client ,查看客户端协议中的TCP/IP默认端口是否是1433,然后就需要重启SQL Server(MSSQLSERVER) 服务
五、Maven
5.1 Maven打包maven-shade-plugin报错Non-parseable POM
场景:在打包可运行jar
包的时候,需要向manifest
中(jar文
件中的META-INF/MANIFEST.MF
文件)添加Main-Class
这一行时出错。在学习《Maven实战》的示例的时候出现了这个问题。
解决方法:可以参考:maven打包maven-shade-plugin报错Non-parseable POM解决方法
新版本针对这一块有所更改,我们需要参考官网提供的样板进行修改。官网参考地址:http://maven.apache.org/plugins/maven-shade-plugin/examples/executable-jar.html
写这段时官网的版本是:3.3.9
官网的内容是:
Executable JAR
To create an executable uber JAR, one simply needs to set the main class that serves as the application entry point:
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>org.sonatype.haven.HavenCli</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
...
</project>
This snippet configures a special resource transformer which sets theMain-Class
entry in the MANIFEST.MF
of the shaded JAR. Other entries can be added to the MANIFEST.MF
as well via key-value pairs in the<manifestEntries>
section:
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<manifestEntries>
<Main-Class>org.sonatype.haven.ExodusCli</Main-Class>
<Build-Number>123</Build-Number>
</manifestEntries>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
...
</project>
5.2 No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?
场景:在Eclipse中运行Maven的test
报错,大概意思就是环境中没有编译器。默认的javase
是1.5,一开始还以为是版本的问题,但却不是,而是Eclipse的配置有问题。
错误信息:
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?
[INFO] 1 error
解决问题参考资料:No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?
打开配置面板:
可以看到我指向的是运行的jre,而不是JDK中的jre,所以做如下的更改:
并且在Execution Environment
中选中相应的版本,并选择JDK(我的版本是1.8):
5.3 Archive for required library: ‘(本地仓库的某个文件)’ in project ‘项目名称’ cannot be read or is not a valid ZIP file
场景:在使用Eclipse导入一个Maven项目后提示依赖的某个jar包无法读取或者不是一个有效的压缩文件。
参考资料:cannot be read or is not a valid ZIP file问题
解决办法:将整个本地仓库整体删除,然后再重新刷新项目。
疑问:应该删除指定的报错文件然后重新刷新就可以了吧,但是没有行得通。可能是我只删除了Spring Framework
这个报错依赖的部分依赖包的原因吧。
疑问解析:删除本地仓库,并刷新项目仍然在项目上有红色感叹号的话,可以在项目上右击Run As → clean,然后应该就没有什么问题了。
5.4 maven项目下jsp文件中el表达式失效问题
原因:maven创建web项目默认使用的是web 2.3
版本,web.xml
文件头中也是2.3
的版本。而2.5
之前web.xml
文件中的头定义中,el表达式
默认是忽略不解析的。
解决办法:一步到位的话就是提升web.xml文件的版本至少在2.5之上,这里有一个3.1的示例。
<?xml version="1.0" encoding="GBK"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
</web-app>
N、其它
<1>Eclipse无法编译通过
开发中遇到,明明没有问题但是Eclipse就是报错误,无法编译,开发中遇到的实际问题:
下面是解决步骤:
首先点击菜单栏中projiect → Properties
然后选择Java Compiler,更改Compiler Compilance Level
其实你在Windows → preferences里面也能找到,灵活运用。
值得注意的是,我在修改完成之后,我的Eclipse仍然报告错误,很郁闷,我就新建了个文件发现没有报错误,郁闷,可能是这个版本的Bug吧。简单的来说就是拷贝出来,删除,然后再复制进来,或者新建个文件拷贝进去,随你,说不准你用的版本没有这个问题呢。
<2>缺少com.sun.mirror.*包
在导入《Java编程思想》源代码的时候,报的错误:
一般情况下的解决办法:
配置环境变量的时候配置CLASSPATH
这个环境变量,其值为:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
(注意最前面的点)
因为com.sun.mirror
这个包在tools.jar
包中,所以配置了这个环境变量就可以了。
但是我的环境变量配置好了,还是不行,手工添加到Eclipse中的build path的路径下也是行不通。打开这个tools.jar包才发现这个包中没有这个包。
经过我查询发现JDK1.6
及JDK1.7
中的tools.jar
包都包含com.sun.mirror.*
这个包,但是JDK1.8
中却没有。这也就是我为什么配置了环境变量但是报错的原因。
<3>缺少javax.jnlp.*包
在导入《Java编程思想》源代码的时候,报的错误:
解决办法:参考:javax.jnlp
找到官网的demo
包下的\sample\jnlp\servlet\jnlp.jar
加到你的classpath
里面应该就行了。
<4>Eclipse导出JavaDoc中文乱码问题
在Eclipse里 export
选 JavaDoc
,在向导的最后一页的Extra JavaDoc Options
里填上参数即可,比如项目采用的是UTF-8
的编码就填:-encoding UTF-8 -charset UTF-8
<5>Eclipse经常报错,而且是代码助手出错《Problems During Content Assist》
从字里行间可以看到《did not complete normally
》,这种字样,应该是没有加载完全。
解决办法:Window → preference → java → editor → Content Assist → advanced 下面的time out
设大一点。如果还报错,你可能是在Build path
中引入了不是jar
包的文件,比如说txt、html,xml
等非jar文件的其他文件,去掉这些没用的东西应该就可以解决啦。
但实际上我都调整到了1000了,但是还是报错,而且我使用的而是Maven进行以来管理,所以还是很是郁闷?
我使用时报错的情况是:使用注解时,如果你在@符号后有字符,然后再摁Alt+/就会出现问题。但是如果在@后直接使用快捷键,然后就没有什么问题了。
<6>虚拟机安装(VirtualBox VM)相关问题(启动,复制,拖拽)及解决
首先我已经将VirtualBox
的剪贴板和拖拽都设置成了双向,而且也安装了增强功能,前一天还可以,第二天再打开就不行了,而且打开VirtualBox
的时候报如下警告:
后来问题解决才发现,就是这个警告造成了复制和拖拽功能无法使用,将这个警告解决就可以了,造成这个警告的原因是:vbox
的提示已经很清楚,就是说你当前选定的虚拟介质中有几个已经被你删掉或者挪到其它地方了,软件找不到这些虚拟的镜像,当然提示警告。如果没用的话,把这些虚拟介质的记录删掉就行了,不影响使用。删除的方式位:先按照提示点击检测按钮,然后选中虚拟光盘,并点击上面的删除按钮,将***.iso删除掉即可。