- 实验目的
- 编写try-catch块处理异常
- 实验内容
1.【NumberFormatException异常】编写一个程序,提示用户输入两个整数,然后显示它们的和。用户输入错误时提示用户重新输入。
-
- 运行结果及其分析
测试数据一(正确的输入):
测试数据二(输入浮点数):
测试数据三(输入字母):
由以上测试结果可知,该程序完全符合实验要求、
1.2心得体会
以后遇到一个错误类型,先要去了解它是什么类型,最好直接去官网。比如这里错误类型NumberFormatException是类型转换错误。然后还有一点就是,它会自己抛出,只要捕获就行了。
1.3源代码如下
import java.util.Scanner;
/*.【NumberFormatException异常】编写一个程序,提示用户输入两个整数,然后显示它们的和。用户输入错误时提示用户重新输入。
不要自建类
s
*/
public class Program1 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入两个整数:");
boolean flag = true;
do{
try {
String a = input.next();
String b = input.next();
System.out.println(a+"+"+b+"="+(Integer.valueOf(a)+Integer.valueOf(b)));
flag = false; //只要在某一步捕获到错误就退出
}
catch (NumberFormatException ex){
System.out.println("对不起!您的输入有误!\n请重新输入两个整数:");
}
}while (flag);
}
}
2.(P419, 12.3)【ArrayIndexOutOfBoundsException异常】编写一个程序,创建一个由100个随机选取的整数构成的数组;提示用户输入数组下标,然后显示元素的值,如果指定的下标越界,显示消息out of bounds。
2.1运行结果及其分析
测试数据一(输入正确):
测试数据二(输入错误数据):
由上面的测试结果可知,该程序完全符合实验要求。
2.2心得体会
为了达到实验目的,也可以直接自己在try语句块中抛出。总而言之, 异常处理机制非常美妙。
2.3源代码如下
import java.util.Scanner;
public class Program2 {
public static void main(String[] args) {
int[] random = new int[100];
Scanner input = new Scanner(System.in);
for(int i=0;i<100;i++)
random[i] = (int)(Math.random() * 100000);
boolean flag = true;
System.out.print("请输入数组下标(0-99):");
do{
try{
int index = input.nextInt();
if(index < 0 || index >99)
throw new ArrayIndexOutOfBoundsException("out of bounds");
System.out.println(random[index]);
flag = false;
}
catch (ArrayIndexOutOfBoundsException ex){
System.out.print("out of bounds!请重新输入:");
}
}while (flag);
}
}
3. 请将下图所示的内容转换成可运行的代码,尝试抛出不同类型的异常,理解寻找异常处理器的过程及代码执行的流程
3.1运行成果及其分析
检验一:
检验二:
检验三:
检验四:
3.2心得体会
怎么去用程序去体会异常处理机制,本来思路已经很清晰了。却没想到由于代码量比较多,一下就乱了思路,顿生烦躁。我想这莫不就是Java开发人员易秃头的原因,hh。所幸最后还是编了一个检验各种情况下,异常处理机制运行的超级全的小程序。内心还是欣喜的,通过这个程序可随时体验异常处理的基本机制。
然后还发现了几个问题: 如果函数中显示抛出一个异常,所有cacth语句都无法捕获时,会报错;如果一个方法中抛出了一个必检异常,该方法和调用该方法的所有上一级方法都需要声明该异常。
3.3源代码如下
package Lab6;
import java.io.IOException;
import java.util.Scanner;
/*请将393页图12-3所示的内容转换成可运行的代码,尝试抛出不同类型的异常,理解寻找异常处理器的过程及代码执行的流程。*/
public class Program3 {
public static void method1(int a){//整数除以0异常
try {
System.out.println("方法一中调用方法二时的前面一条语句");
if(a == 1){
System.out.println("方法一中抛出ArithmeticException");
throw new ArithmeticException("1");
}
method2(a);
System.out.println("方法一中调用了方法二后的语句");
}
catch (NullPointerException ex){
System.out.println("方法一捕捉到方法三中的NullPointerException");
}
System.out.println("方法一try catch 块结束后的语句");
}
public static void method2(int a) //数组越界
{
try{
if(a == 2){
System.out.println("方法二中抛出IndexOutOfBoundsException");
throw new IndexOutOfBoundsException("2");
}
System.out.println("方法二中调用方法三时的前面一条语句");
method3(a);
System.out.println("方法二中调用方法三的后面一条语句");
}catch (NullPointerException ex){
System.out.println("方法二中捕捉到方法三中的NullPointerException");
}
System.out.println("方法二try catch 块结束后的语句");
}
public static void method3(int a) {//空指针异常 and IllegalArgumentException
try {
if(a == 3){
System.out.println("方法三中抛出NullPointerException");
throw new NullPointerException("3");
}
if(a == 4)
{
System.out.println("方法三中抛出ClassNotFoundException");
//throw new ClassNotFoundException("4");
Object o = new Object();
String s = (String)o;
}
}catch (IllegalArgumentException ex){
System.out.println("方法三中捕捉到IllegalArgumentException");
}
System.out.println("方法三try catch 块结束后的语句");
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("1.抛出方法一中的异常!(只有主函数可以捕捉)");
System.out.println("2.抛出方法二中的异常!(只有主函数可以捕捉)");
System.out.println("3.抛出方法三中的异常!(方法二和主函数可以捕捉)");
System.out.println("4.抛出方法三中的异常!(没有任何的方法可以捕捉)");
System.out.print("输入你想检验的操作前面的代号:");
int a = input.nextInt();
System.out.println("下面输出程序将执行的语句:");
System.out.println();
try {
System.out.println("主函数中方法一前面的语句");
method1(a);
System.out.println("主函数中方法一后面的语句");
}
catch (NullPointerException ex){
System.out.println("主函数中捕捉到方法三中的NullPointerException");
}catch (IndexOutOfBoundsException ex){
System.out.println("主函数中捕捉到方法二中的IndexOutOfBoundsException");
}
catch (ArithmeticException ex){
System.out.println("主函数中捕捉到方法一中的ArithmeticException");
}
finally {
System.out.println("主函数中的finally子句");
}
System.out.println("主函数try catch 块结束后的语句");
}
}