异常就是java程序在运行过程当中出现的错误java
main方法收到问题时,有两种是处理方式程序员
本身将问题处理,而后运行数组
本身没有针对问题的处理方式,只有交给调用main的jvm来处理,并将异常名称,异常信息,异常出现的位置jvm
打印在了控制台上,同时将程序中止运行(也就是报错)。this
try时用来检测异常spa
catch是用来捕获异常指针
finally 释放资源code
1 int i = 5; 2 int b = 0; 3 try { 4 int c = i/5; 5 } catch (Exception e) { 6 System.out.println(e.getMessage()); // 查看异常信息 7 }
1
try...catch的方式处理多个异常对象
JDK7之后处理多个异常的方式及注意事项blog
int i = 5; 2 int b = 0; 3 try { 4 int c = i / 5; 5 } catch (ArithmeticException e) {//只能够捕获除零错误 6 System.out.println("除数不能为零"); 7 } catch (ArrayIndexOutOfBoundsException e) {//只能够捕获下标越界 8 System.out.println("索引越界了"); 9 10 } catch (Exception e) { // Exception e = new NullPointerException(); 11 // 若是把全部的错误都放入Exception里面,彻底能够接收异常信息,可是不利于错误的查找 12 System.out.println("出错了"); 13 } 14 System.out.println("over");
被finally控制的语句体必定会执行
特殊状况:执行到finally 以前 jvm退出了System.exit(0))
finally的做用:用于释放资源,在IO流操做和数组库操做中会见到
IO流是须要打开的,打开以后须要关闭,在finally里面关闭
finally强大到用return结束方法也会执行
1 int i = 5; 2 int b = 0; 3 try { 4 int c = i / 5; 5 //直接退出java虚拟机这是系统级别的退出,jvm不在运行 6 System.exit(0); 7 } catch (Exception e) { 8 System.out.println("出错了"); 9 }finally { 10 //try当中不管是渝澳catch,仍是return语句他都会执行 11 //除非退出java虚拟机
//当出现java虚拟机退出时,finally中的语句就不会运行了,java程序直接终止运行
12 System.out.println("aaaaaaaaaaaaaaaaaaaa"); 13 } 14 System.out.println("over");
java中异常被分为两类,编译器异常和运行时异常,
当上面出现了add或者surround的时候,就是程序出现了编译器的异常信息,解决方法时要么使用throws或者时使用trycatch进行包围,才能使程序正常运行
编译时异常:在编译某个程序的时候,有可能会有这样那样的事情发生,好比文件找不到,这样的异常就必须在编译的时候处理
若是不处理编译通不过
运行时异常:就是程序员所犯得错误,须要回来修改代码
就像空指针的时候你不赋值为null.索引越界异常,你不越界
getMessage() 获取异常信息,返回字符串
toString() 获取异常类名和异常信息,返回字符串
printStackTrace() 获取异常类名和异常信息,以及异常出如今程序中的位置,返回值void
1 public static void main(String[] args) throws Exception { 2 Student s = new Student(); 3 s.setAge(-13); 4 } 5 6 7 8 9 public void setAge(int age) throws Exception { 10 if(age > 0 && age < 150) { 11 this.age = age; 12 }else { 13 throw new RuntimeException("年龄输入有误"); 14 } 15 }
1.在功能方法内部出现某种状况,程序不能继续运行,须要进行跳转时,就把异常对象抛出
2.一个方法在使用throws进行抛出异常时,若是其余方法调用了该方法,那么调用方法必须也要抛出对应的异常,
或者是使用try...catch 语句进行捕获该异常
throws:
用在方法声明的后面,跟的是异常类名
能够跟多个异常类名,用逗号隔开
表示抛出异常,有该方法的调用者来处理
throw
用在方法体,跟的是异常对象名
1 /** 2 * 3 * @param args 4 * @throws AgeOutOfBoundsException 自定义异常 5 */ 6 public static void main(String[] args) throws AgeOutOfBoundsException { 7 Person p = new Person(); 8 // 捕获异常 9 try{ 10 p.setAge(17); 11 System.out.println(p.getAge()); 12 }catch (Exception e){ 13 System.out.println("年龄非法"); 14 } 15 } 16 } 17 18 package com.jhedu.day20; 19 public class Person { 20 private String name; 21 private int age; 22 public Person() { 23 super(); 24 } 25 public Person(String name, int age) { 26 super(); 27 this.name = name; 28 this.age = age; 29 } 30 public String getName() { 31 return name; 32 } 33 public void setName(String name) { 34 this.name = name; 35 } 36 public int getAge() { 37 return age; 38 } 39 public void setAge(int age) throws AgeOutOfBoundsException { 40 if(age >0 && age <= 150) { 41 this.age = age; 42 }else { 43 throw new AgeOutOfBoundsException("年龄非法"); 44 } 45 } 46 } 47 48 package com.jhedu.day20; 49 public class AgeOutOfBoundsException extends Exception { 50 // 空参数的构造方法 51 public AgeOutOfBoundsException() { 52 super(); // 调用父类Exception的构造方法 53 } 54 // 有参数的构造方法 55 public AgeOutOfBoundsException(String message) { 56 super(message); // 调用父类Exception的有参数构造方法 57 }
只能抛出一个异常对象名
表示抛出异常,有方法体内的语句处理
异常有不少子类就是为了让你更好的知道抛出的是啥异常,为了有利于你排错,抱不一样异常表明不一样的错误,看了名字就知道犯了什么错误,就是为了有个名字而已,所做的事情父类都去作了。
1.子类重写父类方法时,子类的方法必须抛出相同的异常或父类异类的子类。
2.若是父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或是他的子类,子类不能抛出父类没有的异常
3.若是被重写的方法没有异常抛出,那么子类的方法绝对不能够抛出异常,若是子类方法内有异常发生,那么子类只能try,不能throws
如何使用异常处理:若是该功能内部能够将问题处理,用try,若是处理不了,交给调用者处理。。这是throws
区别:后续程序须要继续就运行try
后续程序不须要运行就throws
若是jdk没有提供相对相应的异常,须要自定义异常