1. java.lang.NullPointerException(空指针异常)
调用了未经初始化的对象或者是不存在的对象
经常出现在创建图片,调用数组这些操作中,比如图片未经初始化,或者图片创建时的路径错误等等。对数组操作中出现空指针,
即把数组的初始化和数组元素的初始化混淆起来了。数组的初始化是对数组分配需要的空间,而初始化后的数组,其中的元素并没有实例化,
依然是空的,所以还需要对每个元素都进行初始化(如果要调用的话)。
====================================================================================================
2. java.lang.ClassNotFoundException
指定的类不存在
这里主要考虑一下类的名称和路径是否正确即可,通常都是程序试图通过字符串来加载某个类时可能引发 异常
比如:调用Class.forName();
或者调用ClassLoad的finaSystemClass();或者LoadClass();
====================================================================================================
3. java.lang.NumberFormatException
字符串转换为数字异常
当试图将一个String转换为指定的数字类型,而该字符串确不满足数字类型要求的格式时,抛出该异常.如现在讲字符型的数据“123456”转换为数值型数据时,是允许的。
但是如果字符型数据中包含了非数字型的字符,如123#56,此时转换为数值型时就会出现异常。系统就会捕捉到这个异常,并进行处理.
====================================================================================================
4. java.lang.IndexOutOfBoundsException
数组下标越界异常
查看调用的数组或者字符串的下标值是不是超出了数组的范围,一般来说,显示(即直接用常数当下标)调用不太容易出这样的错,但隐式(即用变量表示下标)调用就经常出错了,还有一种情况,是程序中定义的数组的长度是通过某些特定方法决定的,不是事先声明的,这个时候,最好先查看一下数组的length,以免出现这个异常。
====================================================================================================
5. java.lang.IllegalArgumentException
方法的参数错误
比如g.setColor(int red,int green,int blue)这个方法中的三个值,如果有超过255的也会出现这个异常,因此一旦发现这个异常,我们要做的,就是赶紧去检查一下方法调用中的参数传递是不是出现了错误。
====================================================================================================
6. java.lang.IllegalAccessException
没有访问权限
当应用程序要调用一个类,但当前的方法即没有对该类的访问权限便会出现这个异常。对程序中用了Package的情况下要注意这个异常
====================================================================================================
7. java.lang.ArithmeticException
数学运算异常
当算术运算中出现了除以零这样的运算就会出这样的异常。
====================================================================================================
8. java.lang.ClassCastException
数据类型转换异常
当试图将对某个对象强制执行向下转型,但该对象又不可转换又不可转换为其子类的实例时将引发该异常,如下列代码。
Object obj = new Integer(0);
String str = obj;
====================================================================================================
9. java.lang.FileNotFoundException
文件未找到异常
当程序试图打开一个不存在的文件进行读写时将会引发该异常。该异常由FileInputStream,FileOutputStream,RandomAccessFile的构造器声明抛出
即使被操作的文件存在,但是由于某些原因不可访问,比如打开一个只读文件进行写入,这些构造方法仍然会引发异常
====================================================================================================
10. java.lang.ArrayStoreException
数组存储异常
当试图将类型不兼容类型的对象存入一个Object[]数组时将引发异常
Object[] obj = new String[3];
obj[0] = new Integer(0);
====================================================================================================
11. java.lang.NoSuchMethodException
方法不存在异常
当程序试图通过反射来创建对象,访问(修改或读取)某个方法,但是该方法不存在就会引发异常
====================================================================================================
12. java.lang.NoSuchFiledException
方法不存在异常
当程序试图通过反射来创建对象,访问(修改或读取)某个filed,但是该filed不存在就会引发异常
====================================================================================================
13. java.lang.EOFException
文件已结束异常
当程序在输入的过程中遇到文件或流的结尾时,引发异常。因此该异常用于检查是否达到文件或流的结尾
====================================================================================================
14. java.lang.InstantiationException
实例化异常
当试图通过Class的newInstance()方法创建某个类的实例,但程序无法通过该构造器来创建该对象时引发
- Class对象表示一个抽象类,接口,数组类,基本类型
- 该Class表示的类没有对应的构造器
====================================================================================================
15:java.lang.InterruptedException
被中止异常
当某个线程处于长时间的等待、休眠或其他暂停状态,而此时其他的线程通过Thread的interrupt方法终止该线程时抛出该异常。
====================================================================================================
16:java.lang.CloneNotSupportedException
不支持克隆异常
当没有实现Cloneable接口或者不支持克隆方法时,调用其clone()方法则抛出该异常。
====================================================================================================
17:java.lang.OutOfMemoryException
内存不足错误
当可用内存不足以让Java虚拟机分配给一个对象时抛出该错误。
====================================================================================================
18:java.lang.NoClassDefFoundException
未找到类定义错误
当Java虚拟机或者类装载器试图实例化某个类,而找不到该类的定义时抛出该错误。
违背安全原则异常:SecturityException
操作数据库异常:SQLException
输入输出异常:IOException
通信异常:SocketException
====================================================================================================
19: org.hibernate.MappingException: No Dialect mapping for JDBC type: -9
原因:Hibernate框架的方言(Dialect )没有数据库中数据类型nvarchar的映射,只有varchar类型的映射。所以在启动时出现此异常。
解决方法:
方法一:
将数据库字段的类型改为varchar类型。
方法二:
org.hibernate.MappingException: No Dialect mapping for JDBC type: -9
org.hibernate.MappingException: No Dialect mapping for JDBC type: -15
笔者在做连接SQLServer2008数据库的时候遇到了上述的错误,解决办法如下:
package com.shihuan.core.framework.extend;
import java.sql.Types;
import org.hibernate.Hibernate;
import org.hibernate.dialect.SQLServer2008Dialect;
public class SqlServer2008Dialect extends SQLServer2008Dialect {
public SqlServer2008Dialect() {
super();
registerHibernateType(Types.CHAR, Hibernate.STRING.getName());
registerHibernateType(Types.NCHAR, Hibernate.STRING.getName());
registerHibernateType(Types.NVARCHAR, Hibernate.STRING.getName());
registerHibernateType(Types.LONGNVARCHAR, Hibernate.STRING.getName());
registerHibernateType(Types.DECIMAL, Hibernate.DOUBLE.getName());
}
}
java.sql.Types对应的值请参考http://blog.sina.com.cn/s/blog_4f925fc30102ep0v.html
java.sql.Types对应的sql server2008中的一些值:
public final static int BIT = -7;
public final static int TINYINT = -6;
public final static int SMALLINT = 5;
public final static int INTEGER = 4;
public final static int BIGINT = -5;
public final static int FLOAT = 6;
public final static int REAL = 7;
public final static int DOUBLE = 8;
public final static int NUMERIC = 2;
public final static int DECIMAL = 3;
public final static int CHAR = 1;
public final static int VARCHAR = 12;
public final static int LONGVARCHAR = -1;
public final static int DATE = 91;
public final static int TIME = 92;
public final static int TIMESTAMP = 93;
public final static int BINARY = -2;
public final static int VARBINARY = -3;
public final static int LONGVARBINARY = -4;
public final static int NULL = 0;
public final static int OTHER = 1111;
public final static int JAVA_OBJECT = 2000;
public final static int DISTINCT = 2001;
public final static int STRUCT = 2002;
public final static int ARRAY = 2003;
public final static int BLOB = 2004;
public final static int CLOB = 2005;
public final static int REF = 2006;
public final static int DATALINK = 70;
public final static int BOOLEAN = 16;
public final static int ROWID = -8;
public static final int NCHAR = -15;
public static final int NVARCHAR = -9;
public static final int LONGNVARCHAR = -16;
public static final int NCLOB = 2011;
public static final int SQLXML = 2009;
Hibernate SQL方言(hibernate.dialect):
RDBMS | Dialect |
DB2 | org.hibernate.dialect.DB2Dialect |
DB2 AS/400 | org.hibernate.dialect.DB2400Dialect |
DB2 OS390 | org.hibernate.dialect.DB2390Dialect |
PostgreSQL | org.hibernate.dialect.PostgreSQLDialect |
MySQL5 | org.hibernate.dialect.MySQL5Dialect |
MySQL5 with InnoDB | org.hibernate.dialect.MySQL5InnoDBDialect |
MySQL with MyISAM | org.hibernate.dialect.MySQLMyISAMDialect |
Oracle(any version) | org.hibernate.dialect.OracleDialect |
Oracle 9i | org.hibernate.dialect.Oracle9iDialect |
Oracle 10g | org.hibernate.dialect.Oracle10gDialect |
Oracle 11g | org.hibernate.dialect.Oracle10gDialect |
Sybase | org.hibernate.dialect.SybaseASE15Dialect |
Sybase Anywhere | org.hibernate.dialect.SybaseAnywhereDialect |
Microsoft SQL Server 2000 | org.hibernate.dialect.SQLServerDialect |
Microsoft SQL Server 2005 | org.hibernate.dialect.SQLServer2005Dialect |
Microsoft SQL Server 2008 | org.hibernate.dialect.SQLServer2008Dialect |
SAP DB | org.hibernate.dialect.SAPDBDialect |
Informix | org.hibernate.dialect.InformixDialect |
HypersonicSQL | org.hibernate.dialect.HSQLDialect |
H2 Database | org.hibernate.dialect.H2Dialect |
Ingres | org.hibernate.dialect.IngresDialect |
Progress | org.hibernate.dialect.ProgressDialect |
Mckoi SQL | org.hibernate.dialect.MckoiDialect |
Interbase | org.hibernate.dialect.InterbaseDialect |
Pointbase | org.hibernate.dialect.PointbaseDialect |
FrontBase | org.hibernate.dialect.FrontbaseDialect |
Firebird | org.hibernate.dialect.FirebirdDialect |
====================================================================================================
20:com.atomikos.icatch.SysException: Error in init(): Log already in use
原因:在往客户服务器上面部署项目的时候碰到的问题。
解决方法:部署之后不可以用tomcat启动,必须要重新启动平台服务。
在项目中使用atomikos时,如果在同一个环境中部署两个以上这 种项目,则可能会报出com.atomikos.icatch.SysException: Error in init(): Log already in use异常,这个信息是因为atomikos在默认情况下是将console_file_name和log_base_name设置为默认 值:tm.out和tmlog0.log,并且会将这两个文件上锁,导致其他线程无法访问,所以当多个项目都未指定这一名称时就会出现上述异常信息
解决办法:
在每一个项目中都指定atomikos的文件名称,修改jta.properties文件中的
com.atomikos.icatch.console_file_name
com.atomikos.icatch.log_base_name
两个属性的值,保证每个项目的名称都不一样
例如:
第一个项目中使用默认值,则自动生成为tm.out、tm.out.lck和tmlog0.log、tmlog.log.lck四个文件;
第二个项目中在jta.properties文件中指定属性名称:
com.atomikos.icatch.console_file_name = rm.out
com.atomikos.icatch.log_base_name = rmlog.log
启动服务时就会自动生成rm.out、rm.out.lck和rmlog0.log、rmlog.log.lck四个文件;
这时两个项目使用的文件就不会产生冲突
====================================================================================================
21: 无法执行该操作,因为链接服务器”Server_202”的 OLE DB 访问接口 “SQLNCLI10″ 无法启动分布式事务”
原因:调用存储过程的方式有问题,必须用JDBC方式调用存储过程才可以正常调用。咋一看以为是分布式事务的问题。
解决方法:使用JDBC的方式调用存储过程代替普通调用方式。
代码如下:
运行报错的代码(普通方式:只有dao.impl中写代码):
/**
* 查找符合条件的排污企业放入Map集合
* @param userName 登录名
* @return Map<String,Object> 键值对的集合
*/
@Override
public Map<String,Object> findAllCommunication(String userName) {
//创建用于存储键值对的map集合
Map<String, Object> map = new HashMap<String, Object>();
//创建session对象
Session session = this.getSession();
//创建事务的对象
Transaction trans = session.beginTransaction();
//调用存储过程
SQLQuery query = session.createSQLQuery("{Call ProcYB_GetPSList(?)}");
//为存储过程设置输入参数
query.setString(0,userName == null ? "" : userName);
//提交事务
trans.commit();
//获取存储过程的运行结果(得到的结果是Object类型的数组集合)存入list集合
List list = query.list();
//循环遍历该结果集合
for (int i = 0; i < list.size(); i++) {
//用Object数组类型的对象objs接收每一次外层循换得到的对象
Object[] objs = (Object[]) list.get(i);
//通过内层循环取出每一个objs集合中的数据放入map集合中
for (int j = 0; j < objs.length; j++) {
if (j==0&&StringUtils.isNotEmpty(objs[j].getClass().getName())) {
map.put("psCode"+i,objs[0].toString());
}else{
map.put("psName"+i,objs[1].toString());
}
}
}
return map;
}
/**
* 根据所获的的企业的PSName获取他的监控点
* @param pscode 企业代码
* @return Map<String,Object> 键值对的集合
*/
@Override
public Map<String, Object> findAllOutPutCode(String psCode) {
//设置Long类型的变量,用于将String类型的企业代码转换为数据库中的bigint类型的数据
Long psCode1;
//创建用于存储键值对的map集合
Map<String, Object> map = new HashMap<String, Object>();
//创建session对象
Session session = this.getSession();
//创建事务的对象
Transaction trans = session.beginTransaction();
//调用存储过程
SQLQuery query = session.createSQLQuery("{Call ProcYB_GetOutputInfoByPSCode(?)}");
if ("".equals(psCode)||psCode==null) {
psCode1 = (long) -1;
}else{
psCode1 = Long.parseLong(psCode);
}
//为存储过程设置输入参数
query.setLong(0,psCode1 == null ? 0 : psCode1);
//提交事务
trans.commit();
//获取存储过程的运行结果(得到的结果是Object类型的数组集合)存入list集合
List list = query.list();
//循环遍历该结果集合
for (int i = 0; i < list.size(); i++) {
//用Object数组类型的对象objs接收每一次外层循换得到的对象
Object[] objs = (Object[]) list.get(i);
//通过内层循环取出每一个objs集合中的数据放入map集合中
for (int j = 0; j < objs.length; j++) {
if (j==2&&StringUtils.isNotEmpty(objs[j].getClass().getName())) {
map.put("outPutName"+i,objs[2].toString());
}else if(j==1&&StringUtils.isNotEmpty(objs[j].getClass().getName())){
map.put("outPutCode"+i,objs[1].toString());
}
}
}
return map;
}
正常运行的代码(JDBC方式:不光是dao.impl层中,而且web层中还要有类JdbcUtil.java并且要有sqljdbc4.jar包的驱动支持,还要在MANIFEST.MF文件中配置,还要在build.properties文件中配置):
Dao.impl层中的方法:
/**
* 查找符合条件的排污企业放入Map集合(JDBC方式)
* @return Map<String,Object> 键值对的集合
*/
@Override
public Map<String,Object> findAllCommunication(String userName) {
//创建用于存储键值对的map集合
Map<String, Object> map = new HashMap<String, Object>();
List<Records> recordList = new ArrayList<Records>();
try {
Connection dbConn = JdbcUtil.getConn();
CallableStatement statement = dbConn.prepareCall("SET NOCOUNT ON exec dbo.ProcYB_GetPSList ?");
statement.setString(1, userName==null ? "" : userName);
ResultSet rs = statement.executeQuery();
while (rs.next()) {
Records c = new Records();
String psCode = rs.getString("psCode");
String psName = rs.getString("psName");
c.setPsCode(psCode);
c.setPsName(psName);
recordList.add(c);
}
statement.close();
} catch (Exception e1) {
e1.printStackTrace();
}
if (recordList!=null&&recordList.size()>0) {
for (int i = 0; i < recordList.size(); i++) {
Records record = recordList.get(i);
if (record!=null&&StringUtils.isNotEmpty(record.getPsCode())) {
map.put("psCode"+i,record.getPsCode());
}
if(record!=null&&StringUtils.isNotEmpty(record.getPsName())){
map.put("psName"+i,record.getPsName());
}
}
}
return map;
}
/**
* 根据所获的的企业的PSName获取他的监控点(JDBC方式)
* @param pscode 企业代码
* @return Map<String,Object> 键值对的集合
*/
@Override
public Map<String, Object> findAllOutPutCode(String psCode) {
//设置Long类型的变量,用于将String类型的企业代码转换为数据库中的bigint类型的数据
Long psCode1;
//创建用于存储键值对的map集合
Map<String, Object> map = new HashMap<String, Object>();
List<Records> recordList = new ArrayList<Records>();
try {
Connection dbConn = JdbcUtil.getConn();
CallableStatement statement = dbConn
.prepareCall("SET NOCOUNT ON exec dbo.ProcYB_GetOutputInfoByPSCode ?");
statement.setString(1, psCode==null ? "" : psCode);
ResultSet rs = statement.executeQuery();
while (rs.next()) {
Records c = new Records();
String outPutCode = rs.getString("outPutCode");
String outPutName = rs.getString("outPutName");
c.setOutPutCode(outPutCode);
c.setOutPutName(outPutName);
recordList.add(c);
}
statement.close();
} catch (Exception e1) {
e1.printStackTrace();
}
if (recordList!=null&&recordList.size()>0) {
for (int i = 0; i < recordList.size(); i++) {
Records record = recordList.get(i);
if (record!=null&&StringUtils.isNotEmpty(record.getOutPutCode())) {
map.put("outPutCode"+i,record.getOutPutCode());
}
if(record!=null&&StringUtils.isNotEmpty(record.getOutPutName())){
map.put("outPutName"+i,record.getOutPutName());
}
}
}
return map;
}
Web层中JdbcUtil.java类中的代码:
package com.jointsky.jointframe.record.management.web;
import java.sql.Connection;
import java.sql.DriverManager;
public class JdbcUtil {
public static Connection getConn() {
String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
String dbURL = "jdbc:sqlserver://10.194.136.131:1433;SelectMethod=cursor;DatabaseName=JointFrame31";
// String dbURL = "jdbc:sqlserver://localhost:1433;SelectMethod=cursor;DatabaseName=JointFrame31";
String userName = "sa";
String userPwd = "123.com";
// String userPwd = "joint@123";
Connection dbConn = null;
try {
Class.forName(driverName);
dbConn = DriverManager.getConnection(dbURL, userName, userPwd);
System.out.println("连接数据库成功");
} catch (Exception e) {
e.printStackTrace();
System.out.print("连接失败");
}
return dbConn;
}
}
MANIFEST.MF文件中配置:
Build.properties文件中的配置:
将sqljdbc4.jar包放入lib文件夹中,添加支持。
====================================================================================================
22:org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
原因:再给数据库中放入新数据的时候加了id,然而有了id,系统默认为修改方法就回去在库中查找,所以出错。
解决方法:将生成的id去掉。
23:该语句没有返回结果集
24:org.springframework.beans.factory.BeanCreationException
tomcat的lib文件夹下为加载上对应的jar包,将对应的jar包拷贝进去就可以了