Java入门系列-20-异常
为什么要进行异常处理
下面这段代码能否正常执行
public class DemoCalc {
public static void main(String[] args) {
int a=0;
int b=0;
int c=a/b;
System.out.println("运算结果为:"+c);
}
}
结果是我们在控制台中看到一段错误提示,那是因为除数不能为0。异常就是在程序运行过程中发生的不正常事件,会中断运行的程序。
Java 使用了异常处理机制为程序提供了错误处理的能力,在程序中预先设置好对付异常的处理办法,待程序发生异常时对异常进行处理,处理完毕后,程序便可以继续运行。
下面来看一下Java中是如何进行异常处理的
如何进行异常处理
Java 的异常处理是通过5个关键字实现的:try、catch、finally、throw、throws
关键字 | 作用 |
---|---|
try | 执行可能产生异常的代码 |
catch | 捕获异常 |
finally | 无论是否发生异常,代码总能执行 |
throws | 声明方法要抛出的异常 |
throw | 手动抛出异常 |
常见异常及异常分类
Throwable 是Java 中所有错误和异常的父类
Error类:Throwable的子类,仅靠程序本身无法恢复的严重的错误。
Exception类:Throwable的子类,由Java应用程序抛出和处理的非严重错误
RuntimeException类:Exception的子类,运行时异常,不要求程序必须做出处理。
Checked异常:Exception的子类,程序必须处理该类异常。
常见异常类型
异常类型 | 说明 |
---|---|
Exception | 异常层次结构的父类 |
ArithmeticException | 算数错误情形,如以零作除数 |
ArrayIndexOutOfBoundsException | 数组下标越界 |
NullPointerException | 尝试访问null对象成员 |
ClassNotFoundException | 不能加载所需的类 |
IllegalArgumentException | 方法接收到非法参数 |
ClassCastException | 对象强制类型转换出错 |
NumberFormatException | 数字格式转换异常,如把"abc"转换成数字 |
try-catch
语法:
public void method(){
try{
//代码段1
//可能产生异常的代码段
//代码段2
}catch(异常类型 ex){
//对异常进行处理的代码段
}
//代码段
}
try-catch块捕获异常有三种情况:
1、try块中没有任何异常,try中正常,catch不会执行,正常执行try-catch后的代码。
2、try块中可能发生异常的代码段发生异常,代码段2不会执行,而是执行catch中异常处理的代码,正常执行try-catch后的代码。
catch中异常类型的printStackTrace() 方法能进行堆栈跟踪显示出程序运行到当前类的执行流程,异常堆栈信息中包含了异常的类型及异常出现的位置。
3、异常类型不匹配,程序将中断。比如try产生的异常为ArithmeticException,catch却用了 ClassCastException。
在控制台中接收数字做除法运算
import java.util.Scanner;
public class DemoInput {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
try{
System.out.println("请输入被除数(整数):");
int a=input.nextInt();
System.out.println("请输入除数(整数):");
int b=input.nextInt();
int c=a/b;
System.out.println("结果:"+c);
}catch(Exception ex) {
ex.printStackTrace();
}
System.out.println("程序结束");
}
}
try-catch-finally
语法:
public void method(){
try{
//可能会发生异常的代码
}catch(异常类型 ex){
//异常处理
}finally{
//无论如何都要执行的代码
}
}
finally块:是否发生异常都执行
finllay块不执行的唯一情况:之前的代码中执行了 System.exit(1); 退出虚拟机
try-catch-finally的使用
import java.io.FileNotFoundException;
import java.util.Scanner;
public class DemoInput {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
try{
System.out.println("请输入被除数(整数):");
int a=input.nextInt();
System.out.println("请输入除数(整数):");
int b=input.nextInt();
int c=a/b;
System.out.println("结果:"+c);
}catch(Exception ex) {
ex.printStackTrace();
}finally {
System.out.println("感谢您的使用");
}
System.out.println("程序结束");
}
}
如果在try块或catch块中有return语句,finally是否还会执行?运行下面代码断点调试观察结果。
public class TestReturn {
public static void main(String[] args) {
try {
int a=1+1;
System.out.println("try执行");
return;
} catch (Exception e) {
System.out.println("catch执行");
}finally {
System.out.println("finally执行");
}
}
}
try块或catch块中可以有return语句,如果有return语句会先执行finally最后再执行return。
多重catch
try块中可能会发生多种异常,如果要不同的异常进行不同的处理,需要使用多重catch进行处理。
语法:
public void method(){
try{
//可能发生异常的代码段
}catch(异常类型1 e){
//对异常类型1进行的处理的代码段
}catch(异常类型2 e){
//对异常类型2进行的处理的代码段
}catch(异常类型n e){
//对异常类型n进行的处理的代码段
}
}
当try块中发生异常后,会逐个与catch中的异常类型进行匹配,匹配成功后,进入对应的catch进行异常处理,处理完成后不再进入其他catch,程序继续执行。
排列catch语句的顺序是:先子类后父类
发生异常时按顺序逐个匹配
只执行第一个与异常类型匹配的catch语句
将之前的代码 DemoInput.java 改造成多重catch
import java.io.FileNotFoundException;
import java.util.InputMismatchException;
import java.util.Scanner;
public class DemoInput {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
try{
System.out.println("请输入被除数(整数):");
int a=input.nextInt();
System.out.println("请输入除数(整数):");
int b=input.nextInt();
int c=a/b;
System.out.println("结果:"+c);
}catch(InputMismatchException e) {
System.out.println("输入的数有误!");
}catch(ArithmeticException e) {
System.out.println("除数不能为0");
}catch(Exception ex) {
System.out.println("发生未知异常");
}finally {
System.out.println("感谢您的使用");
}
System.out.println("程序结束");
}
}
声明异常 throws
如果一个方法体内抛出了异常如何通知调用者,可以在方法上声明异常。
public class TestThrows {
//声明异常,多个异常可以用逗号隔开
public void test()throws Exception,ClassNotFoundException{
//可能会发生异常的代码
}
}
处理方式一:调用者处理异常
public static void main(String[] args) {
TestThrows t=new TestThrows();
try {
t.test();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
处理方式二:调用者继续声明异常
public static void main(String[] args) throws ClassNotFoundException, Exception {
TestThrows t=new TestThrows();
t.test();
}
main方法继续声明异常,调用者就变成虚拟机了,发生异常则按默认方式处理,打印出来。
抛出异常 throw
除了系统自动抛出的异常外,有些问题需要程序员自行抛出异常
public class TestThrow {
public void inputAge(int age) throws Exception {
if (age<1) {
throw new Exception("还有这种年龄?");
}
}
public static void main(String[] args) {
TestThrow t=new TestThrow();
try {
t.inputAge(-1);
} catch (Exception e) {
System.out.println("年龄有误:"+e.getMessage());
}
}
}
自行抛出异常后,还需要在方法上声明异常

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
python Kmeans算法解析
一. 概述 首先需要先介绍一下无监督学习,所谓无监督学习,就是训练样本中的标记信息是位置的,目标是通过对无标记训练样本的学习来揭示数据的内在性质以及规律。通俗得说,就是根据数据的一些内在性质,找出其内在的规律。而这一类算法,应用最为广泛的就是“聚类”。 聚类算法可以对数据进行数据归约,即在尽可能保证数据完整的前提下,减少数据的量级,以便后续处理。也可以对聚类数据结果直接应用或分析。 而Kmeans 算法可以说是聚类算法里面较为基础的一种算法。 二. 从样例开始 我们现在在二维平面上有这样一些点 x y 1.658985 4.285136 -3.453687 3.424321 4.838138 -1.151539 -5.379713 -3.362104 0.972564 2.924086 -3.567919 1.531611 0.450614 -3.302219 -3.487105 -1.724432 2.668759 1.594842 -3.156485 3.191137 3.165506 -3.999838 -2.786837 -3.099354 4.208187 2.984927 ...
-
下一篇
Java方向如何准备BAT技术面试答案(收藏集)
Java方向如何准备BAT技术面试答案(收藏集) 这个主题的内容之前分三个篇幅分享过,导致网络上传播的比较分散,所以本篇做了一个汇总,同时对部分内容及答案做了修改,欢迎朋友们吐槽、转发。因为篇幅长度和时间的原因,部分答案我没有亲自总结。 1.面向对象和面向过程的区别 面向过程 优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。 缺点:没有面向对象易维护、易复用、易扩展 面向对象 优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护 缺点:性能比面向过程低 2.Java的四个基本特性(抽象、封装、继承,多态) 抽象:就是把现实生活中的某一类东西提取出来,用程序代码表示,我们通常叫做类或者接口。抽象包括两个方面:一个是数据抽象,一个是过程抽象。数据抽象也就是对象的属性。过程抽象是对象的行为特征。 封装:把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行封装隐藏。封装分...
相关文章
文章评论
共有0条评论来说两句吧...