Java牛角尖【007】:Java中的Error能不能被Catch

网上看到很多朋友说Java中Error是无法Catch到的,而Java中定义的Error类型又很难测试到,那就估且以为确是如此吧。

但是或许大家都有注意,我们时常会看到这样的代码

[java] view plain copy

  1. try{
  2. ...
  3. }catch(Throwable ex){
  4. ...
  5. }

其中catch中直接捕捉的是一个Throwable类,打开继承关系看一下,Exception和Error两个类同样是从Throwable类继承而来,那么,也就是说Error应该是可以被捕捉的,下面写个例子证明一下猜测:

[java] view plain copy

  1. package net.moon.demo.errorcatch;
  2. public class Demo {
  3. /**
  4. * @param args
  5. */
  6. public static void main(String[] args) {
  7. // TODO Auto-generated method stub
  8. try {
  9. throw new MyError("My Error");
  10. } catch (MyError e) {
  11. System.out.println(e.getMessage());
  12. }
  13. }
  14. }
  15. class MyError extends Error {
  16. /**
  17. *
  18. */
  19. private static final long serialVersionUID = 1L;
  20. public MyError() {
  21. super();
  22. // TODO Auto-generated constructor stub
  23. }
  24. public MyError(String message, Throwable cause) {
  25. super(message, cause);
  26. // TODO Auto-generated constructor stub
  27. }
  28. public MyError(String message) {
  29. super(message);
  30. // TODO Auto-generated constructor stub
  31. }
  32. public MyError(Throwable cause) {
  33. super(cause);
  34. // TODO Auto-generated constructor stub
  35. }
  36. }

执行一下以上代码,正如前面的猜测,Error一样是可以捕捉的,运行代码结果为:

[xhtml] view plain copy

  1. My Error

下面给个小例子,来验证一下error的捕获。

复制代码代码如下:

public class TestCatchError extends Error{

private static final long serialVersionUID = -351488225420878020L;

public TestCatchError(){
        super();
    }

public TestCatchError(String msg){
        super(msg);
    }

public static void main(String[] args) {
        try {
            throw new TestCatchError("test catch error");
        } catch (Throwable t) {
            System.out.println("step in the catch ~");
            t.printStackTrace();
        }
    }
}

运行结果:

复制代码代码如下:

step in the catch ~
TestCatchError: test catch error
at TestCatchError.main(TestCatchError.java:23)

时间: 2024-11-25 14:57:10

Java牛角尖【007】:Java中的Error能不能被Catch的相关文章

IDEA中打包Spark项目提示Error:(16, 48) java: -source 1.5 中不支持 lambda 表达式

在idea中新建了一Spark的项目,在做项目的编译打包的时候,提示如下错误信息: Error:(16, 48) java: -source 1.5 中不支持 lambda 表达式 (请使用 -source 8 或更高版本以启用 lambda 表达式) 解决方法是: 第一步: File --> Project Stucture 选择项目设置Lanugage level, 如下图所示 第二步: File --> Settings --> Compiler --> Java Compi

谈一谈Java中的Error和Exception

Error和Exception的联系 继承结构:Error和Exception都是继承于Throwable,RuntimeException继承自Exception. Error和RuntimeException及其子类称为未检查异常(Unchecked exception),其它异常成为受检查异常(Checked Exception). Error和Exception的区别 Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢出等.如java.lang.S

MVC模式在Java Web应用程序中的实例分析

MVC作为软件架构中及其重要的一种架构思想,在实际的java web项目开发中被开发者们广泛的应用.遵循MVC思想的所产生的解决方法也可以因实际情况的不同来进行不同的选择.这里以一个应用struts+hibernate+jsp的实例来进一步认识MVC. 学生管理系统中添加学生模块的的MVC架构: Model(系统的业务逻辑):Hibernate进行管理的数据实体+定义的业务逻辑的体现--------数据库操作类,也就是通常所说的Dao层 数据实体(PO,Entity): package PO;

resin WED服务器初用遇到的问题和解决方法 java.lang.RuntimeException: java.net.SocketException: Unrecognized Windows Socke ts error: 0: JVM_Bind

开启resin 服务器以后提示如下:(控制台不断的循环循环打印如下错误提示) java.lang.RuntimeException: java.net.SocketException: Unrecognized Windows Sockets error: 0: JVM_Bind at com.caucho.server.cluster.Server.start(Server.java:1191) at com.caucho.server.cluster.Cluster.startServer(

java.net.SocketException: Unrecognized Windows Sockets error: 0: JVM_Bind

当我们在启动tomcat服务的时候,出现报错信息:java.net.SocketException: Unrecognized Windows Sockets error: 0: JVM_Bin 分析:可能端口被占用引起的 解决方案:2种 (一) 直接修改tomcat服务器的端口 步骤: 1:找到tomcat->conf文件夹下server.xml文件 2.修改下面代码中的端口 <Connector port="8080" redirectPort="8443&q

java.util.regex.PatternSyntaxException: Unexpected internal error near index 1 \ ^

1 String a = "1991\12\16"; 2 String[] split = a.split("\\"); 3 System.out.println(new Gson().toJson(split)); 报错java.util.regex.PatternSyntaxException: Unexpected internal error near index 1 \  ^ 报这个错的原因是因为在java中“\”是一个转义字符,所以需要用两个代表一个.例

【JAVA学习】struts2 中 Actionsupport 的作用

尊重原创:http://xumiao900.iteye.com/blog/469760 Action 跟 Actionsupport 的区别 当我们在写action的时候,可以实现Action接口,也可以继承Actionsupport这个类.到底这两个有什么区别呢? Action接口有: public static final java.lang.String SUCCESS = "success"; public static final java.lang.String NONE

java面试题全集(中)

这部分主要是与Java Web和Web Service相关的面试题. 96.阐述Servlet和CGI的区别? 答:Servlet与CGI的区别在于Servlet处于服务器进程中,它通过多线程方式运行其service()方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于Servlet. 补充:Sun Microsystems公司在1996年发布Servlet技术就是为了和CGI进行竞争,Servlet是一个特殊的Java程

Java:继承关系中的构造函数(转)

1.构造函数不会被继承到子类. 2.子类的构造函数中的第一行(除注释外)必须是父类对象(super)的构造函数. 如果没有显示指定,则有两种情况: 1)如果父类有默认构造器(不带参数的构造器才是默认构造器),则会隐式地调用它(super()),此时不会出错: 2)如果父类没有默认构造器,则会出错. class Game { Game() { System.out.println("Game default constructor"); } Game(int i) { System.ou