文章目录
Java异常
异常概述
异常在通常情况下指的是发生在正常情况以外的事件,也就是一切不正常的情况.程序在运行过程中发生这样或那样的异常及错误是不可避免的,因此一个好的应用程序需要对可能出现的异常进行处理
而通常情况下计算机系统对异常的处理有两种方法;
-
计算机系统直接检测程序中出现的错误,一但出现错误,便将程序终止
-
由程序员在程序设计中加入处理异常的功能,其中又可以分为有异常处理机制的程序设计语言和没有异常处理机制的程序设计语言两种. 而java就是有异常处理机制的程序设计语言.
Java的异常处理机制
Java的异常处理机制用于及时有效地处理程序执行中的异常错误.在这种机制下,我们可以监视程序中可能出现异常的代码块,将程序中可能出现异常的代码收集起来放在某一段中处理,使得正常执行的代码与异常处理的代码分离.
当java程序在运行过程发生异常时,有两种处理办法.
- 当程序中没有try-catch语句时:java虚拟机会默认在控制台打印输出异常信息(本质上是一个异常类型的对象),然后终止程序运行.
- 当程序中有try-catch语句时:会自行根据try-catch-finally语句处理异常,这种方式的优点很明显,程序代码和异常处理的代码分离增加程序可读性,程序在运行过程中也不会提前终止.
异常类的继承关系
java中定义了许多异常类,每个异常类都代表了一种异常错误,这些类的继承关系如图所示
Java中的所有异常类都是继承自Throwable类
并且,直接继承RuntimeExcepion类的都是运行期异常类
除了RuntimeExcepion类外直接继承自Excepion类的都是编译期异常
Java的异常处理语句
一个标准的try-catch-finally语句
public static void main(String[] args) {
int a=10;
int b=0;
try {
//可能出现异常的代码,代码范围要尽可能的精确
System.out.println(a=a/b);
//一旦执行到出现异常的代码,在同一try语句中后面的代码将不会执行,而是直接执行对应的catch中的语句
System.out.println("aaaaa"); //不会被执行
}catch (ArithmeticException e){ /*当try中出现相应的异常时 会被捕捉,因此这里给定的异常类型必须准 确,当不确定异常类型时,可以给出较高的异常类型如:Exception*/
//处理代码,在捕获到异常后才能执行的代码,可以输出一些提示信息
System.out.println("0不能做除数");
}finally {
//无论是否发生异常都会执行的代码块,是这个组合语句的出口因此只能有一个finally语句块,一般用于做一些善后工作
System.out.println("finally语句块");
}
System.out.println("********");
}
try-catch-finally语句的也可以嵌套
public static void main(String[] args) {
int a=10;
int b=0;
String s=null;
//try-catch语句中可以嵌套try-catch语句
try {
System.out.println(a/b);
//与没有嵌套时相同,当此处出现异常时,当前try语句后面的代码不会被执行,直接运行到当前try语句对象的catch语句
try {
s.length();
System.out.println("aaaa");
}catch (NullPointerException e){
System.out.println("空指针异常");
System.out.println("bbbb");
}
}catch (ArithmeticException e){
System.out.println("0不能做除数");
System.out.println("cccc");
}finally {
//始终会被执行
System.out.println("finally语句块");
}
System.out.println("dddd");
}
throws和throw
throws 用在方法声明处理,声明此方法可能会抛出一个或多个异常
throw 用来明确的抛出一个异常,从而改变程序的运行执行流程,使程序跳转到相应的异常处理语句中执行.
public static void main(String[] args) {
int num=101; //输入任意成绩
try {
text(num);
} catch (Exception e) {
e.getMessage();
}
}
//一个自定义的成绩异常处理
public static void text(int num)throws Exception{ //声明此方法可能会抛出一个或多个异常
if (num>100){
// 抛出一个编译期异常对象,需要在当前位置进行异常处理或者抛出
throw new Exception("成绩输入不合法");
}
}
异常的方法
public static void main(String[] args) {
try {
int i=100/0;
}catch(Exception e){
e.getMessage(); //获得异常原因
e.printStackTrace();//打印异常信息以及异常在程序中的位置
}
}
自定义异常类
当java中提供的异常类无法满足我们的需要时我们也可以自定义异常类,通过继承RuntimeExcepion类或Excepion类来确定自己定义的异常类类型.
并且自定义异常类一般只需要重写父类的构造方法
如下所示定义一个成绩异常类
package com.yhl.javathrow.day1;
public class ChengJiYichang extends Exception{
public ChengJiYichang() {
}
public ChengJiYichang(String message) {
super(message);
}
}
测试类
package com.yhl.javathrow.day1.test;
import com.yhl.javathrow.day1.ChengJiYichang;
public class Demo6 {
public static void main(String[] args) {
int num=100; //输入任意成绩
text(num);
}
//一个自定义的成绩异常处理
public static void text(int num){
if (num>100){
try {
throw new ChengJiYichang("成绩输入不合法");
} catch (ChengJiYichang chengJiYichang) {
chengJiYichang.printStackTrace(); //使用自己定义的异常类
}
}
}
}
常见的几种异常
public static void main(String[] args) {
/* //1.算法异常 ArithmeticException
int a=10;
int b=0;
a=a/b;*/
/* //2.空指针异常 NullPointerException
String s=null;
s.concat("a");*/
/* //3.数组下标索引越界异常 ArrayIndexOutOfBoundsException
int []a=new int[5];
a[5]=10;*/
/* //4.类类型转换异常 ClassCastException
java.lang.String cannot be cast to java.lang.Integer
String s="asd";
Object obj=s;
int i= (int) obj;*/
/* //5.格式转换异常 NumberFormatException
int a=Integer.parseInt("aa");
System.out.println(a);*/
}