注册 登录
编程论坛 J2EE论坛

求教?random类的一个无法解释的问题

shuimu267 发布于 2006-03-21 10:31, 1315 次点击

我用JSP+Acess数据库做一个在线考试系统,程序源代码如下:
<%@ page language="java" contentType="text/html; charset=GB2312"%>
<%@ page import="java.sql.*"%>
<%@ page import="java.util.*"%>
<%@ page import="java.lang.*"%>
<jsp:useBean id="wu" class="duo.exam" scope="session"/>
<html>
<head>
<title>考试正在进行之中</title>
</head>
<body>
<p align=center>考号为:<%=session.getAttribute("S_id")%>的<%=session.getAttribute("S_name")%>同学您正在考试之中,请专心作答</p>
<table width="80%" border=1 bordercolor="#ff00ff" cellspacing=1 align="center">
<%
try{
int Max=0;
String sql="select max(id) from tiku ";
ResultSet rs0=wu.executeQuery(sql);
while(rs0.next())
{ Max=rs0.getInt(1);}
Random random=new Random();
for(int j=1;j<=5;j++)
{
int i=random.nextInt(Max);
String sql1="select * from tiku where id='"+i+"'";
ResultSet rs1=wu.executeQuery(sql1);
//此代码整体都调试过的,没有错误,而且随机函数也没有任何错误,但是就是rs1.next()有问题,其返回的结果集为空!可奇怪的是String sql1="select * from tiku where id='"+i+"'";其语句却完全正确,且调试时其也能够正确的得到随机函数产生的随机数,可就是不知道为什么不在rs1.next()时确为空,在调试过过程中,又出现一个问题就是:把String sql1="select * from tiku where id='"+i+"'";改成sql1="select * from tiku where id='5'";确又能够正确的得到一行纪录,请问这错误是出在哪里,但是随机函数确实又没有错,请问哪们高手帮帮忙!!!////

if(rs1.next())
{
int s0=rs1.getInt("id");
String s1=rs1.getString("Question");
String s2=rs1.getString("Keya");
String s3=rs1.getString("Keyb");
String s4=rs1.getString("Keyc");
String s5=rs1.getString("Keyd");
%>
<tr><td ><%=s0%></td>
<td colspan=4><%=s1%></td>
<tr><td width=24%><%=s2%></td>
<td width=24%><%=s3%></td>
<td width=24%><%=s4%></td>
<td width=24%><%=s5%></td>
<td width=4%><select name="select" size=1>
<option value="A">A</option>
<option value="B">B</option>
<option value="C">C</option>
<option value="D">D</option>
</select></td>
<%}}%>
</table>
</body>
</html>
<%}
catch(Exception e)
{System.out.println(e.getMessage()+"error");}
%>

15 回复
#2
疯子java2006-03-21 13:01
我建议先将你得到的随机数打出来看看是多少,在表中是否存在
你说了你整体上都没有错误,但是又得不到记录
我现在就只能认为是你的随机数在表中根本就存在
#3
miss_friend2006-03-21 13:15
我也同意版主的想法,你先把i的值输出来看看呀
#4
shuimu2672006-03-21 13:39
首先谢谢版主与miss_friend给予本人的关注!
经过你们刚才的提醒之后,我又去验证了一下,随机函数与随机数是否正确。我首先查了下数据库当中的tiku表,而且我把“id定义了为主键。而且确实是随机函数能够产生的整数,但是还是不能够出现任何记录,与前面的情况是一模一样。本人被这个问题困扰了好几天了,找了好多资料看了,其思路也是这样的,好像根本就没有任何问题。请版主与各位高手帮帮
忙,本不不吝感谢!谢谢!
#5
gameovercn2006-03-21 16:14

试试定义rs1之前一行先把rs.close一下.

#6
shuimu2672006-03-21 16:37
谢谢gameovercn.也试了,可是就是没有用啦,不知道什么原因??
#7
wangtaobig2006-03-22 00:37

你程序写的很好,但用法不对,
一、Max(id)返回的是最大的那个id号,而不是总个数!如果你数据库中的ID是这样的(1、2、9)它返回的是9而不是3,那你在用random.nextInt(Max)(其中Max为9)有可能是4,在你数据中没有id为4的,就不对了,还有random.nextInt(Max)返回的是0-8中的一个整数,如果返回0,你有这个数据吗?
二、你的设计思想还有点小问题,你自己多看几遍代码


可能说的不对,还请多原谅!

#8
shuimu2672006-03-22 09:30
谢谢你wangtaobig,其实你说的也蛮有道理。具体而又细致的指出了一些常容易犯的错误。
我的数据库当中的ID是这样的(0,1,2,3,4,5,),所以说用Max(id)只能够一种返回结果,那就是5,还有你刚才讲的random.nextInt(Max)有可以返回0这个结果,可是我ID当中已经有了这个记录的ID呀,所以说你刚才讲的这两点,对于本人这个例子我都分析过了,不存在你刚才讲的问题。
不管怎么样还是谢谢您真诚而又细致的指出这么细致的问题!谢谢你,你可不可以把你的邮箱告诉我呢?
#9
wangtaobig2006-03-22 19:12

我的QQ15934543 加我QQ时请说明来意!(我是JAVA爱好者)Email wangtao09081@sina.com.cn 你的问题解决了吗?

#10
wangtaobig2006-03-22 19:18

还有你把你的成程包括你自己写的那个连接数据库的类也发给我,明晚我去我邮箱里看的!

#11
shuimu2672006-03-23 18:34
wangtaobig你好!
我已经将那些原文件发送至你的邮箱,谢谢你!
#12
wangtaobig2006-03-23 22:12

你的程序我看了,和你在网上说的好像有点改动!我把你的网上写的那个程序考过来了,我没有ACCESS,我就改成SQL server了,试了试,没有什么问题!

#13
shuimu2672006-03-24 10:28

是的,我发给你的那程序与这只有一点点变化,只是多了一个判断随机数是否重复的功能!
我这还不能够解决呀?我想问你一下:
如果str是字符变量,且name属性也是字符型
String str="12";
String sql="select * from table where name='"+str+"'";如果这是字符变量完全是可以这样写的对吧。
且执行删除的话,没有任何问题
如果str是整形变量,且name属性也是整形
int str="12";
String sql="select * from table where name='"+str+"'"在SQL数据库里这样写好像也没有问题,而且在ACess里面调试时语法没有错误,如果执行删除,ResultSet不能够返回任何结果集。
再如果把String sql="select * from table where name=str"这句语句直接换成这种形式,如果执行删除语句的话,ResultSet有记录集,但却把数据表里面的所有记录都给删了。
我知道可能是这个整形表达式输写有问题!如果要正确输写的话,String sql="select * from table where name=???????应该是哪样的呢?
对了,我后来又给你了一封邮件,你有没有收到呀,要是收到的话,给我回邮件好不好呢?

#14
wangtaobig2006-03-25 09:00
哈哈你写的是什么啊?不明白!你是想select还是想deleter啊?
你看你写的是select,可又说执行删除!我晕了!

是这样子的,
第一,都是字符串对象(字符串是对象,不是变量,你怎么学的!)
String str="12";
String sql="select * from table where name='"+str+"'";
第二,str是int型
int str=12;(你看你写的int str="12",你能把字符串对象“12”付给整型变量str吗?)
String sql = "select * from table where name="+str;

#15
shuimu2672006-03-25 10:11
wangtaobig你好,实在是不好意思,因为是给你发贴子太紧张了,所以犯了这么多常识性的错误,因为我只是把我心里所想的全部写出来,也没得及检查,真的是那让你见笑,你提醒的是,小弟下次一定不会再犯这样的错误了,谢谢wangtaobig大哥,我给的发的邮件你有没有收到呢?
#16
wangtaobig2006-03-25 22:24
收到了!谢谢小弟·
1