7.异常处理(练习)

运行时异常与一般异常有何异同
异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。

Java中的异常处理机制的简单原理和应用
答:当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。
违反语义规则包括2种情况。一种是JAVA类库内置的语义检查。例如数组下标越界,会引发IndexOutOfBoundsException;访问null的对象时会引发NullPointerException。另一种情况就是JAVA允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择在何时用throw关键字引发异常。所有的异常都是java.lang.Thowable的子类。

垃圾回收的优点和原理。并考虑2种回收机制
答:Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有"作用域"的概念,只有对象的引用才有"作用域"。
垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。

JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
答:Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。在Java中,每个异常都是一个对象,它是Throwable类或其它子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并进行处理。Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws和finally。一般情况下是用try来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,这时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理。
用try来指定一块预防所有"异常"的程序。紧跟在try程序后面,应包含一个catch子句来指定你想要捕捉的"异常"的类型。
throw语句用来明确地抛出一个"异常"。
throws用来标明一个成员函数可能抛出的各种"异常"。
Finally为确保一段代码不管发生什么"异常"都被执行一段代码。
可以在一个成员函数调用的外面写一个try语句,在这个成员函数内部写另一个try语句保护其他代码。每当遇到一个try语句,"异常"的框架就放到堆栈上面,直到所有的try语句都完成。如果下一级的try语句没有对某种"异常"进行处理,堆栈就会展开,直到遇到有处理这种"异常"的try语句。

try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
finally一定会执行:在return之前执行

给我一个你最常见到的runtime exception
答:常见的运行时异常有如下这些ArithmeticException, ArrayStoreException,
BufferOverflowException, BufferUnderflowException, CannotRedoException,
CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException,
DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException, ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException

error和exception有什么区别
答:error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况
exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况

在这里插入图片描述
//编译不通过,函数异常没有处理
编译失败:
如果func放上声明了该异常。结果是?B C D

package exceptiontest;

/**
 * describe:
 *
 * @author suoliang
 * @create 2021-06-23:39
 */
public class test7 {
    public static void func(){
        try {
            try {
                throw new Exception();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }finally {
            System.out.println("B");
        }
    }
    public static void main(String[] args) {
        try {
            func();//首先抛出异常--->B
            System.out.println("A");
        } catch (Exception e) {
            System.out.println("C");//--->C
        }
        System.out.println("D");//--->D
    }
}
//输出BAD
异常已经被catch捕获

在这里插入图片描述

class Demo {
	public static void main(String[] args) {
		try {
			showExce();//抛出异常
			System.out.println("A");
		} catch (Exception e) {
			System.out.println("B");//B
		} finally {
			System.out.println("C");//C
		}
		System.out.println("D");//D
	}

	public static void showExce() throws Exception {
		throw new Exception();
	}
}
//BCD
class Demo {
	public static void func() {
		try {
			throw new Exception();
			System.out.println("A");//这一句执行不到(因为执行不到)
		} catch (Exception e) {
			System.out.println("B");//B
		}
	}

	public static void main(String[] args) {
		try {
			func();
		} catch (Exception e) {
			System.out.println("C");
		}
		System.out.println("D");
	}
}

【答案】

//编译失败。 因为打印“A”的输出语句执行不到。
throw单独存在,下面不要定义语句,因为执行不到
class Exc0 extends Exception {
}

class Exc1 extends Exc0 {
}

class Demo {
	public static void main(String[] args) {
		try {
			throw new Exc1();
		} catch (Exception e) {
			System.out.println("Exception");
		} catch (Exc0 e) {
			System.out.println("Exc0");
		}
	}
}
//编译不通过,父类要放在下面
class Test {
	public static String output = "";

	public static void foo(int i) {
		try {
			if (i == 1)
				throw new Exception();
			output += "1";
		} catch (Exception e) {
			output += "2";
			// return;
		} finally {
			output += "3";
		}
		output += "4";
	}

	public static void main(String args[]) {
		foo(0);
		System.out.println(output);//
		foo(1);
		System.out.println(output);//
	}
}
//134
  //134234
  加入return,finallyreturn之前执行,但是后面代码output += "4";return之后,不会执行
请仔细阅,请读下列测试代码问如何处理才能使程序正常输出“这是个异常,不是错误”,并且不会报告任何错误或者异常信息?
	public class Test{
	public static void main(String[] args) {
		int[] arr ={1,1,1,1};
		for(int i = 0 ; i < 5;i++){
			System.out.println(arr[i]);
			//这里写一个if,或者自定义一个异常,捕获时输出为""
		}
		System.out.println("这是个异常,不是错误");
	 }
	}

请编写程序举例抛出一个空指针异常
Person per = null;
per.属性

请编写程序举例抛出一个类型转换异常
public static void main(String[] args) {
Object o = new Date();
test8 test8 = new test8();
try {
test8 = (test8)o;
} catch (Exception e) {
e.printStackTrace();
} }

请编写程序举例抛出一个数组索引越界异常
数组循环时超过它的长度
请编写程序举例抛出一个索引越界异常
对象数组循环时超过他的长度
请编写程序举例抛出一个字符串索引越界异常

请编写程序举例说明,在数组索引越界异常中,如果只适用try finally,捕获到的异常不会被处理,程序仍然中断。

结论:
  1、不管有木有出现异常,finally块中代码都会执行;
  2、当try和catch中有return时,finally仍然会执行;
  3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,不管finally中的代码怎么样, 返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
  4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
5、如果finally 函数里面有return; 那么函数最终会返回finally 里面执行之后的return的值给函数,如果没有return,函数值会是try里面return的值,或者catch里面的

public static void main(String[] args) {
int test = test(3,5);
System.out.println(test);
}

public static int test(int x, int y){
int result = x;
try{
if(x<0 || y<0){
return 0;
}
result = x + y;//return中的返回值会被记住,然后再执行finally中的语句,如果finally中有return返回finally中return的值,没有的话不管finally会执行什么语句,return的值早已经确定了
return result;
}finally{
result = x - y;
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值