异常
2018-11-19 00:13 YELLOWHYH 阅读(130) 评论(0) 编辑 收藏 举报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,请重新输入文件名
,然后尝试重新打开。 如果是其他异常则提示打开或读取文件失败!
。
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Arrays; public class Main { public static void main(String[] args) { byte[] content = null; FileInputStream fis = null; int bytesAvailabe; try { fis = new FileInputStream("testfis.txt"); bytesAvailabe = fis.available();// 获得该文件可用的字节数 if (bytesAvailabe > 0) { content = new byte[bytesAvailabe];// 创建可容纳文件大小的数组 fis.read(content);// 将文件内容读入数组 } } catch (FileNotFoundException e) { System.out.println("找不到文件testfis.txt,请重新输入文件名"); } catch (IOException e) { System.out.println("打开或读取文件失败!"); } finally { try { System.out.println("关闭文件ing"); if (fis != null) fis.close(); } catch (FileNotFoundException e) { System.out.println("关闭文件失败!"); } catch (IOException e) { e.printStackTrace(); } System.out.println(Arrays.toString(content));// 打印数组内容 } } }
注1:里面有多个方法均可能抛出异常。
功能2:需要添加finally
关闭文件。无论上面的代码是否产生异常,总要提示关闭文件ing
。如果关闭文件失败,提示关闭文件失败!
6.2 结合题集6-2
代码,要将什么样操作放在finally块?为什么?使用finally关闭资源需要注意一些什么?
答:
操作:关闭资源的操作
原因:当程序发生异常时,抛出异常之后的代码不会被执行,如果在发生异常前程序开启了相关资源,则代码可能无法正确关闭资源,而finally的语句块代码都会被执行,所以可以使用finally来释放资源。
注意:
1.首先要判断是否为null
2.即使是在关闭资源的时候也可能产生异常,需要捕获。
6.3 使用Java7中的try-with-resources
来改写上述代码实现自动关闭资源。简述这种方法有何好处?
import java.io.FileInputStream; import java.util.Arrays; public class Main { public static void main(String[] args) { 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) { e.printStackTrace(); } System.out.println(Arrays.toString(content)); } }
好处:使用上述代码实现自动关闭资源可以减少代码量,并且避免了在关闭时产生的其它异常。
7. 读取文件并组装对象
7.1 给出关键代码(需出现你的学号)。额外要求:捕获异常时,将错误的信息按照出错原因:行号:该行内容格式输出。
import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.NoSuchElementException; import java.util.Scanner; class User { String name; String id; String gender; int age; String address; public User(String name, String id, String gender, int age, String address) { super(); this.name = name; this.id = id; this.gender = gender; this.age = age; this.address = address; } } public class Test { public static void main(String[] args) throws FileNotFoundException { // TODO Auto-generated method stub Scanner in = new Scanner(new File("身份证号.txt")); ArrayList<User> list = new ArrayList<>(); int num = 0; String line = null; while (in.hasNextLine()) { try { line = in.nextLine();// 读出myfile.txt的下一行 num++; 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(); } list.add(new User(a1, a2, a3, Integer.parseInt(a4), a5)); System.out.println(a1 + " " + a2 + " " + a3 + " " + a4 + " " + a5); } catch (NoSuchElementException e) { e.printStackTrace(); } catch (NumberFormatException e) { // 字符转换为整数异常捕获 e.printStackTrace(); } catch (Exception e) { System.out.println(e + "错误出现在文件的第" + num + "行,为:" + line); } } } }
7.2 如果文件有上万行文本,出错的信息可能有很多行,如果将出错信息直接输出到控制台容易被忽略,请问如何解决?
答:尝试将所有出错信息存入文件中。