20165207 实验一 Java开发环境的熟悉
一、实验报告封面
课程:Java程序设计 班级:1652 姓名:李天林 学号:20165207
实验日期:2018年4月2日 实验序号:一
实验名称:Java开发环境的熟悉
二、实验内容
命令行下Java程序的开发
首先,按照要求根据我的学号创建名为20165207exp1的目录,并在该目录下创建子目录src以及bin,如图:
然后使用vim编辑器编写带包的代码,包名为ltl,如图:
再使用javac命令配合-d参数,在exp根目录下对带包的代码进行编译,用java名令加-cp参数运行可执行文件,由于包的存在写法应为ltl.Hello(带包名的前缀)。
集成开发环境Intellj IDEA中对Java程序的开发
在ubuntu中安装社区版的idea,安装完成后运行idea:
根据我JDK的安装路径配置好JDK之后,在idea中新建项目,项目位于之前建立的exp1目录中
右击src目录新建Java类
输入老师的教程中调试idea部分的代码:
在第五行单击即可设置行断点:
点击debug菜单中的run或者使用快捷键Alt+Shift+F9,开始调试程序:
然后点击stepover或者快捷键F8进行单步执行,快捷键F7所对应的stepinto也可以进行单步执行,但会进入函数当中。所以stepover可以节省一些时间优先被选择:
在下面的for语句处设置另一个行断点,使用快捷键F9或者点击resume,可以从上一个断点运行到这个断点:
for语句循环控制变量是100,但一次一次的单步执行进行循环比较费时,可以使用条件断点就能直接跳到循环控制变量为所需要的值的情况。如图,在断点上右击,于condition框中设置想要挑到的i的值50:
设置好条件断点之后按F9或者菜单里面的resume就可以转到i=50的情况,可以看到最下面的窗口里i的值已经被更新为50了:
然后我学习尝试设置临时断点,在断点上右击然后按提示的快捷键Alt+Shift+F8,进入临时短点的设置
选中RemoveOncehit设置临时断点,关掉窗口之后,可以看到11行的断点上面有一个1,我理解是运行到这里之后断点只生效一次:
按F9运行到临时断点:
再按F7执行到下一行就可以看到临时断点被取消了:
练习题
分析思路以及最终的代码
我的学号07%9+1=8,第八题为:产生一个随机数,让用户猜测,猜错了告诉用户是大了还是小了。 并进行测试(正常情况,异常情况,边界情况)
我的思路是按照用户的要求设置随机数生成的范围,然后在此范围中生成一个随机数,再对用户的输入进行判断并且可以通过循环控制是否继续猜数以及处理用户输入的异常情况。
根据这三部分的思路我最终设计得到了如下的代码:
setRange类用来设置随机数生成的范围,Judge类用来生成随机数以及供用户猜数
import java.util.*;
class setRange {
int x;
int setMAX(){
System.out.println("请输入你希望的随机数最大值");
Scanner reader = new Scanner(System.in);
int x = reader.nextInt();
return x;
}
int setMIN(){
System.out.println("请输入你希望的随机数最小值");
Scanner reader = new Scanner(System.in);
int x = reader.nextInt();
return x;
}
}
import java.util.*;
import java.io.*;
public class Judge {
public static void main(String args[]) {
int L = -2147483648; //下边界,int能取的最小值
int H = 2147483647; //上边界,int能取的最大值
int MAX,MIN;
setRange user = new setRange();
MAX = user.setMAX();
MIN = user.setMIN();
if(MAX<MIN){ //如果输入的范围异常,处理
do{
System.out.println("MAX<MIN,请重新输入");
MAX = user.setMAX();
MIN = user.setMIN();
}while(MAX<MIN);
}
Random rand = new Random();
int ranNum = rand.nextInt(MAX-MIN+1)+MIN; //生成随机数,范围MIN-MAX
char c; //声明字符型变量,在循环结束用来记录是否继续
do{ //循环,以防出现异常或者要继续猜
try{
System.out.println("开始猜数"); //开始猜
Scanner reader = new Scanner(System.in);
int guessNum=reader.nextInt(); //被猜的数
if(guessNum==ranNum){ //猜对
System.out.println("猜对了");
}
else if((guessNum>=MIN)&&(guessNum<=MAX)&&(guessNum>ranNum)){ //大了
System.out.println("大了");
}
else if((guessNum>=MIN)&&(guessNum<=MAX)&&(guessNum<ranNum)){ //小了
System.out.println("小了");
}
else {
System.out.println("输入的数不在您设定的范围里"); //不在输入的范围内
}
}
catch(InputMismatchException e){
System.out.println("输入数值超出了取值范围,异常");
}
System.out.println("--------------");
System.out.println("还猜不?输入y继续");
Scanner r = new Scanner(System.in);
String s = r.next(); //没有nextChar()这个方法,先读一个字符串
c = s.charAt(0); //读第一个y,转换成字符型,赋值给c
}while(c=='y'); //c在代码块外面声明,没有被释放
}
}
输出结果
下图包含正常情况、边界情况、异常情况的输出结果。
问题的解决过程
查找帮助手册得到生成随机数的方法:
输入过大的数据
开始时我向命令行输入了十个9发生了如下错误导致程序终止:
然后,我想先把用户的输入读取到long型数据中,然后再判断数据是否超出了int的范围如果没有超出则赋值给int型数据。但是,这种办法依旧是隔靴搔痒,如果输入超出了long的范围一样会抛出异常,导致程序终止。下面的截图中我输入long范围内的数据会提示越界,但超出其范围仍会终止:
最后,我使用了try-catch语句并且外加循环,也就是说在catch语句里抓到过大的数对应的这种异常,然后再提示用户数据过大产生异常,循环语句也给用户提供了重新猜数修正错误的空间。如果抛出异常则输出并询问是否继续猜数: