今天看了《Think in Java》里的异常说明,对java的异常了解了更多。以前都不知道是怎么回事的说。下面简要总结一下吧!

       要自定义异常,必须继承基类Exception。下面是个简单的例子:
 SimpleExceptionDemo
{
    public void f() throws SimpleException{
        System.out.println(
"Throw SimpleException from f()");
        
throw new SimpleException();
    }

    
public static void main(String[] args){
        SimpleExceptionDemo sed 
= new SimpleExceptionDemo();
        
try
        {
            sed.f()
        }
        
catch (SimpleException e)
        {
            System.out.println(
"Caught it!");
        }
    }
};

执行结果为:
"Throw SimpleException from f()",
"Caught i t!"

自定义异常和java自带的异常没什么区别,可以在异常里重写一些方法,下面还有一个程序。
另外想说明一点的就是一些异常类的区别,它们都是从基类Throwable继承的方法。
String getMessage()
String geLocalizedMessage()

用来获取详细信息,或用来本地语言表示的详细信息。

String toString()
返回对Throwable的简单描述,要是有详细信息的话,也会把它包含内。
void printStackTrace()
void printStackTrace(PrintStream)
void printStackTrace(java.io.PrintWriter)

打印Throwable和Throwable的调用本轨迹。
Throwable fillInStackTrace()
用于在Throwable对象的内部记录本帧的当前状态。

下面有一个程序,刚看的时候觉得有点奇怪,也是从《Think in java》里摘的。
 Exception 
{
    private int x;
    
public MyException2() {}
    
public MyException2(String msg) {super(msg);}
    
public MyException2(String msg,int x){
        
super(msg);
        
this.x = x;
    }
    
public int val() {return x;}
    
public String getMessage(){
        
return "Detail Message:"+x+" "+super.getMessage();
    }
};

public class ExtraFeatures
{
    
public static void f() throws MyException2{
        System.out.println(
"Throwing MyException2 from f()");
        
throw new MyException2();
    }
    
public static void g() throws MyException2{
        System.out.println(
"Throwing MyException2 from g()");
        
throw new MyException2("Originated in g()");
    }
    
public static void h() throws MyException2{
        System.out.println(
"Throwing MyException2 from h()");
        
throw new MyException2("Originated in h()",47);
    }
    
public static void main(String[] args){
        
try
        {
            f();
        }
        
catch (MyException2 e)
        {
            e.printStackTrace();
        }

        
try
        {
            g();
        }
        
catch (MyException2 e)
        {
            e.printStackTrace();
        }
        
try
        {
            h();
        }
        
catch (MyException2 e)
        {
            e.printStackTrace();
            System.out.println(
"e.val()=" + e.val());
        }
    }
结果可以自己去执行一下。
在这里我要说明的是printStackTrace(),toString(),getMessage()三者的区别,要不然怎么会有如上的结果呢?
(转)说明得很清楚,一定要仔细地看哈!

printStackTrace()、toString()、getMessage()的区别

  • public void printStackTrace()
    将此 throwable 及其追踪输出至标准错误流。
    此方法将此 Throwable或Exception 对象的堆栈跟踪输出至错误输出流,作为字段 System.err 的值。
    输出的第一行包含此对象的 toString() 方法的结果。剩余行表示以前由方法 fillInStackTrace() 记录的数据。
    输出格式举例:
    java异常处理(一)java.lang.NullPointerException
    java异常处理(一)          at MyClass.mash(MyClass.java:
    9)
    java异常处理(一)          at MyClass.crunch(MyClass.java:
    6)
    java异常处理(一)          at MyClass.main(MyClass.java:
    3)

    使用举例:
    java异常处理(一)java异常处理(一)try...{
    java异常处理(一)
    //Java程序代码
    java异常处理(一)
    }

    java异常处理(一)java异常处理(一)
    catch(Exception e)...{
    java异常处理(一)e.printStackTrace();
    java异常处理(一)}
  • public String getMessage()
    返回此 Throwable或Exception 的详细消息字符串。
    使用举例:
    java异常处理(一)java异常处理(一)try...{
    java异常处理(一)
    //java程序代码
    java异常处理(一)
    }

    java异常处理(一)java异常处理(一)
    catch(Exception e)...{
    java异常处理(一)System.out.println();
    java异常处理(一)}

    java异常处理(一)
    public String toString()
    返回此 Throwable或Exception 的简短描述。
    如果此 Throwable或Exception 对象是利用非空详细消息字符串创建的,则结果是三个字符串的串联:
    1)此对象的实际类的名称
    2)": "(冒号和空格)
    3)此对象的 getMessage() 方法的结果
    如果此 Throwable或Exception 对象利用 null 详细消息字符串创建,则返回此对象的实际类的名称。 使用举例:
    java异常处理(一)java异常处理(一)try...{
    java异常处理(一)
    //Java程序代码
    java异常处理(一)
    }

    java异常处理(一)java异常处理(一)
    catch(Exception e)..{
    java异常处理(一)System.err.println(e.toString());
    java异常处理(一)}

今天java的异常就先写到这儿吧,明天继续!!!

相关文章: