1. 本周学习总结

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

  • java异常继承架构

2. 书面作业

本次PTA作业题集异常

1. 常用异常

题目5-1

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

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

ArrayIndexOutOfBoundsException判断数组下标是否越界抛出的异常。ClassCastException判断类型转换是否出错抛出的异常。NullPointerException判断需要对象的地方是否为null抛出的异常。IllegalArgumentException判断传入方法的参数是否合法或正确抛出的异常。

以上四个异常都为RuntimeException异常类的子类,RuntimeException异常类是Unchecked Exception(无须捕获),一般是对API的误用,无需try-catch。在编写程序时要注意尽量不要出现这些异常,比如在用户输入时,提示输入范围等说明。

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

当异常类是Exception的子类且非RuntimeException类时,需要进行Checked Exception捕获,需要使用try-catch或者throws说明异常发生时的处理情况,编译器会检查是否对异常进行处理。

  • 异常类的继承关系如图所示:

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

题目5-2

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

2.2 实验总结

了解了Integer.parseInt(String str)方法,该方法能够将数字型字符串转化为整型,如果该字符串类型不满足要求,则会抛出NumberFormatException异常。当出现异常时,需要i--,满足数组中的元素都为满足要求的整型元素。了解了Arrays.toString(arr[] arr)方法,能够遍历输出数组元素。

3. 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");//如果传入的字符串为空,则抛出异常,提示null。
} if (radix < Character.MIN_RADIX) {//Character.MIN_RADIX=2
throw new NumberFormatException("radix " + radix +
" less than Character.MIN_RADIX");
} if (radix > Character.MAX_RADIX) {// Character.MAX_RADIX=36
throw new NumberFormatException("radix " + radix +
" greater than Character.MAX_RADIX");//采用parseInt(String str)默认radix为10(表示最后转化为十进制),不会抛出这两个异常。
} int result = 0;//初始数字字符串的值为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);//对于给定的基数,假如是合法的字符(可以转化为数字),返回该数字值,否则返回-1
if (digit < 0) {
throw NumberFormatException.forInputString(s);
}
if (result < multmin) {//判断有无溢出
throw NumberFormatException.forInputString(s);
}
result *= radix;
if (result < limit + digit) {//判断加上最后一位digit有无溢出
throw NumberFormatException.forInputString(s);
}
result -= digit;
}
} else {
throw NumberFormatException.forInputString(s);//字符串为空
}
return negative ? result : -result;//转换成功,返回最后的结果
}

4. 函数题

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

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

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

如果多种异常中有父类子类的关系,需要将子类异常放在前面。这样当出现子类异常时,避免捕获成父类异常,从而达到我们捕获子类异常的目的。在eclipse中,若将父类异常放在子类异常前面会提示编译错误。

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

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关闭资源。

  • 红线部分出现以下提示,需要throws异常或try-catch。

  • 根据提示信息,进行try-catch,注意一些变量的初始化。
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Arrays; public class Main037 { public static void main(String[] args) throws IOException{
byte[] content = null;
FileInputStream fis = null;
try{
fis = new FileInputStream("testfis.txt");
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally{
if(fis==null)
fis.close();
}
int bytesAvailabe = 0;
try {
bytesAvailabe = fis.available();
} catch (IOException e) {
e.printStackTrace();
}//获得该文件可用的字节数
if(bytesAvailabe>0){
content = new byte[bytesAvailabe];//创建可容纳文件大小的数组
try {
fis.read(content);
} catch (IOException e) {
e.printStackTrace();
}//将文件内容读入数组 } System.out.println(Arrays.toString(content));//打印数组内容 } }

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

  • 在try后面圆括号写上尝试自动关闭资源的对象生成
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Arrays;
import java.util.Scanner; public class Main037 { public static void main(String[] args){
byte[] content = null;
FileInputStream fis = null;
try (Scanner sc=new Scanner(new FileInputStream("testfis.txt"))){
fis = new FileInputStream("testfis.txt");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
int bytesAvailabe = 0;
try {
bytesAvailabe = fis.available();
} catch (IOException e) {
e.printStackTrace();
}//获得该文件可用的字节数
if(bytesAvailabe>0){
content = new byte[bytesAvailabe];//创建可容纳文件大小的数组
try {
fis.read(content);
} catch (IOException e) {
e.printStackTrace();
}//将文件内容读入数组 } System.out.println(Arrays.toString(content));//打印数组内容 } }

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

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

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

  • 问题1;之前未考虑用户名为空的情况,这次在以前的基础上自定义抛出异常

  • 解决:当输入的用户名为空时,抛出异常并显示提示信息

public class Perinformation {

	String username;
String password;
public Perinformation(String username,String password){
if(username.length()==0){
throw new NullPointerException("用户名不能为空~");
}
this.username=username;
this.password=password;
}
public Perinformation(){ }
public String toString() {
return "Perinformation [username=" + username + ", password=" + password + "]";
}
}
  • 问题2;将商品信息放在Goods.txt文档中,运行程序时导入文档信息,并将信息存入相应对象中,此时需要注意文件不存在的情况且最后要关闭资源。

  • 解决:当导入的文件名不存在时,抛出异常。

Goods[] book=new Books[2];
FileInputStream fileInputStream = null;
Scanner sc = null;
try {
fileInputStream = new FileInputStream("Goods.txt");
sc = new Scanner(fileInputStream);
if(sc.hasNextLine()) {
book[0]=new Books(sc.nextLine(),sc.nextDouble(),sc.nextLine());
book[1]=new Books(sc.nextLine(),sc.nextDouble(),sc.nextLine());
}
}catch(FileNotFoundException e) {
e.printStackTrace();
}finally{
if(sc==null)
sc.close();
}

7. 选做:JavaFX入门

完成其中的作业3。内有代码,可在其上进行适当的改造。建议按照里面的教程,从头到尾自己搭建。

8. 选做:课外阅读

JavaTutorial中Questions and Exercises

3. 码云上代码提交记录

题目集:异常

3.1. 码云代码提交记录

在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图

4. 课外阅读

Best Practices for Exception Handling

Exception-Handling Antipatterns Blog

The exceptions debate

201521123037 《Java程序设计》第9周学习总结的更多相关文章

  1. 20145213《Java程序设计》第九周学习总结

    20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...

  2. 20145213《Java程序设计》第二周学习总结

    20145213<Java程序设计>第二周学习总结 教材学习内容总结 本周娄老师给的任务是学习教材的第三章--基础语法.其实我觉得还蛮轻松的,因为在翻开厚重的书本,一股熟悉的气息扑面而来, ...

  3. 20145213《Java程序设计》第一周学习总结

    20145213<Java程序设计>第一周学习总结 教材学习内容总结 期待了一个寒假,终于见识到了神秘的娄老师和他的Java课.虽说算不上金风玉露一相逢,没有胜却人间无数也是情理之中,但娄 ...

  4. 21045308刘昊阳 《Java程序设计》第九周学习总结

    21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ...

  5. 20145330孙文馨 《Java程序设计》第一周学习总结

    20145330孙文馨 <Java程序设计>第一周学习总结 教材学习内容总结 刚开始拿到这么厚一本书说没有压力是不可能的,开始从头看觉得很陌生进入不了状态,就稍微会有一点焦虑的感觉.于是就 ...

  6. 20145337 《Java程序设计》第九周学习总结

    20145337 <Java程序设计>第九周学习总结 教材学习内容总结 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JDBC可以 ...

  7. 20145337 《Java程序设计》第二周学习总结

    20145337 <Java程序设计>第二周学习总结 教材学习内容总结 Java可分基本类型与类类型: 基本类型分整数(short.int.long).字节(byte).浮点数(float ...

  8. 20145218《Java程序设计》第一周学习总结

    20145218 <Java程序设计>第一周学习总结 教材学习内容总结 今天下午看了Java学习的视频,感觉很是新奇,之前觉得Java学起来是艰难枯燥的,但通过第一章的学习觉得如果自己可以 ...

  9. 《Java程序设计》第九周学习总结

    20145224 <Java程序设计>第九周学习总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的 ...

  10. 《Java程序设计》第二周学习总结

    20145224陈颢文<Java程序设计>第二周学习总结 教材学习内容总结 一.类型.变量与运算符 1.类型 整数: 可细分为为short整数(占2字节),int整数(占4字节),long ...

随机推荐

  1. 如何理解iOS的“对象等同性”

    在iOS开发过程中,我们经常需要用到等同性来判断两个对象是否相等,通常我们会使用==来判断,但是这样比较出来的结果可能不是我们期望的:所以,一般我们会使用NSObject协议声明的isEqual方法来 ...

  2. cvpr2017:branchout——基于CNN的在线集成跟踪

    1.引言 2017年CVPR上有不少关于跟踪的paper.CF方面最引人瞩目的应该是ECO了,CNN方面也有一些新的进展.Branchout是一个基于CNN用bagging集成的在线跟踪方法. con ...

  3. 简单聊天室(java版)

    这是本人从其他地方学习到的关于聊天室的一个模本,我从中截取了一部分关于客户端和服务端通信的Socket的内容.希望对大家对socket有个了解,我写的这些代码可以实现两人或多人在多台电脑上实现简单的对 ...

  4. 【Tomcat】停止冗余进程

    tomcat多次连续启动,现在通过脚本,一次执行,全部停掉 [root@YFDT-DEM1701-EPMDM ~]# cat tomcat_pid.sh #!/bin/bash cat /dev/nu ...

  5. SpringMVC详解(六)------与json交互

    Json(JavaScript Object Notation),它是一种轻量级数据交换格式,格式简单,易于读写,目前使用特别广泛.那么这篇博客我们主要谈谈在 SpringMVC 中,如何对 json ...

  6. python 用户登录

    要求: 1.用户在登录之前要判断密码文件是否已经是锁定状态,如果是提示不让登录 2.登录用户密码输入错误3次,就锁定改用户,并更新文件内容 3.登录正确,提示欢迎登录信息 data.txt 文件内容: ...

  7. React渲染问题研究以及Immutable的应用

    写在前面 这里主要介绍自己在React开发中的一些总结,关于react的渲染问题的一点研究. 另外本人一直希望在React项目中尝试使用,因此在之前已经介绍过immutable的API,可以参看这里I ...

  8. DOM+面向对象面试题

    1.dom常见的节点类型---------------------------解彬1510-B 1.nodeType------节点类型,元素节点是1,文本节点是3. 2.firstChild---- ...

  9. 用最简单的方法判断JavaScript中this的指向

    目录 * 一个特例 * 开始判断 * 法则一:对象方法中的this指向对象本身(箭头函数形式的除外) * 法则二:多层嵌套函数中的this指向等同于包含该this的最近一个function的this ...

  10. C# 根据Excel模版导出文件

    string fileName = Path.Combine(Application.StartupPath, "kfwh_yhxf.xls"); Microsoft.Office ...