1.异常概念
- 异常处理是面向对象语音区别于面向过程语音的重要标记之一,
异常的出现,可以使我们编写的程序变得强大并且安全.
简单地说,异常是处理错误的机制. - 如下:
* int A=10;
* int B=0;
* int C=A%B;
* System.out.println("取余的结果为;"+C);
- 都知道0是不能作为除数于乘数的那么这个小程序的运行就会终止也就是(报错)
- 如下:
- 那么这种情况下我们就叫做异常,再举个例子
* int A=in.nextInt();
* System.out.println("你输入的是;"+A);
- 在普通的情况的下我们看到int都知道是整数型 就要输入整数 那万一在手误的情况下输入了AA或者不是整数类型的时候就会导致它报错 那么这个报错也叫做异常
- 如下
- 那么我们如何解决这个异常呢?
2.用Try…catch处理异常
- Try…catch是处理异常的二种方法之一,适合处理程序员可以控制和用户输入有误的情况,以起到程序开发顺利进行和避免不必要情况的发生
- 语法格式:Try{
** 容易出现异常的语句*
}
catch(Exception e ){
} - e为对象名 可以随便取 但一般都是用e
- 实例操作
//导包
* import java.util.Scanner;
public class L2_1 {
//主函数
public static void main(String[] args) {
//创键盘扫描仪
Scanner in = new Scanner(System.in);
//创建变量
int A,B,C;
//捕获异常 try
try {
//接收用户输入
A = in.nextInt();
//接收用户输入
B = in.nextInt();
//将用户输入的 取余 并赋值给C
C = A % B;
//打印
System.out.println("取余的结果为;"+C);
} catch (Exception e) {
//打印
System.out.println("输入有误");
}
//打印
System.out.println("程序顺利进行");
}
}
-
解析
-
try里面是容易出问题的代码 而catch是出现问题怎么办 如果try里面有异常的出现异常也就不在执行try里面的语句了 而是执行 catch里面的语句 可以理解为if…else 但与if…else不同的是 Try…catch可以处理异常的操作且不会让程序终止 如果try语句顺利执行 那么就不在执行catch里面的语句
-
注意的是 catch括号里面Exception为异常的意思后面跟着一个e 是对象名写什么都可以 但在一般情况下 都是写一个小写的e
-
程序正确运行情况如下
-
-
当输入正确的时候 直接跳过catch里面语句
-
程序出现异常情况如下
-
-
当输入有误的时候 直接结果try里的语句 并执行catch里面的语句
-
注意!
-
一定要把相应(异常)的语句写在try语句{ }里 catch后面必须有括号() 括号里写(Exeption 对象名){ } 如catch(Exeption e){ }
3. 用throws处理异常
- throws是处理异常的二种方法之一,它的处理方法是将异常抛给上一级处理,如都不能处理,最终抛给虚拟机处理,这个过程我们称为抛异常.这种方法适合比较严重的异常和程序员无法预料或无法完全避免异常发生的轻狂,以及无处处理的异常!;
- 抛异常语法格式
- 方法() 后面写 throws Exception
- 代码演示如下
import java.util.Scanner;
* public class L2_1 {
* //创建类
static class A {
//创建一个方法 throws Exception为抛异常
void B() throws Exception {
//创建三个变量
int A, B, C;
//键盘扫描仪
Scanner in = new Scanner(System.in);
//接收用户输入
A = in.nextInt();
//接收用户输入
B = in.nextInt();
//将用户输入的二个值进行取余 并赋值给C
C = A % B;
//打印结果
System.out.println("取余的结果余数为;" + C);
}
}
//程序入口
public static void main(String[] args) {
//调用类 A
A aa=new A();
//处理异常 try catch
try {
//调用方法
aa.B();
} catch (Exception e) {
//打印
System.out.println("输入有误");
}
//打印
System.out.println("程序顺利进行");
}
}
- 方法B()后面 throws Exception就是抛异常了
- 抛异常就相当于员工解决不了的事情给老板解决,反正总要有一个人要把这个问题给解决了!
- 代码解析
- 1.方法B()里面出现了异常 自己不处理而是请求上级处理就往上抛
- 2.也就抛给了调用这个方法的!如果方法B()不出现问题则顺利进行 如果 方法B()出现异常则抛给使用改方法的!
- 3.抛给主函数try里 而try就是处理异常
- 这里我们看一下运行结果
- 正确运行
- 异常运行
- 当然如果这里不使用try 直接调用方法 那么则会导致程序报错! 如下
- 如何解决 可以继续往上抛 让虚拟机处理!
- 代码如下
//导包
import java.util.Scanner;
* public class L2_1 {
* //创建类
static class A {
//创建方法B 抛异常 throws Exception
void B() throws Exception {
//创建 变量
int A, B, C;
//创建键盘扫描仪
Scanner in = new Scanner(System.in);
//接收用户输入
A = in.nextInt();
//接收用户输入
B = in.nextInt();
//将用户输入的进行取余 并赋值给C
C = A % B;
//打印
System.out.println("取余的结果余数为;" + C);
}
}
//主函数
public static void main(String[] args) throws Exception {
//调用 类
A aa=new A();
//调用 方法
aa.B();
//打印
System.out.println("程序顺利进行");
}
}
-
代码运行结果如下
-
正确运行
-
-
错误运行
-
为什么错误运行会报错呢 不是已经抛给虚拟机让虚拟机处理了嘛?
-
因为这里接收的是整数但我们输入的是字符 主函数没发处理 则报错了!
-
所以尽量在觉得有异常的时候用try…catch语句直接处理掉
-
尽量在程序异常萌芽时期处理掉!
-
这便是处理异常的二种方法!
4.Finally类
- Finally语句是起到出来出口的作用,用在try…catch语句的最后,无论是否出现异常(catch中的语句是否被执行),Finall里的语句都会被执行,这样可以更好的控制程序的走向!
- 什么是起到出口作用呢?
- 这样可以看着try是入口 而catch是出口 真正总结一个好的出口那么就是Finally里面
- 代码如下
public class Lucy {
static class A {
//创建一个方法 throws Exception为抛异常
void B() throws Exception {
//创建三个变量
int A, B, C;
//键盘扫描仪
Scanner in = new Scanner(System.in);
//接收用户输入
A = in.nextInt();
//接收用户输入
B = in.nextInt();
//将用户输入的二个值进行取余 并赋值给C
C = A % B;
//打印结果
System.out.println("取余的结果余数为;" + C);
}
}
//程序入口
public static void main(String[] args) {
//调用类 A
A aa = new A();
//处理异常 try catch
try {
//调用方法
aa.B();
} catch (Exception e) {
//打印
System.out.println("输入有误");
}
finally {
System.out.println("程序顺利进行");
}
}
}
- finally里面可以写循环或者调用方法等等并不是只能写输出语句
- finally类可以让代码的可读性 功能性变得非常强!