一、问题
在java代码开发过程中,我们会有一个异常代码处理机制;
1.内存溢出之类的,非代码影响的,代码维度内我们处理不了,不在讨论范围内;
2.运行时异常,代码不会自动检测异常;这是我们处理的重点;
3.非运行时异常,代码工具会自动检测,不处理不让运行;
那么怎么处理这些异常类呢?
二、详解
1.e.printStackTrace();
只是打印栈路径,不影响try-catch之外的代码的执行;
public class TestException {
public static void main(String[] args) {
System.out.println("开始");
String name = "tom cat";
name = null;
name = toUpperCase(name);
System.out.println(name);
System.out.println("结束");
}
private static String toUpperCase(String name){
try{
name = "【"+name.toUpperCase()+"】";
}catch (Exception e){
e.printStackTrace();
//throw new Exception("查询用户列表报错");
}
return name;
}
}
运行结果如下:
2.try-catch-throw异常
try用于监控异常区域,catch用于处理异常情况,throw是用于抛出异常,将底层的异常抛到上层,最后由上层统一处理;单个抛出的异常类需要继承java.lang.Exception;
我们将toUpperCase这个方法直接抛出异常,即throws Exception,这样,try监控的错误一旦被发现,就会被抓取,并且打印栈路径,注意,这里是把栈错误的路径打出来,而不是报错(虽然他是红色的);
接下来,我们发现,main方法总的该方法下面也有红色波浪线,它说该方法没有处理异常类,这是运行时异常,要去我们必须处理完之后才能运行;所以,接下来,我们要对该方法可能会抛出的异常类做处理;一般有两个方法:
1、直接抛出,直接抛出的结果是,try-catch后面的代码将不会执行,如果你的业务需求是,只要出错了,就不让它继续执行,你可以采取这种方法;这就好比,一旦停电,电灯就灭了;
2、采用try-catch抓取,然后人为处理(不抛出异常);这种方式处理的好处是,try监控的区域出现错误,你可以运行catch里面的代码,并且继续执行catch外面的代码;这种方式的好处是,如果出错,我会自己处理,并让他继续执行后面的代码;这就好比,虽然停电了,但是我有备用电源,一旦感应器感应到停掉,就接入备用电源,这样点灯可以继续亮着;
另外,引用该方法的类,也需要处理这个异常,因为该方法将异常抛了出去,谁引用了该方法,谁就要接这个异常,并处理;
现在,我们处理后的代码如下:
public class TestException {
/**
* 1.main 方法
* @param args
*/
public static void main(String[] args) {
System.out.println("开始");
String name = "tom cat";
name = null;
try {
name = toUpperCase(name);
} catch (Exception e) {
// e.printStackTrace();
System.out.println("运行toUpperCase方法报错啦~");
}
//System.out.println(name);
System.out.println("结束");
}
/**
* 2.底层方法
* @param name
* @return
* @throws Exception
*/
private static String toUpperCase(String name) throws Exception {
try{
name = "【"+name.toUpperCase()+"】";
}catch (Exception e){
//e.printStackTrace();
throw new Exception("查询用户列表报错");
}
return name;
}
}
运行后的结果如下:
三、总结
一般报错,可以分为两种报错模式,一种是逻辑性错误,例如空指针,数据格式错误等;另一种是业务性错误,执行到具体某个节点时报错;
你如果要将异常情况给业务人员看,那就一定要将系统报错的异常,转换成业务异常,抛出给他们看,他们看不懂什么NullPointerException,你要告诉他,到底是执行到某个业务节点错误,还是具体某个参数【输入参数为空】这类信息等;程序员追踪报错信息,可以根据logger日志,或者e.printStackTrace()来追踪;