12.通过异常处理错误

1.异常参数
所有标准异常类都有两个构造器:一个是默认的,另一个是以字符串作为参数的。
throw new NullPointerException("this is null");

2.捕获异常

如果方法内部抛出异常,则结束,要是不希望结束,加上try
try{
//code that might generate exceptions
}catch(){

}

3.创建自定义异常,java提供的异常体系不可能预见所有的错误。
对于异常来说最重要的就是类名,大多数情况下已经够用。

class SimpleException extends Exception{}
捕到异常后
e.printStackTrace() 将信息输出到标准错误流。
e.printStackTrace(System.out) 输到标准输出
其实是System.err和System.out的区别
System.out.println 能重定向到别的输出流,这样的话你在屏幕上将看不到打印的东西了,如输出到
一个txt的log日志中.而System.err.println只能在屏幕上实现打印,即使你重定向了也一样。

4.异常和记录日志


5.异常说明
void f() throws TooBig,TooSmall{
}
经常和try -catch两者选一,可以声明方法将抛出异常,实际上却不抛出。
这种在编译期间被强制检查的异常称为被检查的异常。

6.捕获所有异常
public class ExceptionMethods {
  public static void main(String[] args) {
    try {
      throw new Exception("My Exception");
    } catch(Exception e) {
      print("Caught Exception");
      print("getMessage():" + e.getMessage());
      print("getLocalizedMessage():" +
        e.getLocalizedMessage());
      print("toString():" + e);
      print("printStackTrace():");
      e.printStackTrace(System.out);
    }
  }
} /* Output:
Caught Exception
getMessage():My Exception
getLocalizedMessage():My Exception
toString():java.lang.Exception: My Exception
printStackTrace():
java.lang.Exception: My Exception
        at ExceptionMethods.main(ExceptionMethods.java:8)

每个方法都比前一个提供更多信息,实际上他们每个都是前一个的超集。

7.栈轨迹
printStackTrace()所提供的信息可以通过getStackTrace()方法访问,返回一个由栈轨迹元素组成的数组。

8.重新抛出异常
一种是包括原来的异常信息,没有更新  throw e;
另一种是刷新异常信息,去掉旧的异常,throw (Exception)e.fillInStackTrace();
第二种同样可以throw new OneException()来代替。

异常链


9.java标准异常
Throwable对象分为两种类型:Error用来表示编译时和系统错误。(一般不用我们关心)
检查性异常 Exception 是可以被抛出的基本类型。
而java.lang.RuntimeException继承自java.lang.Exception. 程序存在bug如数组越界,空指针等。

10.finally
无论try块中异常是否抛出,他们都能执行。

11.异常丢失
throws new OneException();
throws new TwoException();
第一个将被覆盖。

12.异常限制
当子类继承父类并覆盖方法时候,只能抛出基类方法的异常说明里列出的那些异常。

13.构造器
其实这里讲了一个编程时要注意的问题
try {
      in = new BufferedReader(new FileReader(fname));
     } catch(FileNotFoundException e) {
      throw e;
    }
finally{
   in.close();
   }
如果in打开失败 finally中却要关闭,就出问题了。
 try {
      InputFile in = new InputFile("Cleanup.java");
      try {
        String s;
        int i = 1;
        while((s = in.getLine()) != null);
      } catch(Exception e) {
      
      } finally {
        in.dispose();
      }
    } catch(Exception e) {
      System.out.println("InputFile construction failed");
    }  
这样写问题就解决了。程序结构问题。

14.异常按照代码书写顺序找出最近匹配的处理程序,找到后即认为处理过了,不再继续查找。

15.异常处理原则
只有知道如何处理的情况下才捕获异常。
但有时被检查的异常,强制你在可能的还没做好准备如何处理错误的时候加上catch子句,这就导致了吞食则有害(harmful if swallowed)
try{
// ..to do something useful
}catch(Exception){//donothing}
这样做可以通过编译了,但是如果真发生了异常,但是吞食的异常完全消失了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值