Java 异常处理
throw、throws、try 和 catch 的区别
throw
: 应用在方法体中,用于抛出异常。当方法在执行过程中遇到异常情况时,将异常信息封装为异常对象,然后向调用方法对象 throwthrows
: 应用在方法的声明中,表示该方法可能会抛出的异常,允许 throws 后面跟着多个异常类型try 和 catch
: 应用在代码块中,当部分代码可能存在异常时使用,将肯能存在异常的代码放在 try 代码块中,在 catch 只处理已知且可能出现的异常正确的个人理解是,不要无意义的乱用 try,catch,不能让这个来作为业务的一部分,除非有些情况下它的确可以,比如判断输入的字符串是不是可以转化为 int,如果不可以,则赋值 0,因为这是业务上需要的,但如果业务不允许赋值 0,那么你就应该将异常抛出,而不是自作主张的 catch,反正这个是一个需要把握的问题,一般情况下,应当将异常层层抛出,由 最外层 来决定如何处理异常
其实很简单,过程不可控的时候,如网络通信,中间网络是否稳定是软件所无法控制的,可以 try。如本地操作数据库或者文件,都是可控的,不要用 try
关于 Try,Catch 的正确用法 8 楼写得很好,用了 try catch 但是没有对异常进行处理,只是单纯抛出异常会导致异常的StackTrace
信息混乱,所以如果对异常不处理一般不 catch 异常,如果在 mvc 的 controller 层做日志记录,可以catch (Exception e) {log.error("接口调用异常"); throw;};
try 与 catch 解决程序异常
public class HelloWorld {
public static void main(String[] args) {
// try 代码有异常 异常点以后代码不执行 直接执行 catch 以及之后的代码
try {
int x = 5 / 0;
System.out.println(x);
} catch (Exception e) {
// 展开错误栈
e.printStackTrace();
}
System.out.println("program is still running here!");
}
}
catch 多个异常
public class HelloWorld {
public static void main(String[] args) {
try {
foo();
bar();
// 分别按照顺序查看多个异常,当有一个异常匹配中的时候就按照顺序检查异常
} catch (BlogAppException e) {
e.printStackTrace();
} catch (ArithmeticException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("program is still running here!");
}
}
finally 关键字
在 try/catch 语句后,我们还可以有个 finally 语句,finally 语句中的代码块不管异常是否被捕获总是要被执行的.我们将上面的程序作如下修改,来看看 finally 语句的用法与作用
public class HelloWorld {
public static void main(String[] args) {
try {
foo();
bar();
} catch (BlogAppException e) {
e.printStackTrace();
return;
} catch (ArithmeticException e) {
e.printStackTrace();
return; // 即使这里 return 了,依然会执行 finally 中的语句
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("programe will run `finally` code block!");
}
System.out.println("program is still running here!");
}
}
throws
如果一个方法中的语句执行时可能生成某种异常,但是并不能确定如何处理,则此方法应声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理
public class HelloWorld {
// throws 关键字将方法异常交给其调用者
// throws 的异常应该是更加具体粒度更加细的
private static void foo() throws Exception {
int x = 5 / 0;
System.out.println(x);
}
public static void main(String[] args) {
try {
foo();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("program is still running here!");
}
}
常见异常
ArithmeticException
(在算术运算中发生的异常,如除以零)NullPointerException
(变量还没有指向一个对象,就引用这个对象的成员)ArrayIndexOutOfBoundsException
(访问数组对象中不存在的元素)IllegalArgumentException
: 参数为空,确保参数的值不为空 IllegalArgumentException or NullPointerException for a null parameter
自定义异常
用户自定义异常类,只需继承 Exception
类即可.在程序中使用自定义异常类,大体可分为以下几个步骤:
- 创建自定义异常类
- 在方法中通过 throw 关键字抛出异常对象
- 如果在当前抛出异常的方法中处理异常,可以使用 try-catch 语句捕获并处理;否则在方法的声明处通过
throws
关键字向方法调用者抛出异常 - 在出现异常方法的调用者中捕获并处理异常
// cat BlogAppException.java
public class BlogAppException extends Exception {
private static final long serialVersionUID = 1L;
private String command;// 可以给自定义异常增加成员变量,用以保存额外的异常信息
public BlogAppException(String command) {
this.command = command;
}
public String toString(){
return "Exception happened when executing command " + command;
}
}
// cat HelloWorld.java
public class HelloWorld {
private static void bar() throws BlogAppException {
System.out.println("let's assume BlogAppException happened when executing `create` command");
// 为了演示,这里我们假设执行 create 命令时,抛出了异常
throw new BlogAppException("create");
}
private static void foo() throws ArithmeticException {
int x = 5 / 0;
System.out.println(x);
}
public static void main(String[] args) {
try {
foo();
bar();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("program is still running here!");
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论