try...catch的用法和作用(try...catch代替if...else)

当程序运行过程中发生错误时,就会“ 抛出异常’,抛出异常比终止程序要灵活得多,这是因为可以提供一个“ 捕获” 异常的处理器 (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

发布了68 篇原创文章 · 获赞 5 · 访问量 9808

猜你喜欢

转载自blog.csdn.net/weixin_44407691/article/details/103271642