1.本周学习总结

1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容。

2.书面作业

Q1.常用异常

题目5-1

1.1 截图你的提交结果(出现学号)

1.2 自己以前编写的代码中经常出现什么异常、需要捕获吗(为什么)?应如何避免?

答:我以前的代码中经常出现访问空指针(NullPointerException)和数组越界(ArrayIndexOutOfBoundsException)
(1)访问空指针(NullPointerException)
该异常由系统检测,属于Unchecked Exception,故无需使用try catch进行异常捕获。所以我们在写代码时需要用到if语句判断是否为空,来避免出现NullPointerException;
(2)数组越界(ArrayIndexOutOfBoundsException)
该异常由系统检测,属于Unchecked Exception,故无需使用try catch进行异常捕获。我们应尽量改进代码,不让数组下标越界,避免出现ArrayIndexOutOfBoundsException。

1.3 什么样的异常要求用户一定要使用捕获处理?

答:除了Error与RuntimeException及其子类以外的异常都是Check Exception,需要在代码中使用try catch进行捕获处理。

Q2.处理异常使你的程序更加健壮

题目5-2

2.1 截图你的提交结果(出现学号)

2.2 实验总结

答:此题是非整型字符串的捕获。当输入数组中的值不是整型时,需要捕获异常,而且需要将其删除,所以需要注意的是捕获异常后需要对数组下标进行i--操作。具体代码如下:
catch(NumberFormatException e){
System.out.println(e);
i--;
}

Q3.throw与throws

题目5-3

3.1 截图你的提交结果(出现学号)

3.2 阅读Integer.parsetInt源代码,结合3.1说说抛出异常时需要传递给调用者一些什么信息?

Integer.parsetInt源代码:
public static int parseInt(String s) throws NumberFormatException {
return parseInt(s,10);
} public static int parseInt(String s, int radix)
throws NumberFormatException
{
/*
* WARNING: This method may be invoked early during VM initialization
* before IntegerCache is initialized. Care must be taken to not use
* the valueOf method.
*/ if (s == null) {
throw new NumberFormatException("null");
} if (radix < Character.MIN_RADIX) {
throw new NumberFormatException("radix " + radix +
" less than Character.MIN_RADIX");
} if (radix > Character.MAX_RADIX) {
throw new NumberFormatException("radix " + radix +
" greater than Character.MAX_RADIX");
} int result = 0;
boolean negative = false;
int i = 0, len = s.length();
int limit = -Integer.MAX_VALUE;
int multmin;
int digit; if (len > 0) {
char firstChar = s.charAt(0);
if (firstChar < '0') { // Possible leading "+" or "-"
if (firstChar == '-') {
negative = true;
limit = Integer.MIN_VALUE;
} else if (firstChar != '+')
throw NumberFormatException.forInputString(s); if (len == 1) // Cannot have lone "+" or "-"
throw NumberFormatException.forInputString(s);
i++;
}
multmin = limit / radix;
while (i < len) {
// Accumulating negatively avoids surprises near MAX_VALUE
digit = Character.digit(s.charAt(i++),radix);
if (digit < 0) {
throw NumberFormatException.forInputString(s);
}
if (result < multmin) {
throw NumberFormatException.forInputString(s);
}
result *= radix;
if (result < limit + digit) {
throw NumberFormatException.forInputString(s);
}
result -= digit;
}
} else {
throw NumberFormatException.forInputString(s);
}
return negative ? result : -result;
}
答:查看源代码,发现要先使用throws抛出异常,然后if语句中使用throw抛出具体的异常原因。结合题目5-3,要求begin<end,begin不得小于0,end不得大于arr.length,否则抛出相应的异常(IllegalArgumentException`)。所以在函数名后面要使用throws,代码为public static double findMax(double[] arr,int begin, int end)throws IllegalArgumentException; 然后再具体分析不同情况if(begin>=end),if(begin<0),if(end>arr.length)抛出具体的异常原因。这样显示不同异常及其出现异常的不同情况时的原因,可以让用户立即知道出现错误的原因,做出及时的修改。

Q4.函数题

题目4-1(多种异常的捕获)

3.1 截图你的提交结果(出现学号)

3.2 一个try块中如果可能抛出多种异常,捕获时需要注意些什么?

答:当抛出多种异常时,在写catch时要注意将子类异常写在父类异常前面。若父类异常在前面。则不执行子类异常的捕获,编译会出现错误。例如:
catch(NumberFormatException e1){
System.out.println(e1);//执行,若捕获到,则输出NumberFormatException;
}
catch(IllegalArgumentException e2){
System.out.println(e2);//执行,若捕获到,则输出IllegalArgumentException;
}
catch(Exception e3){
System.out.println(e3);//执行,若捕获到,则输出Exception;
} 当改变三种异常的顺序时:
catch(Exception e3){
System.out.println(e3);//执行,若捕获到,则输出Exception;
}
catch(NumberFormatException e1){
System.out.println(e1);//不执行;
}
catch(IllegalArgumentException e2){
System.out.println(e2);//不执行;
}
出现编译错误。

Q5.为如下代码加上异常处理

byte[] content = null;
FileInputStream fis = new FileInputStream("testfis.txt");
int bytesAvailabe = fis.available();//获得该文件可用的字节数
if(bytesAvailabe>0){
content = new byte[bytesAvailabe];//创建可容纳文件大小的数组
fis.read(content);//将文件内容读入数组
}
System.out.println(Arrays.toString(content));//打印数组内容

5.1 改正代码,让其可正常运行。注1:里面有多个方法均可能抛出异常。注2:要使用finally关闭资源。

修改后代码:
public static void main(String[] args, Object fis) throws IOException {
byte[] content = null;
FileInputStream fis=null;
try{
fis = new FileInputStream("testfis.txt");
int bytesAvailabe = fis.available();//获得该文件可用的字节数
if(bytesAvailabe>0){
content = new byte[bytesAvailabe];//创建可容纳文件大小的数组
fis.read(content);//将文件内容读入数组
}
}catch(Exception e){
System.out.println(e);
}
finally
{
if(fis!=null)
try{
fis.close();
}
catch(Exception e){
System.out.println(e);
}
}
System.out.println(Arrays.toString(content));//打印数组内容
}

结果截图:

5.2 使用Java7中的try-with-resources来改写上述代码实现自动关闭资源.常用异常

public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
byte[] content = null;
try(FileInputStream fis = new FileInputStream("testfis.txt")){
int bytesAvailabe = fis.available();//获得该文件可用的字节数
if(bytesAvailabe>0){
content = new byte[bytesAvailabe];//创建可容纳文件大小的数组
fis.read(content);//将文件内容读入数组
}
}catch(Exception e){
System.out.println(e);
}
System.out.println(Arrays.toString(content));//打印数组内容
}

结果截图:

Q6.重点考核:使用异常改进你的购物车系统(未提交,得分不超过6分)

举至少两个例子说明你是如何使用异常处理机制让你的程序变得更健壮。

说明要包含2个部分:1. 问题说明(哪里会碰到异常)。2.解决方案(关键代码)

1.问题说明

(1)当购买一件商品后,开始进行选择"是否继续购买,1.继续,0.退出"时,若出现输入的是其他字符就会出现异常;
(2)当输入购买的商品数量时,若输入的是其他字符,不是整型数时会出现异常。

2.关键代码

(1)
System.out.println("是否继续购买,1.继续,0.退出");
try{
r=in.nextInt();
}catch(InputMismatchException e){
System.out.println(e);
}
(2)
System.out.print("请输入购买的数量:");
try{for(int j=0;j<10;j++){
if(a[j].getName().equals(str)){
Goods b=new Goods(a[j].getName(),a[j].getId(),a[j].getPrice(),in.nextInt());
com.add(b);
break;
}
}
}catch(NumberFormatException e1){
System.out.println(e1);
}

3.码云上代码提交记录

3.1码云代码提交记录

201521123027 <java程序设计>第九周学习总结的更多相关文章

  1. 20145220java程序设计第九周学习总结

    20145220java程序设计第九周学习总结 教材学习内容总结 JBDC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商对接口直接操作,开发人员无须接触底层数据可驱动程序的差异 ...

  2. 201771010134杨其菊《面向对象程序设计java》第九周学习总结

                                                                      第九周学习总结 第一部分:理论知识 异常.断言和调试.日志 1.捕获 ...

  3. 201521044152<java程序设计>第一周学习总结

    本周学习总结 java开发时间虽然很短,但是发展迅速,已成为现在非常流行的一门语言,很开心能有幸学习java.第一周学习了java的平台,运行环境jdk以及jrt等等新名词,还了解了eclipse的基 ...

  4. 20145304 刘钦令 Java程序设计第二周学习总结

    20145304 <Java程序设计>第2周学习总结 教材学习内容总结 java可区分基本类型和类类型(即参考类型)两大类型系统. 基本类型主要可区分为整数.字节.浮点数.字符与布尔. 整 ...

  5. 20145304 刘钦令 Java程序设计第一周学习总结

    20145304<Java程序设计>第1周学习总结 教材学习内容总结 1995年5月23日,是公认的Java的诞生日,Java正式由Oak改名为Java. Java的三大平台是:Java ...

  6. 201621123007 Java程序设计第一周 学习总结

    第一周-Java基本概念 201621123007 <Java程序设计> 第一周学习总结 1. 本周学习总结 java是面向对象的一类语言,三大特征:封装性,继承性,多态性. jdk jr ...

  7. 马凯军201771010116《面向对象与程序设计Java》第九周学习总结

    一.理论知识部分 异常.日志.断言和调试 1.异常:在程序的执行过程中所发生的异常事件,它中断指令的正常执行. 2.Java的异常处理机制可以控制程序从错误产生的位置转移到能够进行错误处理的位置. 3 ...

  8. 201521123063 JAVA程序设计 第二周学习总结

    1.本周学习重点(2.27-3.5) java中的数组 以二维数组为例,数组名为scores,则 (1)先声明数组 int[][] scores;或int scores[][];或int[] scor ...

  9. 《Java》第九周学习总结

    下载mysql 选择mysql的管理软件 idea可以直接连接 然后用库运行程序,但是没有截图,,因为想在navicat上试试,可惜速度太慢了 打开idea又很慢,所以明天再更新

随机推荐

  1. Java微信公众平台开发之获取地理位置

    本部分需要用到微信的JS-SDK,微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包.通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统 ...

  2. LxNx前端F2F面试问题整理

    LxNx前端面试问题: 1. 你用过前端哪些框架?它们项目中会用到Angular.js Backbone.js 我回答jQuery, bootstrap, 而Augular.js只是学过 2. 那既然 ...

  3. easyui 时间段校验,开始时间小于结束时间,并且时间间隔不能超过30天

    //对easyui datetimebox的验证,开始时间要小于结束时间function validateDateTime(beginTimeId,endTimeId,whichTimeId){ co ...

  4. jenkins 多选框

    背景jenkins自带的参数化不支持多选框,不过有插件支持:Extended Choice Parameter Plug-In插件地址: https://plugins.jenkins.io/exte ...

  5. 内存数据库之Apache Ingite

    上一篇文章,我们做了内存数据库的技术选型: 内存数据库技术选型 本文中,我们继续深入研究Apache Ignite,同时分享一些我们.Net的编码实践. 首先,Apache Ignite是一个内存数据 ...

  6. 安装zsh后出现命令行无法识别已安装的node

    安装zsh之后,在命令行输入 node -v,会出现 command not found: node. 出现原因是:使用bash输入终端指令识别得是~/.bash_profile,而安装zsh则无法识 ...

  7. TP-Link路由器的设置向导

    TP-Link路由器的设置向导.. 一.准备工作: 1.首先是路由器的安装,主要是将路由器电源接上,并通电,然后就是网线的连接.如果是拨号上网用户,请将猫引出的网线插入到TP-Link路由器最特别的一 ...

  8. poj2912 Rochambeau

    Description N children are playing Rochambeau (scissors-rock-cloth) game with you. One of them is th ...

  9. Keep in Mind

    Do not undermine your worth by comparing yourself with others.It is because we are different and eac ...

  10. js实现非模态窗口增加数据后刷新父窗口数据

    父窗口是由两个部分组成,一个html的table,一部分是extjs的gird. 点击grid面板[增加]按钮将会弹出非模态窗口进行新数据的编辑页面 下面是按钮的触发函数代码: var a = win ...