8.简述Java的异常处理机制。
答:java中声明了很多异常类,每个异常类都代表了一种运行错误,类中包含了该运行错误的信息和处理错误的方法等内容。每当java程序运行过程中发生一个可识别的运行错误时,即该错误有一个异常类与之相对应时,系统都会产生一个相应的该异常类的对象,即产生一个异常。一旦一个异常对象产生了,系统中就一定有相应的机制来处理它,确保不会产生死机、死循环或其他对操作系统的损害,从而保证了整个程序运行的安全性。
9.系统定义的异常与用户自定义的异常有何不同?如何使用这两类异常?
答:系统定义的特定情况出现的问题,而此时用来对可能遇到的问题进行处理。用户定义的是自己觉得可能会出现问题时,需要处理的。这样避免程序中断或是出现未知错误。
系统异常有两种一种是运行时异常,一种是普通异常,普通异常要求用户捕获或者抛出的,不补货或者抛出就会编译不通过。运行时异常编译可以通过,但是运行时才显露出来。
10.用户如何自定义异常?编程实现一个用户自定义异常。 (1)定义mytest import java.io.*; public class mytest{
private static int quotient(int number,int denominator)throws DivideByZeroException{ if(denominator==0)
throw new DivideByZeroException(); return(number/denominator); }
public static void main(String args[]){ int number1=0,number2=0, result=0; try{
System.out.println(\输入第一个数字:\
number1=Integer.valueOf(Keyboard.getString()).intValue();
System.out.println(\输入第二个数字:\
number2=Integer.valueOf(Keyboard.getString()).intValue(); result=quotient(number1,number2); }
catch(NumberFormatException e){ System.out.println(e.toString()); System.exit(-1); }
System.out.println(number1+\} }
(2)定义DivideByZeroException
public class DivideByZeroException extends ArithmeticException{ public DivideByZeroException(){ super(\除数不能为0!\} }
(3)定义Keyboard import java.io.*; public class Keyboard{
static BufferedReader inputStream=new BufferedReader(new InputStreamReader(System.in)); public static int getInteger(){ try{
return (Integer.valueOf(inputStream.readLine().trim()).intValue());
}catch(Exception e){ e.printStackTrace(); return 0; } }
public static String getString(){ try{
return(inputStream.readLine()); }catch(IOException e){return \ } }
第四章课后习题答案
1.子类将继承父类所有的属性和方法吗?为什么?
答:不,子类不能直接访问从父类中继承的私有属性及方法,但可以对公有及保护方法进行访问。
2.方法的覆盖与方法的重载有何不同?
答:覆盖是运用在子类中实现与父类相同的功能,但采用不同的算法或公式;在名字相同的方法中,要做比父类更多的事情;在子类中需要取消从父类继承的方法。
3.声明两个带有无参构造方法的两个类A和B,声明A的子类C,并且声明B为C的一个成员,不声明C 的构造方法。编写测试代码,生成类C的实例对象,并观察结果。 //A类
public class A { public A () {
System.out.println (\输出A类\ } }
//B类
public class B { public B () {
System.out.println (\输出B类\ } }
//C类
public class C extends A { B b = new B (); }
//测试类
public class test4_3 {
public static void main (String args[]) { C c = new C(); } }
运行结果:
4.声明一个基类A,它只有一种非默认构造方法;声明A的子类B,B具有默认方法及非默认方法,并在B的构造方法中调用基类A的构造方法。 //A类
public class A {
public A (String lin) {
System.out.println(\类的非默认构造方法 \+lin); } }//B类
public class B extends A{ public B () {
super (\);
System.out.println (\默认类构造方法\); }
public B (String lin) { super (lin);
System.out.println (\类非构造方法\); } }//测试类
public class test4_4 {
public static void main (String args[]) { new B();
System.out.println (); new B(\); } }
运行结果:
5.声明一个类,它具有一种方法,此方法被重载三次,派生一个新类,并增加一种新的重载方法,编写测试类验证四种方法对于派生类验证四种方法对于派生类都有效。 //A类
public class A {
public void showTime () {
System.out.println (\空重载\ }
public void showTime (int l) {
System.out.println (\整形参数重载\ }
public void showTime (char l) {
System.out.println (\字符参数重载\ } }
//B类
public class B extends A {
public void showTime (String l) {
System.out.println (\字符串参数重载\ } }
//测试类
public class test4_5 {
public static void main (String args[]) { B b = new B(); b.showTime(); b.showTime(5); b.showTime('f');
b.showTime(\林楚金\); } }