文章目录
1.简述Java Error类与Exception类的区别。
Error类和Exception类都继承自Throwable类,它们时平行类。二者的不同之处:
Exception是所有异常类的祖先,而Error类是所有错误类的祖先。错误和异常的区别是:Error不是程序需要捕获和进行处理的,例如OutOfMemoryError(当Java虚拟机在为对象分配内存空间时,剩余的空间不够,同时也没有可以释放的内容时,将会发生这样的错误)不由程序进行捕获或处理,当Error发生时,程序将会停止。
而Exception可以是可被控制(checked) 或不可控制的(unchecked)。表示一个由程序员导致的错误。应该在应用程序级被处理。在Exception分支中有一个重要的子类RuntimeException(运行时异常),该类型的异常自动为你所编写的程序定义ArrayIndexOutOfBoundsException(数组下标越界)、NullPointerException(空指针异常)、ArithmeticException(算术异常)、MissingResourceException(丢失资源)、ClassNotFoundException(找不到类)等异常,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生;而RuntimeException之外的异常我们统称为非运行时异常,类型上属于Exception类及其子类,从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。
2.简述异常处理的两种方式,并举例说明区别。
异常的两种处理方式:声明抛出处理,程序捕获处理。声明抛出处理又可分为显式声明抛出和隐式声明抛出。程序捕获处理可分为非嵌套捕获和嵌套捕获。
1.隐式声明抛出的特点是:异常类型是RuntimeExpection或是其子类,程序方法可以对异常不作任何声明抛出或处理,直接交给调用该方法的地方处理,程序能编译通过,不会对可能产生异常的代码行给出提示。
例如:
public class ExampleException
{ public static void main(String[] args)
{ int a,b,c;
a=67; b=0;
c=a/b;
System.out.println(a+"/"+b+"="+c);
}
}
运行结果为:
在上例中当除数为0异常发生时,main()方法没有进行任何声明与处理,而直接交给调用main()方法的Java虚拟机去处理。
2.显式声明抛出
例7.5:
import java.io.*;
class TestScreenIn{
public static void main(String[] args) {
BufferedReader keyin = new BufferedReader(new
InputStreamReader(System.in));
String c1;
int i=0;
String[] e = new String[10];
while(i<10){
c1 = keyin.readLine();
e[i] = c1;
i++;
}
}
}
如果让程序编译通过只需要将方法进行如下改动就实现了显式声明抛出:
public static void main(String args[])修改为
public static void main(String args[]) throws IOExpection
其含义是:如果main中readline()方法发生异常,main不负责异常处理,由调用main方法的地方去处理异常,而调用main方法的是Java虚拟机,因此由Java虚拟机默认处理。
3.捕获处理:例7.5程序按如下方法修改就是捕获处理
import java.io.*;
class TestScreenIn{
public static void main(String[] args) {
try{
BufferedReader keyin = new BufferedReader(new
InputStreamReader(System.in));
String c1;
int i=0;
String[] e = new String[10];
while(i<10){
c1 = keyin.readLine();
e[i] = c1;
i++;
}
}
catch(IOException e){
//e.printStackTrace();
System.out.println("系统IO有错误");
}
}
}
捕获处理是由try-catch-finally组成的一个异常处理块构成,其格式为:
try{
statements
}
catch (ExceptionType1 ExceptionObject){
Exception Handling
}
catch(ExceptionType2 ExceptionObject) {
Exception Handling
}……
finally{
Finally Handling
}
3.选取RuntimeException类的五个子类,编写抛出并捕获上述子类异常的程序。(例如算术异常,空指针异常,类转换异常,数组越界异常等)
1.算数异常:
public class NestingException{
public static void main(String[] args)
{int a,b,c;
a=67; b=0;
c=a/b;
System.out.println(a+"/"+b+"="+c);
}
}
2.空指针异常
public class TestArray {
private static int[] x;
public static void main(String[] args) {
System.out.println(x[0]);
}
}
3.类变换异常
public class SuperClass {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class SubClass extends SuperClass {
private String performance;
public String getPerformance() {
return performance;
}
public void setPerformance(String performance) {
this.performance = performance;
}
public static void main(String[] args) {
SuperClass superClass = new SuperClass();
SubClass subClass = (SubClass) superClass;
subClass.setName("abc");
System.out.println(subClass.getName());
}
}
4.数组越界异常
public class TestArgs {
public static void main( String[] args) {
String foo = args[1];
System.out.println("foo = " + foo);
}
}
5.空栈异常
import java.util.*;
class TestEmptyStack {
public static void main(String[] args){
Stack st = new Stack();
Object ob = st.pop();
}
}
4.仿照例7.9,自定义一个异常类,并在某场景下抛出该异常对象。
import java.util.Scanner;
public class SelfGenerateException extends Exception
{
SelfGenerateException(String msg){
super(msg); //调用Exception的构造方法
}
static void throwOne() throws SelfGenerateException
{
System.out.println("你今天学习了吗?");
boolean flag;
Scanner sc = new Scanner(System.in);
flag = sc.nextBoolean();
if (flag==false) //如果flag为false就认为在特定应用下存在异常,改变执行路径,抛出异常
{throw new SelfGenerateException("你一天天干嘛去了,又不学习?!!!");}
}
public static void main(String args[])
{
try
{throwOne();}
catch(SelfGenerateException e)
{e.printStackTrace();}
}
}