定义:java程序运行时出现的错误
分类:异常分为运行时异常和编译异常
运行时异常(RuntimeException):运行时异常就是我们程序员犯的代码错误,必须要对代码进行修改,例如空指针异常、索引越界异常等等。
编译时异常(Exception里面除了RuntimeException):编译时异常就是编译器对java代码可能出现的错误的一种预知和提醒,必须要在程序编译时处理异常
异常的处理:
1:当main方法遇到异常时,会有两种处理方式。第一:如果程序本身有异常处理代码,那么就用自己的异常处理代码对异常进行处理,然后继续运行。第二:如果main方法自己没有异常处理方式,就会交给调用main方法的JVM来处理,JVM有一个默认的异常处理机制,会对异常进行处理,并将异常的名称,异常的信息,异常出现的位置打印在控制台上,同时将程序停止运行。
2:在代码中我们对异常的处理有两种方式。
A(1):try、catch、finally处理,其中try是用来检测异常的,catch是用来捕获异常的,finallly是用来释放资源的(对io流或数据库进行关闭),try要和catch,finally搭配使用,或者三者一起使用,不能单独使用。
public static void main(String[] args) {
Demo1 d = new Demo1();
try{
int x = d.div(10, 0);
System.out.println(x);
}catch(ArithmeticException a){ //ArithmeticException a = new ArithmeticException
System.out.println("除数不能为零");
}
}
public int div(int a,int b){
return a/b;
}
}
打印结果为:除数不能为零
A(2)try 后面可以跟多个catch,但是catch里面的异常类要是同级的或者放在后面的catch里面的异常类要是前面的异常类的父类
B(1):throws方式处理异常,定义功能方法时,需要把出现的问题暴露出来让调用者自己去处理
代码演示:
public class Demo1 {
public static void main(String[] args) throws Exception {
Person p = new Person();
p.setAge(-17);
System.out.println(p.getAge());
}
}
class Person{
private int age;
public Person(){
super();
}
public Person(int age){
this.age = age;
}
public void setAge(int age) throws Exception{
if(age>0&&age<150){
this.age = age;
}else{
throw new Exception("年龄非法");
}
}
public int getAge(){
return age;
}
}
这个代码把异常抛出,就是给方法做一个标记,让其他人在调用的时候,注意这里可能会出现什么错误,比如这里的年龄应该在0到150之间。在代码开发中,也许我们要调用其他类的方法,但那个方法不是自己写的,我们在用的时候不会去管方法的实现细节,只会去调用,所以要在那个方法中有异常处理方法,
B(2)throw 和throws的区别
throws:1、用在方法声明后面,跟的是异常类名
2、可以跟多个异常类名,用逗号隔开
3、表示抛出异常,有该方法的调用者处理
throw:1、用在方法体内,跟的是异常对象名
2、只能抛出一个异常对象名
3、表示抛出异常,有方法体内的语句处理
分类:异常分为运行时异常和编译异常
运行时异常(RuntimeException):运行时异常就是我们程序员犯的代码错误,必须要对代码进行修改,例如空指针异常、索引越界异常等等。
编译时异常(Exception里面除了RuntimeException):编译时异常就是编译器对java代码可能出现的错误的一种预知和提醒,必须要在程序编译时处理异常
异常的处理:
1:当main方法遇到异常时,会有两种处理方式。第一:如果程序本身有异常处理代码,那么就用自己的异常处理代码对异常进行处理,然后继续运行。第二:如果main方法自己没有异常处理方式,就会交给调用main方法的JVM来处理,JVM有一个默认的异常处理机制,会对异常进行处理,并将异常的名称,异常的信息,异常出现的位置打印在控制台上,同时将程序停止运行。
2:在代码中我们对异常的处理有两种方式。
A(1):try、catch、finally处理,其中try是用来检测异常的,catch是用来捕获异常的,finallly是用来释放资源的(对io流或数据库进行关闭),try要和catch,finally搭配使用,或者三者一起使用,不能单独使用。
代码演示:
package com.huaxin.exception;
public class Demo1 {public static void main(String[] args) {
Demo1 d = new Demo1();
try{
int x = d.div(10, 0);
System.out.println(x);
}catch(ArithmeticException a){ //ArithmeticException a = new ArithmeticException
System.out.println("除数不能为零");
}
}
public int div(int a,int b){
return a/b;
}
}
打印结果为:除数不能为零
A(2)try 后面可以跟多个catch,但是catch里面的异常类要是同级的或者放在后面的catch里面的异常类要是前面的异常类的父类
B(1):throws方式处理异常,定义功能方法时,需要把出现的问题暴露出来让调用者自己去处理
代码演示:
public class Demo1 {
public static void main(String[] args) throws Exception {
Person p = new Person();
p.setAge(-17);
System.out.println(p.getAge());
}
}
class Person{
private int age;
public Person(){
super();
}
public Person(int age){
this.age = age;
}
public void setAge(int age) throws Exception{
if(age>0&&age<150){
this.age = age;
}else{
throw new Exception("年龄非法");
}
}
public int getAge(){
return age;
}
}
这个代码把异常抛出,就是给方法做一个标记,让其他人在调用的时候,注意这里可能会出现什么错误,比如这里的年龄应该在0到150之间。在代码开发中,也许我们要调用其他类的方法,但那个方法不是自己写的,我们在用的时候不会去管方法的实现细节,只会去调用,所以要在那个方法中有异常处理方法,
B(2)throw 和throws的区别
throws:1、用在方法声明后面,跟的是异常类名
2、可以跟多个异常类名,用逗号隔开
3、表示抛出异常,有该方法的调用者处理
throw:1、用在方法体内,跟的是异常对象名
2、只能抛出一个异常对象名
3、表示抛出异常,有方法体内的语句处理