作业09-异常
作业09-异常
1. 本周学习总结
2.书面作业
1、常用异常
结合题集题目7-1回答
- 1.1 自己以前编写的代码中经常出现什么异常、需要捕获吗(为什么)?应如何避免?
经常出现NumberFormatException,即当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。该异常属于RuntimeException,不需要捕获。应该在程序的编写过程中多加注意。 - 1.2 什么样的异常要求用户一定要使用捕获处理?
在Exception子类中,除去RuntimeException,其他子类都是check Exception,也就是要求用户一定要使用捕获处理的异常,都需要try-catch来捕获,如果不处理这些异常,则不能进行编译,例如:CloneNotSupportedException, DataFormatException, DatatypeConfigurationException, DestroyFailedException等异常。
2. 处理异常使你的程序更加健壮
题集题目7-2
- 2.1 实验总结。并回答:怎么样才能让你的程序更加健壮?
这道题中产生的异常是“NumberFormatException”,可以使用Integer.parselent()方法时需要使用try-catch机制捕获异常,从而让程序更健壮。
3.throw与throws
题集题目7-3
阅读Integer.parsetInt源代码
- 3.1 Integer.parsetInt一开始就有大量的抛出异常的代码,这种做法有什么好处?
在一开始,它就考虑了多种能够产生该异常的情况进行异常的抛出,这样可以在传入的数据的时候就进行判断,看是否符合条件,这样可以避免传入错误的参数而导致程序崩溃的情况,同时可以使使用者知道自己为什么产生了异常,及时更正,使程序更加健壮。 - 3.2 结合自己编写的程序与3.1,分析自己编写的方法抛出异常时一般需要传递给调用者一些什么信息?
需要传递给调用者包含出错的详细信息,一般包括出错代码的位置,出错的详细原因的一个代表该错误的异常对象。
4.用异常改进ArrayIntegerStack
题集题目6-3
- 4.1 结合6-3代码,回答使用抛出异常的方式代表程序运行时出错有什么好处?比单纯的返回错误值,有何优点?
使用抛出异常的方法不仅可以显示错误类型,还可以具体实现错误的原因,方便使用者知道哪里出错如何进行修改。 - 4.2 如果一个方法内部的内码抛出的是RuntimeException类型的异常,那么方法声明是否应该使用throws关键字,如果使用throws关键字声明该方法抛出的异常,能给我们带来什么好处吗?
RuntimeException类型的异常不需要使用 throws 关键字,因为RuntimeException在java设计中所有方法都默认定义在throws中了。throws将异常不断向上层抛出,把异常和异常处理程序分开。
5. 函数题-多种异常的捕获
题集题目6-1
5.1 结合6-1代码,回答:一个try块中如果可能抛出多种异常,且异常之间可能有继承关系,捕获时需要注意些什么?
需要注意捕获的顺序。子类要在父类之前。
5.2 一个try块中如果可能抛出多种异常,使用Java8的多重异常捕获语法需要注意些什么?
子类在父类的左边。
6. 为如下代码加上异常处理
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));//打印数组内容
- 6.1 改正代码,并增加如下功能。当找不到文件时,需提示用户找不到文件xxx,请重新输入文件名,然后尝试重新打开。 如果是其他异常则提示打开或读取文件失败!。
注1:里面有多个方法均可能抛出异常。
功能2:需要添加finally关闭文件。无论上面的代码是否产生异常,总要提示关闭文件ing。如果关闭文件失败,提示关闭文件失败!
public static void main(String[] args) 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(NullPointerException e){//判断是否是空指针异常
System.out.println(e);
}
}
}
System.out.println(Arrays.toString(content));//打印数组内容
}
- 6.2 结合题集6-2代码,要将什么样操作放在finally块?为什么?使用finally关闭资源需要注意一些什么?
将一定要执行的代码放在 finally 块,因为 finally 中的语句一定会被执行。使用finally关闭资源时需要加 try-catch 块,因为这个部分也可能出错。 - 6.3 使用Java7中的try-with-resources来改写上述代码实现自动关闭资源。简述这种方法有何好处?
没有使用finally块,精简了代码,系统会自动关闭,不需要考虑资源关闭。
7. 读取文件并组装对象
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Scanner;
import java.util.Arrays;
public class ReadFileUsingScanner{
public static void main(String[] args) throws FileNotFoundException{
Scanner in = new Scanner(new File("身份证号.txt"));//为myfile.txt这个File创建一个扫描器in
while(in.hasNextLine()){
String line = in.nextLine();//读出myfile.txt的下一行
Scanner lineScanner = new Scanner(line);//为每一行建立一个扫描器
//System.out.println("lineScanner="+lineScanner);
lineScanner.useDelimiter(" ");//使用空格作为分隔符
//System.out.println(line);
String a1 = lineScanner.next();//姓名
String a2 = lineScanner.next();//身份证号
String a3 = lineScanner.next();//性别
String a4 = lineScanner.next();//年龄
String a5 = lineScanner.next();//地址
while(lineScanner.hasNext()){//谨防地址只有一段
a5 += lineScanner.next();
}
System.out.println(a1+a2+a3+a4+a5);
}
in.close();
}
}
实验任务书中中的题目3:读取文件并组装对象
7.1 给出关键代码(需出现你的学号)。额外要求:捕获异常时,将错误的信息按照出错原因:行号:该行内容格式输出。
public class ReadFileUsingScanner{
public static void main(String[] args) throws FileNotFoundException{
Scanner in = new Scanner(new File("身份证号.txt"));//为myfile.txt这个File创建一个扫描器in
int n = 0; //记录行号
while(in.hasNextLine()){
String line = in.nextLine();//读出myfile.txt的下一行
n++;
Scanner lineScanner = new Scanner(line);//为每一行建立一个扫描器
//System.out.println("lineScanner="+lineScanner);
lineScanner.useDelimiter(" ");//使用空格作为分隔符
//System.out.println(line);
try {
String a1 = lineScanner.next();//姓名
String a2 = lineScanner.next();//身份证号
String a3 = lineScanner.next();//性别
String a4 = lineScanner.next();//年龄
String a5 = lineScanner.next();//地址
while(lineScanner.hasNext()){//谨防地址只有一段
a5 += lineScanner.next();
}
System.out.println(a1+a2+a3+a4+a5);
} catch (Exception e) {
System.out.println("第"+ n +"行发生错误:"+ e +" 该行内容为: "+ line );
}
}
in.close();
}
}
- 7.2 如果文件有上万行文本,出错的信息可能有很多行,如果将出错信息直接输出到控制台容易被忽略,请问如何解决?
将所有出错信息存入文件中。