Java学习——Java异常处理(下)
文章目录
对上篇 Java异常处理(上) 的补充
一、异常处理
(1). 捕获异常
try-catch语句嵌套
举例:
import java.io.*;
import java.text.*;
import java.util.Date;
public class HelloWorld {
public static void main(String[] args) {
Date date = readDate();
System.out.println("读取的日期 = " + date);
}
//从文本中读取日期
public static Date readDate() {
FileInputStream readfile = null;
InputStreamReader ir = null;
BufferedReader in = null;
try {
readfile = new FileInputStream("src/test/readme.txt"); //从指定路径下获取文件
ir = new InputStreamReader(readfile);
in = new BufferedReader(ir); //从文本文件中获取内容
try {
String str = in.readLine(); //从获取从文本中获取的内容
System.out.println("此时从文本中获取的内容为:" + str); //输出从文本中获取的内容
if (str == null) { //文本内容为空
return null;
}
DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); //从文本中读取到该格式的日期
Date date = df.parse(str);
return date;
} catch (ParseException e) {
System.err.println("处理ParseException...");
e.printStackTrace();
}
} catch (FileNotFoundException e) {
System.err.println("处理FileNotFoundException...");
e.printStackTrace();
} catch (IOException e) {
System.err.println("处理IOException...");
e.printStackTrace();
}
return null;
}
}
运行正常的结果:
分析一下在代码中东西:
e.printStackTrace(),在命令行打印异常信息在程序中出错的位置及原因。(很不推荐),除了不断的刷控制台,并没有什么用处啊,更多的都是用 log 对象输出到日志文件里面。
最外层的 try 块处理的是从指定路径下获取文件,并从文件中获取内容,捕获的异常用了两个catch捕获两种异常类型:FileNotFoundException ,IOException 。
内层嵌套的 try 块 处理文本内容的固定格式内容并转换为 date形式。
FileInputStream、 InputStreamReader和BufferedReader是三个输入流。
不同的错误捕获情况:
从固定路径获取不到文件
文本中获取的内容不是我们需要的
注意:
- 程序执行时内层如果会发生异常,首先由内层catch 进行捕获,如果捕获不到,则由外层catch捕获。
- try-catch不仅可以嵌套在try代码块中, 还可以嵌套在catch代码块或finally代码块。
(2). 抛出异常
throws与声明方法抛出异常
在一个方法中如果能够处理异常,则需要捕获并处理。但是本方法没有能力处理该异常,捕获它没有任何意义,则需要在方法后面声明抛出该异常,通知上层调用者该方法有可以发生异常。
此关键字主要在方法的声明上使用,表示方法中不处理异常,而交给调用处处理。
格式:
返回值 方法名称() throws Exception{
}
throw关键字抛出异常
throw关键字表示在程序中人为的抛出一个异常,因为从异常处理机制来看,所有的异常一旦产生之后,实际上抛出 的就是一个异常类的实例化对象,那么此对象也可以由throw直接抛出。
代码:
throw new Exception("抛着玩的。") ;
二、自定义异常类
概念:
编写一个类, 继承Exception,并重写一参构造方法 即可完成自定义受检异常类型。
编写一个类, 继承RuntimeExcepion,并重写一参构造方法 即可完成自定义运行时异常类型。
示例:
class MyException extends Exception{ // 继承Exception,表示一个自定义异常类
public MyException(String msg){
super(msg) ; // 调用Exception中有一个参数的构造
}
};
自定义异常可以做很多事情, 例如:
class MyException extends Exception{
public MyException(String msg){
super(msg) ; //在这里给维护人员发短信或邮件, 告知程序出现了BUG。
}
};
举例含括自定义异常,throw 与 throws 关键字:
Test.java
public class Test {
public static void main(String[] args) throws NumberFormatException, OutNumberException {
int a = checkNum("21",0,10);
// int b = checkNum("aaa",0,10);
}
public static int checkNum(String str,int begin,int end) throws NumberFormatException, OutNumberException{ //表示方法中不处理异常,而交给调用处处理。
try {
int num = Integer.valueOf(str);
if(num<begin || num>end) {
throw new OutNumberException("输入数字的范围必须在" + begin + "与" + end + "之间!\n"); //手动抛出一个异常
}
return num;
}catch(NumberFormatException e) { //自定义异常,还需要创建一个NumberFormatException类继承Exception
throw new NumberFormatException("请输入数字!\n");
}
}
}
自定义异常类 OutNumberException.java
/**
* 自定义异常,当整数超出规定范围抛出异常
* @author Administrator
*
*/
public class OutNumberException extends Exception {
public OutNumberException(String message) {
super(message);
}
}
运行结果: