Java使用try-catch语句来处理异常,将可能出现的异常操作放在try部分,一旦try部分抛出异常对象,或调用某个可能抛出异常对象的方法,并且该方法抛出了异常对象,那么try部分就会立刻结束执行,转向执行相应的catch部分。
程序可以将发生异常后的处理放在catch部分,try-catch语句可以有多个catch部分,分别处理相应的异常;
try-catch语句的格式如下:
try {
包含可能发生异常的语句
} catch (Exception e){
.....
}catch (Exception e){
.....
}finally{
.....
}
finally部分呢是不管前面的catch语句有没有执行,但是一定会执行finally语句部分;
try-catch语句可以搭配catch部分和finally部分一起使用,一个try-catch语句一定要包含一个或多个catch部分或者finally部分,不能单独出现try部分;
e.printStackTrace()方法介绍
try {
包含可能发生异常的语句
} catch (Exception e){
e.printStackTrace();
}
e.printStackTrace()方法可以打印出错误的堆栈信息,包括错误的描述,错误的类型以及错误出现的地方,举个例子:
import java.util.Scanner;
public class Demo1 {
//输入两位整数,求商
public static void main(String args[]) {
int a,b;
Scanner sc = new Scanner(System.in);
System.out.println("请输入两位整数:");
try {
System.out.println("请输入第1位整数:");
int one = sc.nextInt();
System.out.println("请输入第2位整数:");
int two = sc.nextInt();
System.out.println("两位之商为::"+(one/two) );
}catch(Exception e){
e.printStackTrace();
}
}
}
当我们输入6和的时候,程序正常执行,结果为3
当我们输入6和0的时候,大家都知道,在数学运算中被除数不能为,所以程序会报错,并打印出相关的错误信息,如下图所示
try-catch-finally语句的用法
还是上面那个例子,在上面的例子末尾加上finally语句,并且打印输出“运算结束”
import java.util.Scanner;
public class Demo1 {
//输入两位整数,求商
public static void main(String args[]) {
int a,b;
Scanner sc = new Scanner(System.in);
System.out.println("请输入两位整数:");
try {
System.out.println("请输入第1位整数:");
int one = sc.nextInt();
System.out.println("请输入第2位整数:");
int two = sc.nextInt();
System.out.println("两位之商为::"+(one/two) );
}catch(Exception e){
e.printStackTrace();
}finally {
System.out.println("运算结束");
}
}
}
运行结果为:(不管有多少catch语句,finally语句是一定会被执行的)
当在catch语句中加入System.exit(1);时,如果程序有异常,跳转到执行catch方法,然后执行System.exit(1)语句时,程序会被终止,即不会打印出异常错误信息,也不会执行后面的finally语句,结果如下图。(括号里的1自己设定,不为0即可)
所以System.exit(1)语句的作用是终止程序运行;
throws
可以通过throws声明将要抛出何种类型的异常,通过throw将产生的异常抛出;
如果一个方法可能会出现异常,可以在方法声明处用throws子句来声明抛出异常;
throws语句用在方法定义时声明该方法要抛出的异常类型,如:
public void method() throes Exception1,Exception2,~~ExceptionN{
//可能产生异常的代码
}
还是刚刚那个例子,这里面就没有try catch语句了,直接用throws抛出异常
import java.util.Scanner;
public class Demo1 {
//输入两位整数,求商
public static void main(String args[]) throws Exception{
int a,b;
Scanner sc = new Scanner(System.in);
System.out.println("请输入两位整数:");
System.out.println("请输入第1位整数:");
int one = sc.nextInt();
System.out.println("请输入第2位整数:");
int two = sc.nextInt();
System.out.println("两位之商为::"+(one/two) );
System.out.println("运算结束");
}
}
通过throws在方法声明处抛出异常,亦可以继续往上抛出,此时可以抛出与throw对象相同的类型或其父类
自定义异常
所谓的自定义异常,就是定义一个类,去继承throwable类或者它的子类
先定义一个HotelAgeException类(自定义异常类)
public class HotelAgeException extends Exception {
public HotelAgeException() {
System.out.println("未成年禁止单独入住酒店");
}
}
然后在写主方法中去调用这个自定义异常类
import java.util.Scanner;
public class Demo2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
test();
} catch (HotelAgeException e) {
// TODO Auto-generated catch block
//这里就会去调用HotelAgeException类里面的东西了
}
}
public static void test() throws HotelAgeException {
System.out.println("请输入年龄: ");
Scanner sc = new Scanner(System.in);
int age = sc.nextInt();
if(age<18) {
throw new HotelAgeException(); //自定义异常类
}else {
System.out.println("欢迎入住本酒店");
}
}
}
个人总结,仅供参考哦