东西好多啊
异常是指在程序运行过程中所发生的不正常的事件,它会中断正在运行的程序。
首先是一个除法的小程序
那么如果除数是0 或者说你输入的除数和被输出不是数字 是字母啥的 那肯定会报错
public class Error1 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("一个除法运算小程序");
System.out.println("请输入被除数");
int n1 = in.nextInt();
System.out.println("请输入除数");
int n2 = in.nextInt();
System.out.println(n1+"/"+n2+"="+n1/n2);
System.out.println("感谢使用");
}
}
运行结果:
一个除法运算小程序
请输入被除数
a
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:864)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextInt(Scanner.java:2117)
at java.util.Scanner.nextInt(Scanner.java:2076)
at Error1.main(Error1.java:9)
//如果输入不是数字 输入格式异常 inputMismatchException
//如果输入是0 运算异常 ArithmeticException
//Exception是所有异常的父类
可以用传统的if来判断 修改代码 当然这里只改了除数 还没有改被除数 可以看到代码已经长了很多
class Error2{
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("一个除法运算小程序");
System.out.println("请输入被除数");
int n1 = in.nextInt();
System.out.println("请输入除数");
int n2 = 0;
if (in.hasNextInt()){ //判断输入的是不是整数
n2 = in.nextInt();
if (n2==0){ //用户输入了0
System.err.println("除数不能是0!有没有脑子???");
System.exit(1); //退出JVM,括号里非0代表异常终止
}
else{
System.out.println(n1+"/"+n2+"="+n1/n2);
System.out.println("感谢使用");
}
}
else{
System.err.println("你输入的不是整数,我不会算!");
System.exit(2);
}
}
}
运行结果:
一个除法运算小程序
请输入被除数
100
请输入除数
a
你输入的不是整数,我不会算!
简单的用try和catch来处理异常
把可能出现的异常套在try里面
然后用catch逮住出现的异常
class Error3{
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("一个除法运算小程序");
System.out.println("请输入被除数");
try { //尝试执行 但是可能会出现异常的代码
int n1 = in.nextInt();
System.out.println("请输入除数");
int n2 = in.nextInt();
System.out.println(n1 + "/" + n2 + "=" + n1 / n2);
System.out.println("感谢使用");
}catch(Exception e){ //捕获异常 队异常进行处理 e是一个对象名 随便取
System.err.println("你真笨 又错了 被除数和除数必须为整数且不为0");
System.exit(1);
}
}
}
运行结果:
一个除法运算小程序
请输入被除数
A
你真笨 又错了 被除数和除数必须为整数且不为0
printStackTrace这个方法可以输出异常的堆栈信息
可以看到错误是在83行 一点下就能直接过去
并且可以看到 / by zero 说明是除法除了0导致错误
getMessage也有类似功能
class Error4{
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("一个除法运算小程序");
System.out.println("请输入被除数");
try { //尝试执行 但是可能会出现异常的代码
int n1 = in.nextInt();
System.out.println("请输入除数");
int n2 = in.nextInt();
System.out.println(n1 + "/" + n2 + "=" + n1 / n2);
System.out.println("感谢使用");
}catch(Exception e){ //捕获异常 队异常进行处理 e是一个对象名 随便取
System.err.println("你真笨 又错了 被除数和除数必须为整数且不为0");
//System.exit(1); 比较极端的处理方式 直接终止JVM
e.printStackTrace(); //输出异常的堆栈信息
}
System.out.println("溜了溜了");
}
}
运行结果:
一个除法运算小程序
请输入被除数
100
请输入除数
0
你真笨 又错了 被除数和除数必须为整数且不为0
java.lang.ArithmeticException: / by zero
at Error4.main(Error1.java:83)
溜了溜了
class Error6{
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
try { //尝试执行 但是可能会出现异常的代码
// System.out.println("输入数组的长度");
// int n1 = in.nextInt(); //输入数组的长度
// System.out.println("输入数组中的数");
// int[] n2 = new int[n1]; //
// for ( int i =0; i < n1; i++) {
// n2[i] = in.nextInt();
// }
// System.out.println(n2[5]);
//ArrayIndexOutOfBoundsException 数组下标越界
String a = null;
System.out.println(a.equals("我是老王"));
//NullPointerException 空指针异常
// return; return本来会直接跳出方法 但是这里会先finally 再return 可打断点看
}catch(Exception e){ //捕获异常 队异常进行处理 e是一个对象名 随便取
System.err.println("你真笨 又错了 ");
//System.exit(1); 比较极端的处理方式 直接终止JVM
e.printStackTrace(); //输出异常的堆栈信息
System.out.println(e.getMessage()); //返回异常信息的描述字符串 是printStackTrace的一部分
return; //return本来会直接跳出方法 但是这里会先finally 再return 可打断点看
}finally { //catch和finally必须出现其中一个
System.out.println("溜了溜了");
}
}
}
catch的异常从子类和同级再到父类
从上往下 逮到一个就不会再逮了
例如
class Error7{
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("一个除法运算小程序");
System.out.println("请输入被除数");
try { //尝试执行 但是可能会出现异常的代码
int n1 = in.nextInt();
System.out.println("请输入除数");
int n2 = in.nextInt();
System.out.println(n1 + "/" + n2 + "=" + n1 / n2);
System.out.println("感谢使用");
}catch(ArithmeticException e){ //先子类后父类 逮到就不逮了
System.out.println("除数异常");
}
catch(Exception e){ //捕获异常 队异常进行处理 e是一个对象名 随便取
System.err.println("你真笨 又错了 被除数和除数必须为整数且不为0");
//System.exit(1); 比较极端的处理方式 直接终止JVM
e.printStackTrace(); //输出异常的堆栈信息
System.out.println(e.getMessage()); //返回异常信息的描述字符串 是printStackTrace的一部分
}finally { //catch和finally必须出现其中一个
System.out.println("溜了溜了");
}
}
}
可以再方法里用throws抛出异常
class Error8{
public void error1 () throws ArithmeticException,InputMismatchException{
Scanner in = new Scanner(System.in);
System.out.println("一个除法运算小程序");
System.out.println("请输入被除数");
int n1 = in.nextInt();
System.out.println("请输入除数");
int n2 = in.nextInt();
System.out.println(n1 + "/" + n2 + "=" + n1 / n2);
System.out.println("感谢使用");
}
public static void main(String[] args) {
Error8 er = new Error8();
try { //尝试执行 但是可能会出现异常的代码
er.error1();
}catch(ArithmeticException e){ //先子类后父类 逮到就不逮了
System.out.println("除数异常");
}catch(InputMismatchException e){
System.out.println("输入格式异常");
}
catch(Exception e){ //捕获异常 队异常进行处理 e是一个对象名 随便取
System.err.println("你真笨 又错了 被除数和除数必须为整数且不为0");
//System.exit(1); 比较极端的处理方式 直接终止JVM
e.printStackTrace(); //输出异常的堆栈信息
System.out.println(e.getMessage()); //返回异常信息的描述字符串 是printStackTrace的一部分
}
finally { //catch和finally必须出现其中一个
System.out.println("溜了溜了");
}
}
}
throw可以手动抛出一个异常(就是也可新建一个自定义异常)