一、异常作业:
1.简述什么是异常、异常的继承体系?
异常:在java程序运行过程中,出现的不正常的情况,出现的错误,称为异常。 Java异常体系 |——Throwable:可抛出的,异常的顶层父类,异常类都是它的子类 (实现类描述java的错误和异常) |——Error 错误,用于描述那些无法捕获和处理的错误情况,属于非常严重的错误。 StackOverflowError(错误)一般不通过代码去处理。 |——Exceprion (异常) |——RuntimeException 异常,用于描述那些可以捕获和处理的异常情况,属于不太严重的错误,ArraysIndexOutOfBoundsException (运行时异常) |——非运行时异常(受检查异常) |
- 简述异常的处理方式?
1在jvm中默认处理异常的机制 ①在代码的某个位置,出现和正常情况不同的情况,就将异常封装到一个异常对象。 ②将异常对象抛给调用该方法的方法。 ③某个方法接收到抛过来的异常,也没有办法自己处理,继续向上抛出,最终抛给主方法,主方法也没有办法处理,抛给调用自己的jvm虚拟机。 ④JVM只能将错误信息通过错误流打印出来。 2手动处理异常的方式(两种方式) ①异常的声明:某个方法有编译时异常,编译就会无法通过,需要在异常所在的方法声明上,声明该方法可能出现的编译异常。 ②异常的处理:出现异常之后,可以通过某些格式来捕获和处理异常,可以定义自己处理异常的逻辑。 |
- throw和throws关键字的使用位置和格式?
throws关键字在方法声明时,进行异常的抛出,交给方法的调用者去处理。当方法的调用者也不知道如何处理,或不想处理时,可以继续向上抛出。 格式:throws 异常类名 类型 方法名(参数列表) throws 异常列表{ 代码 } throw在方法中可能出现异常的语句下面抛出抛出异常对象 throw new 异常名称() 格式为:throw ThrowableObject 例如:throw new ArithmeticException(); |
- 多个catch处理的注意事项?
异常捕获的先后顺序应该“从小到大”。catch(Exception e)模块一般都写在catch块的最下面 单个try块能有许多catch块,当try块有“可能引起不同类型异常”的语句时,多个catch块是必须的。 |
- 简述finally关键字的特点和作用?
Final修饰的代码无论会不会出现异常都一定会执行,除非虚拟机挂掉了 代码中有必须要执行的代码(比如释放资源)的情况可以使用finally |
- Throwable类的常见方法及方法描述?
|
- 自定义异常的步骤?
定义一个异常类继承Exception 或 RuntimeException 重写父类的方法 public class 异常类名称 extends Exception/RuntimeException{ //无参构造方法 public 异常类名称(){
} //有参构造 public 异常类名称(String message){ super(message); } } |
8 首先预测下列程序的运行结果,然后编译、执行以验证你的预测:
import java.io.*;
public class C11{
public static void main(String args[]) {
for(int i = 0; i < 4;i++) {
int k;
try {
switch( i ) {
case 0:
int zero = 0;
k = 911 / zero;
break;
case 1:
int b[ ] = null;
k = b[0];
break;
case 2:
int c[ ] = new int[2];
k = c[9];
break;
case 3:
char ch = "abc".charAt(99);
break;
}
}catch(Exception e) {
System.out.println("\nTestcase #" + i + "\n");
System.out.println(e);
}
}
}
}
运行结果: Testcase #0 java.lang.ArithmeticException: / by zero Testcase #1 java.lang.NullPointerException Testcase #2 java.lang.ArrayIndexOutOfBoundsException: 9 Testcase #3 java.lang.StringIndexOutOfBoundsException: String index out of range: 99 |
- 将上述程序中catch(Exception e)更改为catch(ArithmeticException e),预测程序运行的结果并验证之。
Testcase #0 Exception in thread "main" java.lang.ArithmeticException: / by zero java.lang.NullPointerException at com.cc.exception.Demo09.main(Demo09.java:15) |
- 将上述程序中catch(Exception e)更改为catch(NullPointerException e),预测程序运行的结果并验证之。
Exception in thread "main" java.lang.ArithmeticException: / by zero at com.cc.exception.Demo09.main(Demo09.java:11) |
(4)在(3)的程序中添加一些语句,使得程序能够输出Exception Test Finished!的信息。(提示:使用finally语句)
public static void main(String args[]) { for(int i = 0; i < 4;i++) { int k; try { switch( i ) { case 0: int zero = 0; k = 911 / zero;//除数为0,算术异常 break; case 1: int b[ ] = null;//空指针异常 k = b[0]; break; case 2: int c[ ] = new int[2]; k = c[9];//索引越界异常 break; case 3: char ch = "abc".charAt(99); break;//类型不匹配 } }catch(NullPointerException e) { System.out.println("\nTestcase #" + i + "\n"); System.out.println(e); }finally{ System.out.println("Exception Test Finished!"); } } } } |
正则表达式:
1猜数游戏,随机生成一个1 到100之间的整数,从键盘输入数字进行猜数,一共可以猜5次,如果猜小了在控制台输出猜小了,如果猜大了,在控制台输出猜大了,如果猜
对了在控制台输入 恭喜你猜对了,并结束游戏。 注意当输入的不是数字或数字不合服规则时,不算次数
package com.cc.regex;
import java.util.Random;
import java.util.Scanner;
/*9 猜数游戏,随机生成一个1 到100之间的整数,从键盘输入数字进行猜数,一共可以猜5次,如果猜小了在控制台输出猜小了,如果猜大了,在控制台输出猜大了,如果猜
对了在控制台输入 恭喜你猜对了,并结束游戏。 注意当输入的不是数字或数字不合服规则时,不算次数*/
public class GuessNumberGame {
public static void main(String[] args) {
// 创建Scanner对象,并关联键盘,导包,Scanner在util包下面
Scanner sc = new Scanner(System.in);
// 创建Random 对象 Random 也是在util包下面
Random r = new Random();
System.out.println("********欢迎进入猜数字小游戏********");
int count = 1;
while (true) {
// [1,5] 或者 [0,5)都是5次,当大于5次的时候就提示用户免费次数已使用完,并使用break结束循环
if (count > 5) {
System.out.println("很遗憾☹,您的免费猜测次数已经使用完毕,若要继续猜测,请充值!");
break;
} else {
// 生成随机数
int rn = r.nextInt(100) + 1;
System.out.println("请输入您猜测的数字:");
// 使用字符串接收输入的数字,方便后面使用正则表达式的判断
String line = sc.nextLine();
// 定义正则表达式:[1-9]出现一次,[0-9]可以出现一次也可以不出现,也就是个位数和两位数
String regex = "[1-9][0-9]{0,1}";
// "\\D+"代表出现一次或者多次非数字,或者以0开头,或者是负数,或者长度大于3,以及等于三的时候不是100都是不合法的输入
if (line.matches("\\D+") || line.startsWith("0") || line.startsWith("-") || line.length() > 3
|| (line.length() == 3 && (!line.equals("100")))) {
System.out.println("您的输入不合法,请重新输入:");
// 输入不合法时,次数不加1
} else if (line.matches(regex) || line.equals("100")) {
// Integer类中的parseInt()方法可以将字符串的数字转换为整型,Integer的toString()方法可以将整型转换为字符串类型
int gn = Integer.parseInt(line);
if (gn > rn) {
System.out.println("猜大了哦^-^");
} else if (gn < rn) {
System.out.println("猜小了哦^-^");
} else {
// 当出现特殊符号时,需要保存为UTF-8格式
System.out.println("恭喜您,猜中了☺");
}
count++;
}
}
}
}
}
2.练习: 键盘录入一个QQ号,判断QQ号是否是合法
必须全部都是数字
必须5-15位数
0不能开头
package com.cc.regex;
import java.util.Scanner;
/*键盘录入一个QQ号,判断QQ号是否是合法
必须全部都是数字
必须5-15位数
0不能开头*/
public class TestQQNum {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入您的QQ号:");
String line = sc.nextLine();
String regex = "[1-9][0-9]{4,14}";// 一定记得不可以有空格哦,大括号里面以逗号分隔
if (line.matches(regex)) {
System.out.println("您输入的是一个合法的QQ号");
} else {
System.out.println("您输入的QQ号码不合法");
}
}
}