JavaWeb项目常见错误及解决方法

利用编程软件的便携出现相似:

Exception in thread "main" java.lang.NullPointerException
	at [email protected]/com.mysql.jdbc.UpdatableResultSet.syncUpdate(UpdatableResultSet.java:1541)
	at [email protected]/com.mysql.jdbc.UpdatableResultSet.updateString(UpdatableResultSet.java:2488)
	at [email protected]/com.mysql.jdbc.UpdatableResultSet.updateString(UpdatableResultSet.java:2526)
	at cn.edu.lingnan.test.JDBCTest.main(JDBCTest.java:56)

例子: 更新结果集从而更新数据库之插入记录:

            res.moveToInsertRow();//1移动至带插入行
			res.updateString("sname","东哥");//更新字段
			res.updateInt("age", 80);
			res.insertRow();//插入行
                    更新结果集从而更新数据库之更新记录:
            res.last();
			res.updateString("sname", "rouse");
		    res.updateInt("age", 80);
			res.updateRow();//更新行
                    更新结果集从而更新数据库之更新记录:
            res.first();//1 移动至待删除行
			res.deleteRow();//执行删除操作	

注意res.insertRow();和res.updateRow();不要混淆

外键约束问题:

Cannot delete or update a parent row: a foreign key constraint fails 

原因:删除更新了另一个表以待删除更新表某个字段为外键的表的被参照表中的行

同一个变量重复定义:

‘Duplicate local variable sql’:sql重复定义
例子:String sql="xxxx";
     String sql="yyyy";

解决:String sql=“xxxx”;
sql=“yyyy”;

资源未关闭警告:

Resource leak: 'prep' is not closed at this location

解决:在中间加上prep.close();

利用编程软件的便携出现res=prep.executeQuery()和prep.executeUpdate()的错用:

  1. ResultSet executeQuery(String sql); 和res=prep.executeQuery();
    执行SQL查询,并返回ResultSet 对象。用于产生单个结果集的语句
  2. int executeUpdate(String sql);和prep.executeUpdate();
    可执行增,删,改,返回执行受到影响的行数。
    创建表,改变表,删除表都是DDL语句的例子,要用executeUpdate方法来执行。也可以从它的名字里看出,方法executeUpdate也被用于执行更新表SQL语句。
  3. boolean execute(String sql);
    可执行任何SQL语句,返回一个布尔值,表示是否返回ResultSet 。

结果集指针位置:

‘’Before start of result set“大意:在结果集之前
错误例子:res1=prep.executeQuery();
	     System.out.println(res1.getString("num"));
正确例子:
      res1=prep.executeQuery();
	  res1.next();
	  System.out.println(res1.getString("num"));

原因:返回结果集之后指针指向第一行记录之前,因此获取不到第一条记录,解决方法如上

软删除之state:

软删除中状态state在0,1时分别代表已删除数据和当前数据。当删除方法使用了state,其他方法中的sql语句要根据系统要求决定是否要针对当前数据还是历史数据操作。

                      变量不能被看见	    

_passward cannot be resolved to a variable 形参位置变量的单词拼写与方法内变量的单词是否一致
解决方法:采用提示change to正确变量或者自己找

方法未传参:

现象:sid cannot be resolved to a variable
          public boolean deleteStuBySid()
          prep.setString(1,_sid);

致命傻逼错误:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'passward' in 'where clause'
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
	at [email protected]/com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
	at [email protected]/com.mysql.jdbc.Util.getInstance(Util.java:386)
	at [email protected]/com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1054)
	at [email protected]/com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4190)
	at [email protected]/com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4122)
	at [email protected]/com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2570)
	at [email protected]/com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2731)
	at [email protected]/com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2812)
	at [email protected]/com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2761)
	at [email protected]/com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1612)
	at cn.edu.lingnan.dao.StudentDAO.findStudentByNameAndPassward(StudentDAO.java:26)
	at cn.edu.lingnan.test.StudentTest.main(StudentTest.java:12)
false
2.java.sql.SQLException: Column 'passward' not found.
	at [email protected]/com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078)

该错误返回值false,
Column 'passward' not found.,Unknown column 'passward' in 'where clause' 

大意:不知名的‘passward’字段,主要由于在代码中passward表示字段时与创建表时的‘passward’拼写不一致,如‘password’,‘passward’;
解决方法:仔细对比代码中的字段与创建表的代码中字段即可

变量赋值与其类型不对应:

Type mismatch: cannot convert from int to boolean

解决方法:修改变量类型与其值对应

类中无此方法:

The method updateStuPassword(String, String) is undefined for the type StudentDTO

大意:updateStuPassword(String, String)在StudentDTO类中没有定义,也就是说该方法没有在此类中
解决方法:1_细看自己究竟要用哪个类中的方法;
2_所调用的方法名是否写错

Vector<>中类方法错诶:

Type mismatch: cannot convert from Vector to Vector

解决方法:修改为 Vector
原因: Vector<>中放的是一个个实例而不是操作,在CourseDAO中CourseDTO对象设置值然后在一并放入Vector<>中。

方法位置错误:

Illegal modifier for parameter scanf; only final is permitted

在public static void main(String[] args)方法里写 public static StudentDAO sd=new StudentDAO(); ,应该在该类中写, 即main方法上面写。

无法从结果集中获取值:

错误:System.out.println(""+res.getInt(score));
正确:System.out.println(""+res.getInt("score"));

解决方法:要加双引号,意思:从整型的score字段中获取值

XML:

schema验证出错常见问题:

1.systemId: file:///E:/JAVA/Conten2018764344/bin//database.conf.xml; lineNumber: 3; columnNumber: 57; cvc-elt.1.a: 找不到元素 ‘datasource’ 的声明。
出错原因:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="datasourse">

注意不是sourse而是source
运行后现象:
在xml文件中出现个 ×
原理:xsd文件是对xml文件的一种规范,约定在xml文件中能够出现什么元素,元素的类型,元素的层次等等,当两个文件元素不对应时就会在验证时出错(用xsd验证xml,xml是基于xsd这个模式来验证的),也就是说,xsd中有的xml不一定有,但xml有的xsd一定有;
为什么是在xsd中写错总是在xml中报错,因为xml是基于xsd验证的,xsd有什么你xml管不着,故即使我错了也是你背锅。

2./JAVA/Conten2018764344/bin//database.conf.xml; lineNumber: 3; columnNumber: 57; cvc-complex-type.3.2.2: 元素 ‘datasource’ 中不允许出现属性 ‘xsi:noNamespaceSchemaLocation’。
原因:

解决:"instace"应为"instance"
原理:xml中不允许一般来说是不允许一些字符作为定义外的元素存在的—cvc-complex-type
元素的属性已存在,不能随意定义

3.无法读取方案文档 'file:/E:/JAVA/Conten2018764344/database.conf.xsd', 原因为 1) 无法找到文档; 2) 无法读取文档; 3) 文档的根元素不是 xsd:schema。
文件路径出错
解决,根据错误提示对比xml和xsd文件路径修改即可
拓展:当我们把xml和xsd文件复制到src下,也就默认复制到bin下所以“src//database.conf.xsd”可写为“bin//database.conf.xsd”,工作中我们都是把.class文件给公司而不会是源文件,故用第二种写法。

schema 验证好处:
file:///E:/JAVA/Conten2018764344/bin//database.conf.xml; lineNumber: 8; columnNumber: 8; cvc-complex-type.2.4.a: 发现了以元素 ‘use’ 开头的无效内容。应以 ‘{user}’ 之一开头。

伪属性问题解决:

1.重启eclipse
2.改属性名
3.复制xsd的到xml运行看有没有错,这是为了解决有空余字符导致
4.重创,用别人的文件,不简单只要代码
5.读到的根本不是该读的文件,跟路径有关

无法加载主类问题:

1.里面选别的运行再切换回来
2.重新创建主函数运行
3.更新工程

mysql和eclipse控制台中表乱码问题:

show variable like "%char%";
SHOW VARIABLES LIKE 'character%';
SET character_set_client = GB2K;

仅限于不关mysql
重启mysql就会又回来了,解决方法:基于现在状态重新创表插入
缺点:以后基于表的DML操作不会有问题,但创建表删除表会出现问题
根本解决:重装mysql注意配置。

控制台输入过长问题:

移动光标到显示信息下面,不要把显示信息变绿,会算进去,nextline惹的祸。

sql语句设多值问题:

Truncated incorrect DOUBLE value: 'lisi' 没有值
原因,设多值时用逗号,不可用and

数据类型和引用类型问题:

Object superuser = s.getAttribute("superuser");说明该方法的返回值是一个类对象
可根据数据类型改为对应的引用类型,悬浮行号可得具体解决之法。

Integer 是int的一个包装类(wrapper),他是类不是基本数据类型,他的内部其实包含一个int型的数据。
对象封装有很多好处,可以把属性也就是数据跟处理这些数据的方法结合在一起,比如Integer就有parseInt()等方法来专门处理int型相关的数据,另一个非常重要的原因就是在Java中绝大部分方法或类都是用来处理类类型对象的,如ArrayList集合类就只能以类作为他的存储对象,而这时如果想把一个int型的数据存入list是不可能的,必须把它包装成类,也就是Integer才能被List所接受。
 Java中int和Integer关系是比较微妙的。关系如下:
  1.int是基本的数据类型;
  2.Integer是int的封装类;
  3.int和Integer都可以表示某一个数值;
  4.int和Integer不能够互用,因为他们两种不同的数据类型;
始数据类型 引用数据类型
boolean Boolean
char Character
byte Byte
short Short
int Integer
long Long
float Float
double Double

你可能感兴趣的:(笔记)