有个java 异常问题不解。。

问题描述

public class ClassA {public ClassA()throws Exception{// TODO Auto-generated constructor stubtry{throw new RuntimeException("bbbbbbbbbb");}catch(RuntimeException e){throw new Exception("cccccccc"+ e.getMessage(),e);}}}public class CatchExceptionTest {public static void main(String[] args){try{Class throttleClass = Class.forName("ClassA");Constructor c = throttleClass.getConstructor();ClassA a = (ClassA)c.newInstance();}catch(RuntimeException ee){System.out.println("11111111");System.out.println(ee.getMessage());}catch(Exception e){System.out.println("222222222 " + e.toString());System.out.println(e.getMessage());}}}求主方法执行的结果, 以及出现的原因。。。 问题补充:zhanjia 写道

解决方案

/** * 自定义异常类 * */public class CustomException extends Exception {/** 自定义错误代码 */private String errorCode;public CustomException() {super();}public CustomException(String message, Throwable cause) {super(message, cause);}public CustomException(String message) {super(message);}public CustomException(Throwable cause) {super(cause);}/** * 添加一个自定义的code属性 * * @param errorCode * @param message * @param cause */public CustomException(String errorCode, String message, Throwable cause) {super(message, cause);this.errorCode = errorCode;}public String getErrorCode() {return errorCode;}public void setErrorCode(String errorCode) {this.errorCode = errorCode;}}// 构造异常new CustomException("errorA", "异常A", e);new CustomException("errorB", "异常B", e);捕捉:try { ....} catch (CustomException ce) { System.out.println(ce.getErrorCode());}
解决方案二:
引用最后一条语句 打印出来的 e.getMessage()是为空的呀这个e是 java.lang.reflect.InvocationTargetException ,它的 message 属性为 null 。
解决方案三:
引用就是说什么情况下 我们需要 使用 "" + e.getCause().getMessage() 是取决于前面try{}块里调用的方法, 是吧?取决于try {}块内封装异常的方式(一般是通过不同的构造函数实现)如果我们自定义异常类,继承Exception或RuntimeException,我们也可以自定义其他属性来封装我们的异常信息,怎么获取也可以自定义
解决方案四:
引用就是说什么情况下 我们需要 使用 "" + e.getCause().getMessage() 是取决于前面try{}块里调用的方法, 是吧?不对。 e.getCause() 是得到谁引起这个异常,还可以 e.getCause().getCause(),直接找到最根本那个异常。任何异常都有 getMessage()
解决方案五:
引用所以这个detailMessage的掩盖 归结为c.newInstance()的源码实现问题,是则这样吧 ? 对!
解决方案六:
1、ClassA a = (ClassA) c.newInstance();使用的异常封装方法是:public InvocationTargetException(Throwable target) { super((Throwable)null); // Disallow initCause this.target = target; }这个需要获取到target对象,才能获取到我们写入的提示信息2、而一般我们用的方法是:throw new Exception("B异常信息 : " + e.getMessage(), e);构造函数为public Exception(String message, Throwable cause) { super(message, cause);}所以这个用getMessage()可以直接获取到信息
解决方案七:
如果是你自己定的类,自己捕捉异常,只需要打印出你自己定义的信息:public class A {public A() throws Exception {try {throw new RuntimeException("A-RuntimeException");} catch (RuntimeException e) {throw new Exception("A异常信息 : " + e.getMessage(), e);}}}public class B {public B() throws Exception {try {new A();} catch (Exception e) {throw new Exception("B异常信息 : " + e.getMessage(), e);}}}public class C {public static void main(String[] args) {try {new B();} catch (Exception e) {System.out.println(e.getMessage());}}}结果:B异常信息 : A异常信息 : A-RuntimeException这个就是你想要的了
解决方案八:
引用但是想上面那种掩盖异常信息 只会出现在 反射调用中么, 如果平常自定的方法调用也会掩盖异常信息, 能给出个示列么 ?c.newInstance(); 会在遇到异常时封装一次。而直接调用就滑谁封装了。java.lang.reflect.InvocationTargetExceptionat sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)at java.lang.reflect.Constructor.newInstance(Constructor.java:513)at com.zsoft.test.Test.main(Test.java:87)Caused by: java.lang.Exception: ccccccccbbbbbbbbbbat com.zsoft.test.ClassA.<init>(Test.java:133)... 5 moreCaused by: java.lang.RuntimeException: bbbbbbbbbbat com.zsoft.test.ClassA.<init>(Test.java:131)... 5 more
解决方案:
public class Exception extends Throwable { static final long serialVersionUID = -3387516993124229948L; public Exception() {super(); } public Exception(String message) {super(message); } public Exception(String message, Throwable cause) { super(message, cause); }.....只要throw new xxxxException(String) 就能取到了。而所有的XXXException又是Exception的子类
解决方案:
引用但是想上面那种掩盖异常信息 只会出现在 反射调用中么, 如果平常自定的方法调用也会掩盖异常信息, 能给出个示列么 ? 在MVC中,一般有Action、Service、DAO三层DAO抛异常Service可以捕捉到Service抛异常Action可以捕捉到这种是没问题的上面这种情况,由于不是调用自己的方法,处理异常的方式不是自己控制的而已。事实上不会被屏蔽,最多就被封装到e.getCause() 对应的对象中所以通过e.getMessage()或e.getCause()是可以获取抛出的信息的
解决方案:
引用我的 结果 是 22222222java.lang.reflect.ClassNotFoundException ClassA 那是找不到ClassA这个类。Class.forName("ClassA"); 这里要加上包名,如 Class.forName("org.test.ClassA");
解决方案:
可以得到public class ClassA { public ClassA()throws Exception{ // TODO Auto-generated constructor stub try{ throw new RuntimeException("bbbbbbbbbb"); }catch(RuntimeException e){ throw new Exception("cccccccc"+ e.getMessage(),e); } } } 中的 "cccccccc"+ e.getMessage()
解决方案:
前面说的:引用ClassA a = (ClassA) c.newInstance(); 之所以后面会输出null,是因为在c.newInstance()调用的代码中被屏蔽了异常 不太对c.newInstance();捕捉到异常会封装到java.lang.reflect.InvocationTargetException中当c.newInstance()抛出异常时,会使用 public InvocationTargetException(Throwable target) { super((Throwable)null); // Disallow initCause this.target = target; }构造函数来封装,即将ClassA的异常存放在InvocationTargetException类中的target对象中而e.getMessage()是在InvocationTargetException的父父类Throwable中定义的,如下:private String detailMessage;public String getMessage() { return detailMessage;}由于异常保存在target中,detailMessage为空,所以会打印出null继承关系如下:public class InvocationTargetException extends Exceptionpublic class Exception extends Throwable
解决方案:
引用e.getCause() 是跟 e。printstacktrace()一样的效果么? 不同,前者是获取private Throwable cause; 这个对象如果 cause 不存在或未知,则返回 null后者:将此 throwable 及其追踪输出至标准错误流。此方法将此 Throwable 对象的堆栈跟踪输出至错误输出流,作为字段 System.err 的值。输出的第一行包含此对象的 toString() 方法的结果。剩余行表示以前由方法 fillInStackTrace() 记录的数据。此信息的格式取决于实现,但以下示例是最常见的: java.lang.NullPointerException at MyClass.mash(MyClass.java:9) at MyClass.crunch(MyClass.java:6) at MyClass.main(MyClass.java:3)会打印出一大堆的信息
解决方案:
e.getMessage()获取不到,但e.getCause()可以捕获到
解决方案:
引用请问你执行出来的结果是 什么呢 ? 是使用JDK1.5执行的结果
解决方案:
我用的是JDK1.5,是不是版本与你不同ClassA a = (ClassA) c.newInstance();之所以后面会输出null,是因为在c.newInstance()调用的代码中被屏蔽了异常而new ClassA();则直接抛出,所以捕捉到了ccccccccbbbbbbbbbb
解决方案:
结果是:222222222 java.lang.reflect.InvocationTargetExceptionnull如果ClassA a = (ClassA)c.newInstance();改为new ClassA();结果为:222222222 java.lang.Exception: ccccccccbbbbbbbbbbccccccccbbbbbbbbbb
解决方案:
结果我觉得应该是222222222 java.lang.Exception@xxxxxx222222222ccccccccbbbbbbbbbb java.lang.Excpetion xxx, ClassA在初始化构造函数的时候,出发Runtime异常,被捕捉,然后再抛出Exception异常,在CatchExceptionTest被捕捉,然后打印

时间: 2024-10-25 01:08:13

有个java 异常问题不解。。的相关文章

Java 异常设计最佳实践

关于异常 在讲Java异常实践之前,先理解一下什么是异常.到底什么才算是异常呢?其实异常可以看做在我们编程过程中遇到的一些意外情况,当出现这些意外情况时我们无法继续进程正常的逻辑处理,此时我们就可以抛出一个异常. 广义的讲,抛出异常分三种不同的情况: 编程错误导致的异常 :在这个类别里,异常的出现是由于代码的错误(譬如NullPointerException.IllegalArgumentException.IndexOutOfBoundsException ).代码通常对编程错误没有什么对策,

浅谈java异常链与异常丢失_java

1.在java的构造方法中提供了 异常链.. 也就是我们可以通过构造方法不断的将 异常串联成一个异常链...   之所以需要异常连,是因为处于代码的可理解性,以及阅读和程序的可维护性...  我们知道我们每抛出一个异常都需要进行try catch ...那么岂不是代码很臃肿... 我们如果可以将异常串联成一个异常连,然后我们只捕获我们的包装 异常,我们知道 RuntimeException 以及其派生类可以不进行try catch 而被jvm自动捕获并处理.. 当然了我们可以自己定义自己的异常类

java异常与错误处理基本知识_java

异常与错误:异常: 在Java中程序的错误主要是语法错误和语义错误,一个程序在编译和运行时出现的错误我们统一称之为异常,它是VM(虚拟机)通知你的一种方式,通过这种方式,VM让你知道,你(开发人员)已经犯了个错误,现在有一个机会来修改它.Java中使用异常类来表示异常,不同的异常类代表了不同的异常.但是在Java中所有的异常都有一个基类,叫做Exception.错误:它指的是一个合理的应用程序不能截获的严重的问题.大多数都是反常的情况.错误是VM的一个故障(虽然它可以是任何系统级的服务).所以,

Java异常

在我参与过的一些Java项目.或者阅读过Java代码中,异常的使用或多或少都有点问题,有些甚至是误用.可能很多人都了解异常的基本知识,但是使用的时候往往过于随意,然而这样的随意往往并不能造成什么严重的问题,所以很多程序员,尤其是初级的程序员也就没有在意它,于是代码中总是会有那些让人不舒服的异常使用代码:另一方面,Java异常类型中包括Checked Exception(Runtime Exception)和Unchecked Exception,这两中异常的使用也颇具争议. 基于上述问题,总结一

Java异常封装(自己定义错误码和描述,附源码)

版权声明:本文为博主原创文章,转载注明出处http://blog.csdn.net/u013142781 目录(?)[+] 真正工作了才发现,Java里面的异常在真正工作中使用还是十分普遍的.什么时候该抛出什么异常,这个是必须知道的. 当然真正工作里面主动抛出的异常都是经过分装过的,自己可以定义错误码和异常描述. 下面小宝鸽就为大家介绍一个Java异常简单封装的例子. 在给出异常分装例子之前,需要给大家普及Java里面的checked异常和unchecked异常的个概念. 一.checked异常

jsf-在线求java异常问题解决

问题描述 在线求java异常问题解决 系统每天都会抛出这种异常,不多,异常出现时间随机的Tomcat7 jdk1.7 使用jsf-api.jar和jsf-impl.jar库 解决方案 http://www.oschina.net/question/1762963_229343 解决方案二: 求eclipse java heap space 问题解决方案 解决方案三: 空指针,.必然是使用了null,一步一步的跟,看看在哪用到了这个null,然后判空,没么有问题了

关于java异常的问题求解决

问题描述 关于java异常的问题求解决 import java.io.*; class DivisorIsZeroException extends Exception { public DivisorIsZeroException(String name) { super(name); } } class A { public int divide(int a, int b) throws DivisorIsZeroException { int m = 0; if(0 == b) throw

Java异常简介及其架构

Java异常简介 Java异常是Java提供的一种识别及响应错误的一致性机制. Java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性.在有效使用异常的情况下,异常能清晰的回答what, where, why这3个问题:异常类型回答了"什么"被抛出,异常堆栈跟踪回答了"在哪"抛出,异常信息回答了"为什么"会抛出. Java异常机制用到的几个关键字:try.catch.finally.throw.thro

Java异常及异常块执行次序(try、catch、finally、return)

Java异常: ①使用try-catch-finally处理异常: ②使用throw.throws抛出异常: ③上边为java异常处理5个关键字. 异常是程序在设计时或运行时产生的错误,异常处理是处理异常的过程,一旦异常被处理后,异常就不存在了,因此程序就可以继续运行了.如果异常不被处理,程序就会被强制终止(终止出现异常的业务代码执行). 在程序运行中,程序的try.catch.finally.return执行次序,就要进行考虑了. ①:捕获异常 try{ //执行可能产生异常的代码 }catc