java的基本理念是"结构不佳的代码不能够运行"

一.概念

发现错误的理想时机是编译阶段,然而,编译期间并不能找出所有的错误,余下的问题必须在运行时期解决。

二.基本异常

异常情形(exceptional conditin)是指阻止当前方法或作用域继续执行的问题.

普通问题是指在当前环境下能得到足够的信息,总能处理这个错误

当抛出异常后,有几件事会随之发生。首先,同Java中其它对象的创建一样,将使用new在堆上创建异常对象。然后,当前的执行路径被终止,并且从当前环境中弹出对异常对象的引用。此时,异常处理机制接管程序,并开始寻找一个恰当的地方来继续执行程序。这个恰当的地方就是异常处理程序,它的任务是将程序从错误状态中恢复,以使程序要么换一种方式运行,要么继续运行下去。

if(t == null)
throw new NullPointerException();//这样就把错误信息传播到更大的环境中,

三. 异常参数

与使用java中的其它对象一样,我们总事用new再堆上创建异常对象,这也伴随着存储空间的分配和构造器的调用,所有标准异常都有两个构造器:一个是默认构造器,一个是接受字符串作为参数,以便能把有关信息放入异常对象的构造器;

关键字throw将产生许多有趣的结果,在使用new创建了异常对象之后,此对象的引用将传给throw.尽管返回的异常对象其类型通常与方法设计的返回类型不同,但从效果上看,它就像方法的返回,可以简单的把异常处理看成一种不同的返回机制,当然若过分的强调这种类比的化,就会有麻烦了.  另外还能用抛出异常的方式从当前的作用域退出,在这两种情况下,将会返回一个异常处理对象,然后退出方法或作用域

抛出异常与方法正常返回值的相似到此为止,因为异常返回和普通方法返回的地点完全不同

此外,能够抛出任意类型的Throwable对象,它是异常的根类,通常,对于不同的错误,要抛出相应的异常,错误处理信息可以保存在异常对象内或用异常类的名称来暗示.上异常环境通过这些信息来决定如何处理异常

四. 捕获异常

要明白异常时如何被捕获的,必须理解监控区域(guarded region)的概念,它时一段可能产生异常的代码,并且后面跟着处理这些异常的代码

Exception从基类Throwable继承的方法有

  • String getMessage(): 详细信息
  • String getLocalizedMessage(): 本地语言描述详细信息
  • void printStackTrace(): 调用栈显示了"把你带到异常抛出地点"的方法调用序列,输出到标准输出.
  • void printStackTrace(PrintStream): 调用栈显示了"把你带到异常抛出地点"的方法调用序列,输出到要输出的流.
  • void printStackTrace(java.io.PrintWriter): 调用栈显示了"把你带到异常抛出地点"的方法调用序列,输出到要输出的流.
  • Throwable fillInStackTrace(): 用于在Throwable对象的内部记录栈帧的当前状态.

栈轨迹:

printStackTrace()方法所提供的信息可以通过getStackTrace()方法直接访问.

getStackTrace()方法返回一个由根轨迹中的元素所构成的数组,每一个元素都表示栈中的一帧.

1.  try块

如果在方法内部抛出异常后,这个方法将在抛出异常的过程中结束,如果不想就此结束,可以设置一个try块来捕获异常

try{
//Code that might generate exception
}

2.异常处理程序

异常处理程序紧跟在try块之后,以关键字catch表示,异常处理程序必须紧跟在try块之后,当异常被抛出时,异常处理机制将负责搜寻参数与异常类型想匹配的第一个处理程序,然后进入catch子句执行,此时认为异常得到了处理,一旦catch子句结束才处理程序的查找过程结束,并不会在调用其它catch子句.

异常处理模型

终止模型:错误非常关键,一旦异常被抛出,即终止程序

恢复模型:意思是异常处理程序的工作是修正错误,然后重新尝试调用出问题的方法,并认为第二次可以成功.如果要用java实现类似的恢复行为,那么在遇到错误时,就不能抛出异常,而时调用正确的方法来修正该错误,或者把try块放进一个while循环里,这样就不断进入while块,直到得到满意的结过

package object;

public class Cure {
public static void main(String[] args) throws Exception
{
int i =5;
while(i-->0)
try { }catch(Exception e)
{
e.printStackTrace();
}finally {
System.out.println(i);
}
}
}

五. 创建自定义异常

要自定义异常,必须从已有的异常类继承,最好是选择意思相近的异常类继承(不过这样的异常并不容易找),建立新的异常类型最简单的方法就是让编译器为你产生默认构造器,所以这几乎不用写多少代码:

package exceptions;
//: exceptions/InheritingExceptions.java
// Creating your own exceptions. class SimpleException extends Exception {} //必须是throwable子类 public class InheritingExceptions {
public void f() throws SimpleException {
System.out.println("Throw SimpleException from f()");
throw new SimpleException(); //这里抛出异常SimpleException
}
public static void main(String[] args) throws SimpleException{
InheritingExceptions sed = new InheritingExceptions();
try {
sed.f();
}catch(SimpleException e) //这里捕获异常SimpleException,并执行catch子句
{
System.out.println("caught it!");
}
}
} /* Output:
Throw SimpleException from f()
Caught it!
*///:~

编译器创建了默认构造器,它将自动调用基类的默认构造器,一般不会用Excetption(String)这样的构造器,这种构造器不实用,对异常来说最重要的是类名

也可以通过写入System.err而将错误发送给标准错误流,通常这比System.out要好,因为System.out可以被重定向

package exceptions;
//: exceptions/FullConstructors.java class MyException extends Exception {
public MyException() {}
public MyException(String msg) { super(msg); }//super调用类基类构造器,它结受一个字符串为参数
} public class FullConstructors {
public static void f() throws MyException {
System.out.println("Throwing MyException from f()");
throw new MyException();
}
public static void g() throws MyException {
System.out.println("Throwing MyException from g()");
throw new MyException("Originated in g()");
}
public static void main(String[] args) {
try {
f();
} catch(MyException e) {
e.printStackTrace(System.err);//将错误发送给标准错误流
//e.printStackTrace()//直接默认的话错误也是发送给标准错误
}
try {
g();
} catch(MyException e) {
e.printStackTrace(System.out);//将错误发送到System.out ,System.out.可以重定向
}
}
} /* Output:
Throwing MyException from f()
exceptions.MyException
Throwing MyException from g()
exceptions.MyException: Originated in g()
at exceptions.FullConstructors.f(FullConstructors.java:12)
at exceptions.FullConstructors.main(FullConstructors.java:20)
at exceptions.FullConstructors.g(FullConstructors.java:16)
at exceptions.FullConstructors.main(FullConstructors.java:25) *///:~

java 通过异常处理错误的更多相关文章

  1. Java异常处理错误

    Java异常处理错误 研究发现,在编译阶段的最佳时机错误,序之前.然而,编译期间并不能找出全部的错误,余下的问题必须在执行阶段解决.这就须要错误源通过某种方式把适当的信息传给某个接收者,该接收者知道怎 ...

  2. Java的异常处理

    Java的异常处理是通过5个关键字来实现的:try,catch,throw,throws,finally.JB的在线帮助中对这几个关键字是这样解释的:       Throws: Lists the ...

  3. Java之异常处理机制

    来源:深入理解java异常处理机制 2.Java异常    异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 ...

  4. 关于Java异常和错误的几个问题

    1.Java中什么是Exception? 异常是Java传达给你的系统和程序错误的方式. 在java中,异常功能是通过实现比如Throwable,Exception,RuntimeException之 ...

  5. java的异常处理机制(try…catch…finally)

    1 引子try…catch…finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解.不过,我亲自体验的“教训”告诉我,这个东西可不是想象中的那么简单.听话.不信 ...

  6. java的异常处理简介

    异常概述 任何一种程序设计语言设计的程序在运行时都有可能出现错误,例如除数为0,数组下标越界,要读写的文件不存在等等. 捕获错误最理想的是在编译期间,但有的错误只有在运行时才会发生. 对于这些错误,一 ...

  7. 深入理解java的异常处理机制

     JAVA异常的概念    异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的 ...

  8. Java 六种异常处理的陋习(转)

    Java 六种异常处理的陋习 原文链接:  http://www.cnblogs.com/Android-and-android/archive/2013/05/02/3054469.html 你觉得 ...

  9. 关于JAVA中异常处理的简单阐释.

    ---恢复内容开始--- 这是我的一篇要在博客园发布的随笔,主要是简单的概括一下我本次所学的关于异常处理的知识.有讲的不妥当的地方,或者有需要补充的,还请各位高人给指点,共同学习,虚心求学.谢谢啦~ ...

随机推荐

  1. hdu 4747 Mex (2013 ACM/ICPC Asia Regional Hangzhou Online)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4747 思路: 比赛打得太菜了,不想写....线段树莽一下 实现代码: #include<iost ...

  2. 【刷题】BZOJ 4946 [Noi2017]蔬菜

    Description http://www.lydsy.com/JudgeOnline/upload/Noi2017D2.pdf Solution 网上大部分都是并查集写法,但是有大神写了非并查集写 ...

  3. 浅谈平衡树splay

    首先splay和treap不一样,treap通过随机数来调整树的形态.但splay不一样,再每插入或操作一次后,你都会把他旋转到根,再旋转过程中树的形态会不断改变,这样来达到均摊效果 常数据大. 来看 ...

  4. 【BZOJ1485】[HNOI2009]有趣的数列(组合数学)

    [BZOJ1485][HNOI2009]有趣的数列(组合数学) 题面 BZOJ 洛谷 题解 从小往大填数,要么填在最小的奇数位置,要么填在最小的偶数位置. 偶数位置填的数的个数不能超过奇数位置填的数的 ...

  5. 【转】安全加密(一):这些MCU加密方法你都知道吗?

    本文导读 随着物联网和边缘计算的出现,五花八门的MCU也被应用其中,如何保证我们的程序安全和知识产权不受侵犯呢,本文我们将对主流MCU的程序加密进行讲解,希望能够帮助你选择最适合自己应用的微处理器. ...

  6. 学习7__STM32--SPI外设之双机通信---

    <target> # 整透stm32之spi双机通信(包括双机同为stm32,stm32& others) <概念> # 双机通信(全双工) 在主机的MOSI管脚输出1 ...

  7. 【转】Android 编程下的代码混淆

    什么是代码混淆 代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为.代码混淆可以用于程序源代码,也可以用于程序编译而成的中 ...

  8. 个推数据统计产品(个数)iOS集成实践

    最近业务方给我们部门提了新的需求,希望能一站式统计APP的几项重要数据.这次我们尝试使用的是个推(之前专门做消息推送的)旗下新推出的产品“个数·应用统计”,根据官方的说法,个推的数据统计产品通过专业的 ...

  9. websocket使用nginx作为反向代理

    需要nginx作为websocket的反向代理,没有nginx反向代理时候没有问题,通过nginx反向代理后会报400错误,查后台调试信息: tornado.general – DEBUG – Can ...

  10. python---django使用数据库(orm)

    官方教程点击此处 项目默认使用sqlite DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os. ...