Java第六次作业

1. Throwable的子类包含哪两类?简述Java Error类与Exception类的区别。    

Error和Exception。

 Error(错误):是程序无法处理的错误,表示运行应用程序中较严重问题

    Exception(异常):是程序本身可以处理的异常。

2. Exception又分为checked异常和unchecked异常,请分别举例说明。    

将派生于Error或者RuntimeException的异常称为unchecked异常,所有其他的异常成为checked异常

3. 请查阅资料,简述StackOverflowError和OutOfMemoryError两类错误的发生情形和原因。  

StackOverflow
原因:
线程调用生成的栈桢深度超过了虚拟机允许的深度

情形:

1、递归可能造成StackOverflowError
2、不断创建线程可能造成StackOverflowError

OutOfMemoryError
原因:内存不够,发生了内存溢出

情形:

1、栈的深度(大小类似于弹夹深度)可以自动扩展,扩展时无法申请到足够的内存

2、如果在堆中没有内存完成实例分配,并且堆也无法再扩展时

3、当方法区无法满足内存分配需求时

4、当常量池(方法区的一部分)无法再申请到内存

5、各个内存区域的总和大于物理内存限制(包括物理上的和操作系统级的限制),从而导致动态扩展 

4. 简述异常处理的两种方式,并举例说明区别。    

● 声明抛出处理:
声明抛出处理——隐式抛出:异常类型是RuntimeException或是其子类,程序方法可以对异常不作任何声明抛出或处理,直接交给调用该方法的地方处理,程序能编译通过,不会对可能产生异常的代码给出提示。

package homework.second;
import java.util.*;

public class TestEmptyStack {
	public static void main(String[] args) {
		Stack st=new Stack();
		Object ob=st.pop();
	}
}

显示声明抛出:异常类型不是RuntimeException类或其子类时可以用显示声明抛出。

● 程序捕获处理:
将显示声明抛出改写成try-catch的形式就是捕获处理。

6. 根据某业务场景自定义一个异常类,并在某场景下抛出该异常对象。    

自定义异常类的一般步骤:

1)自定义异常类要继承于Exception类或其子类,或其它异常类。
2)为自定义异常类声明字段(属性)成员、方法成员或重写父类的字段和方法。
3)自定义异常类至少要定义两个构造方法:一个是无参的;另外一个是带 String参数的,目的是将 此字符串传递给父构造方法,同时这个String的 信息作为该异常对象的描述信息。
4)起一个能标识异常情况的有意义的名字。


7. 异常中的throws声明与throw语句的区别是什么?请举例说明。    

throw:

表示方法内抛出某种异常对象
如果异常对象是非 RuntimeException 则需要在方法申明时加上该异常的抛出 即需要加上 throws 语句 或者 在方法体内 try catch 处理该异常,否则编译报错
执行到 throw 语句则后面的语句块不再执行
throws:

方法的定义上使用 throws 表示这个方法可能抛出某种异常
需要由方法的调用者进行异常处理

package constxiong.interview;
 
import java.io.IOException;
 
public class TestThrowsThrow {
 
	public static void main(String[] args) {
		testThrows();
		
		Integer i = null;
		testThrow(i);
		
		String filePath = null;
		try {
			testThrow(filePath);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 测试 throws 关键字
	 * @throws NullPointerException
	 */
	public static void testThrows() throws NullPointerException {
		Integer i = null;
		System.out.println(i + 1);
	}
	
	/**
	 * 测试 throw 关键字抛出 运行时异常
	 * @param i
	 */
	public static void testThrow(Integer i) {
		if (i == null) {
			throw new NullPointerException();//运行时异常不需要在方法上申明
		}
	}
	
	/**
	 * 测试 throw 关键字抛出 非运行时异常,需要方法体需要加 throws 异常抛出申明
	 * @param i
	 */
	public static void testThrow(String filePath) throws IOException {
		if (filePath == null) {
			throw new IOException();//运行时异常不需要在方法上申明
		}
	}
}

8. finally子句的作用是什么?

try{}
catch(Exception e){
}finally{}

finally里一般拿来做一些善后清理工作
try块里出现错误的话,会立即跳出try块,找到匹配的错误,执行catch块里的语句
此时,可能在try块里打开的文件没关闭,连接的网络没断开,对这些浪费的内存就不能及时释放回收。
如果有finally块的话,不管有没有出错,都会执行finally块里的内容。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值