当程序运行过程中发生错误时,就会“ 抛出异常',抛出异常比终止程序要灵活得多,这是因为可以提供一个“ 捕获” 异常的处理器 (handler) 对异常情况进行处理。
如果没有提供处理器,程序就会终止,并在控制台上打印出一条信息, 其中给出了异常的类型。可能在前面已经看到过一些异常报告, 例如, 偶然使用了 null 引用或者数组越界等。
异常有两种类型: 未检查异常和已检查异常。 对于已检查异常, 编译器将会检查是否提供了处理器。 然而,有很多常见的异常, 例如,访问 null 引用, 都属于未检查异常。编译器不会査看是否为这些错误提供了处理器。毕竟,应该精心地编写代码来避免这些错误的发生, 而不要将精力花在编写异常处理器上。
下面我们举一个try...catch的小例子,
假如程序员a提供了一个方法借口供程序员b使用,b用它实现某些功能,最后呈现给客户c。
/**
* b呈现给客户c的方法。假设我们的打印是呈现给c的
* @param args
* @throws Exception
*/
public static void main(String[] args){
String num = "1234tr";
System.out.println(numberFormat(num));
}
/**
* a提供的数据转换的借口
* @param num
* @return
*/
public static int numberFormat(String num) {
int x = Integer.parseInt(num);
return x;
}
当遇到这种情况时,假如客户c传入了一个不规则的字符串,程序员a提供的方法就会直接打印出错误的异常,而程序员b有没有经过处理,直接把异常呈现给了客户c。客户c一看勃然大怒,什么垃圾程序。然后出现了一些列的问题。
Exception in thread "main" java.lang.NumberFormatException: For input string: "1234tr"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at Reflection.numberFormat(Reflection.java:11)
at Reflection.main(Reflection.java:7)
假如我们用这种方法:
首先,我们的程序员a先自己写了一个返回结果的类,定义为ResponseDemo.class
public class ResponseDemo<T> {
private Integer code; //错误代码,100为正确,101为错误
private String message; //错误信息
private T data; //转换后的数值存放处
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
@Override
public String toString() {
return "ResponseDemo [错误编码为=" + code + ", 错误信息为=" + message + ", 数据=" + data + "]";
}
}
然后程序员a完善了自己的接口方法:
public static ResponseDemo<Integer> numberFormat(String num) {
ResponseDemo<Integer> response = new ResponseDemo<>();
try {
int x = Integer.parseInt(num);
response.setCode(100);
response.setMessage("数据转化成功,已将值放入data下。");
response.setData(x);
} catch (Exception e) {
response.setCode(101);
response.setMessage("输入的字符串含有除了数字以外其他类型的格式,数据错误!");
}
return response;
}
然后程序员b也完善了自己的方法呈现给客户c:
/**
* b呈现给客户c的方法。假设我们的打印是呈现给c的
* @param args
* @throws Exception
*/
public static void main(String[] args){
String num = "1234tr";
ResponseDemo<Integer> reponse = numberFormat(num);
if(reponse.getCode() == 101) {
System.out.println(reponse.getMessage());
}else {
System.out.println(reponse.getData());
}
}
这样,即使客户c输入了错误的字符串,他也只会给程序员b返回这个对象:
ResponseDemo [错误编码为=101, 错误信息为=输入的字符串含有除了数字以外其他类型的格式,数据错误!, 数据=null]
然后程序员b通过对对象的处理,最后给客户c呈现了这样的信息:
输入的字符串含有除了数字以外其他类型的格式,数据错误!
然后客户c看到了这个信息,发现是自己的输入的信息有误,输入了正确的字符串。123456,然后继续执行:
123456
得到了自己想要的数据。就很开心。