黑马程序员_Java异常

来源:互联网 发布:淘宝卖家中心下载 编辑:程序博客网 时间:2024/05/22 17:13

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

异常笔记:
所谓异常就是指:程序出现了不正常的情况。
Throwable是java语言中所有错误或异常的超类。
Error:
      这是一个严重的错误,比如说:内存溢出,这是我们没有办法改变的问题和异常,
      对此,我们无能为力,只能说我们尽量的避免。Error是Throwable的子类,用于指示合理的应用程序不应该试图
      捕获的严重问题。大多数这样的错误都是异常的条件,虽然ThreadDeath错误是一个“正规”的条件,但它也是
      Error的子类,因为大多数应用程序都不应该试图捕获它。
      换句话说:如果出现这种问题是不需要我们进行捕获处理的。
这个异常是我们尽量去避免的。 
Exception:
      这个异常又分为两种:
1.就是编译的时候出现了问题:如果这个问题你不解决,那
   程序是不可能运行了。所以说你必须要解决问题才可以。
这个异常才是我们要做处理的。
2.就是程序运行时候出现了问题,就是说,程序已经运行时出现了
 问题,这个时候肯定是程序员的事。是需要程序员改代码来修正的。
 在API中的Exception中,除了RuntimeException,及其子类以外,
 其它的都是编译时的异常,其它的都是需要我们自己要进行处理的。

 RuntimeException及其子类,这个是不需要做异常处理的,是靠程序员来自己进行改正自己的代码的
 简单说:就是如果说RuntimeException,那肯定是程序员的事情,是靠程序员来处理的。
接下来通过如下代码:

package heima.com;public class yi {public static void main(String[] args) {int a=100;int b=24;int c=0;System.out.println(a/b);//System.out.println(a/c);System.out.println("over");}}
但运行到 System.out.println(a/c);这一行的时候,程序会报错:ArithmeticException。
这是一个Runtime中的一个子类,也就是说这是需要程序员自己解决的异常。
是运行的时候出现了问题。

同时知道:
jvm的工作原理:
当一旦出现了问题,会在这一行的代码中停下来,然后会在控制台告诉我们是哪一行出现了问题,
比如说:是在System.out.println(a/c);这一行出现了问题,那就会在这一样停下来。程序不再继续执行。

同时告诉我们是属于Exception中的哪一类,是需要抛出异常还是需要进行修正代码?
错误原因,还有就是位置统统告诉我们,在控制台输出,告诉程序员。
package heima.com;public class two {public static void main(String[] args) {int a=100;int b=24;int c=0;System.out.println(a/b);try {System.out.println(a/c);} catch (ArithmeticException e) { //这里就是学习了怎么抛出了异常,同时告诉我们这个地方必须要 //写点东西,否则这被看做是隐藏了异常,            //同时,我们在对软件进行上线的时候,就是这样将这个异常隐藏, //也是无所谓的。}System.out.println("over");}}
异常中几个常见的方法:
 * public String toString():现实异常的一些基本信息
 * public String getMessage():获取异常信息
 * public void printStackTrace():把信息输出在控制台
实现如下:
package heima.com;public class two {public static void main(String[] args) {int a=100;int b=24;int c=0;System.out.println(a/b);try {System.out.println(a/c);} catch (ArithmeticException e) { System.out.println("这个地方有一个异常");e.toString();e.getMessage();e.printStackTrace();}System.out.println("over");}}       
运行如下:
4
这个地方有一个异常
java.lang.ArithmeticException: / by zero
over
at heima.com.two.main(two.java:11)

at heima.com.two.main(two.java:11)这一行之前有over的出现。
其实over是在at heima.com.two.main(two.java:11)之后的。
只是运行问题。会出现不同的情况。

时而在前,时而在后。
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
如果说程序中多处异常,怎么办?
1.针对每一个出现问题的地方,都写一个try...catch进行处理。
下面的程序就有两个异常,解决方法就是将两个异常都抛出便可。

package heima.com;/** *  * @author yulongchao * */public class san {public static void main(String[] args) {int a=100;int b=0;//System.out.println(a/b);try {System.out.println(a/b);} catch (ArithmeticException e) {//catch后面绝对不可以写为Exception e,因为这是属于多态,就好像导包一样,//尽量用到哪个包中的类就导入哪个包中类,System.out.println("除数后面不可以为零");}int[] arr={1,2,3};try {System.out.println(arr[3]);} catch (ArrayIndexOutOfBoundsException e) {System.out.println("数组下标越界");}}}
2、针对多个异常写一个try,但是有多个catch
 注意点:1.  注意一旦程序发现一个异常的话,会立马运行到catch{}里面去;
             而一旦有一个catch被执行,其它的catch就不会再执行。
             然后直接运行到catch后面程序运行。
        但是如果是程序员的需要,一个单元的重点异常,必须是逐个抛出。
       而不是简单的多行抛出。
    2.catch的顺序问题
  如果是平级关系,谁前谁后没有关系。
  如果有子父关系,那么,父亲必须在最后。
3.C:JDK7的新特性
  catch(异常1 | 异常2 | 异常3 ... 变量) {
  }
  要求这多个异常间必须是平级关系。
  比如说:像这种问题的 catch (ArrayIndexOutOfBoundsException |ArithmeticException |Exception e)系统就会报错。
  因为这是一种或者的符号|,里面不可有父类Exception
package package1;public class er {public static void main(String[] args) {int a=100;int b=0;int[] arr={1,2,3};try {System.out.println(a/b);System.out.println(arr[5]);} catch (ArithmeticException e) {System.out.println("这个地方是除数不能为零");}catch (ArrayIndexOutOfBoundsException e) {System.out.println("数组越界"); //在这个地方是在控制台是不会输出的,因为//程序运行完System.out.println(a/b);这一行以后,//直接运行的System.out.println("over");}System.out.println("over");}}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
Finally:是异常处理的一部分。用于释放资源。
它的特征就是:Finally里面的代码可以永远的执行。
         但是如果是在Finally之前,写上:System.exit(0);
此时Finally里面的代码就不会再继续执行了!
package heima.com;public class san {public static void main(String[] args) { int a=100; int b=0;try {System.out.println(a/b);} catch (ArithmeticException e) {e.printStackTrace();System.exit(0);}finally{System.out.println("程序执行了!");}}}
问:1:finaly,finally,finalize的区别:
    final:最终的意思,可以修饰类,方法,变量。
  它修饰的类不能被继承
  它修饰的方法不能被重写
  它修饰的变量是常量
  finally:是异常处理的一部分,里面的代码永远会执行。
  特殊情况:在执行到finally之前jvm退出了。
  finalize:Object类的一个方法,用于垃圾回收。

问:假设说catch语句里面有return语句,那么finally里面的语句会执行吗?
    那finally的语句是在return语句之前执行,还是在return语句之后执行?
能执行,finally语句是在return之前执行的。
其实是在return执行间进行的。
3:请输出下列程序的结果
30。  

public class FinallyTest {public static void main(String[] args) {// method1();System.out.println(method2());}private static int method2() {int x = 10;try {System.out.println(x / 0);x = 20;} catch (ArithmeticException e) {x = 30;return x;} finally {x = 40;}return x;}private static void method1() {try {System.out.println(10 / 0);} catch (ArithmeticException e) {e.printStackTrace();return;} finally {System.out.println("finally");}}}
第一次执行到return x;的时候,在内存中已经形成了一个返回路径,这次记录的值:return 30;
接着,finally执行,x=40。

最后,第二次执行return的时候,就直接返回了return 30;


----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

0 0