Java动手动脑07

(1)现在有三个类:

class Mammal{}

class Dog extends Mammal {}

class Cat extends Mammal{}

针对每个类定义三个变量并进行初始化

Mammal m=null ;

Dog d=new Dog();

Cat c=new Cat();

下列语句哪一个将引起编译错误?为什么?哪一个会引起运行时错误?为什么?

m=d;

d=m;

d=(Dog)m;

d=c;

c=(Cat)m;

编译错误

d=m;d=c;

不正确 子类对象可以直接赋给基类变量。基类对象要赋给子类对象变量,必须执行类型转换,
其语法是:子类对象变量=(子类名)基类对象名;

 

运行错误c=(Cat)m不正确  转换混乱。如果类型转换失败Java会抛出以下这种异常:ClassCastException

(2)

1.   下边的程序运行结果是什么?

2.   你如何解释会得到这样的输出?

3.   计算机是不会出错的,之所以得到这样的运行结果也是有原因的,那么从这些运行结果中,你能总结出Java的哪些语法特性?

public class ParentChildTest {

public static void main(String[] args) {

Parent parent=new Parent();

parent.printValue();

Child child=new Child();

child.printValue();

parent=child;

parent.printValue();

parent.myValue++;

parent.printValue();

((Child)parent).myValue++;

parent.printValue();

}

}

class Parent{

public int myValue=100;

public void printValue() {

System.out.println("Parent.printValue(),myValue="+myValue);

}

}

class Child extends Parent{

public int myValue=200;

public void printValue() {

System.out.println("Child.printValue(),myValue="+myValue);

}

}

运行结果:

原因分析:

当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。
如果子类被当作父类使用,则通过子类访问的字段是父类的!

(3)

动手动脑:请阅读并运行AboutException.java示例,然后通过后面的几页PPT了解Java中实现异常处理的基础知识

(4)

阅读以下代码(CatchWho.java),写出程序运行结果

写出CatchWho2.java程序运行的结果:

当有多个嵌套的trycatchfinally时,要特别注意finally的执行时机。

请先阅读 EmbedFinally.java示例,再运行它,观察其输出并进行总结

总结:当有多层嵌套的finally时,异常在不同的层次抛出 ,在不同的位置抛出,可能会导致不同的finally语句块执行顺序。

(5)

辨析:finally语句块一定会执行吗?

请通过 SystemExitAndFinally.java示例程序回答上述问题

所以finally块中的代码一定会执行

(6)

当程序中出现异常时,JVM会依据方法调用顺序依次查找有关的错误处理程序。

可使用printStackTrace 和 getMessage方法了解异常发生的情况:

printStackTrace:打印方法调用堆栈。

每个Throwable类的对象都有一个getMessage方法,它返回一个字串,这个字串是在Exception构造函数中传入的,通常让这一字串包含特定异常的相关信息。

请通过 PrintExpressionStack.java示例掌握上述内容

(7)

一个方法可以声明抛出多个异常

int g(float h) throws OneException,TwoException

…… }

ThrowMultiExceptionsDemo.java示例展示了相关特性

(8)

一个子类的throws子句抛出的异常,不能是其基类同名方法抛出的异常对象的父类。

OverrideThrows.java示例展示了Java的这个语法特性

(9)

在实际开发中,经常需要将特定的“过于专业”的异常转换为一个“业务”异常,然后在调用者处进行捕获与处理。

ExceptionLinkInRealWorld.java示例展示了典型的异常处理代码模板

(10)

编写一个程序,此程序在运行时要求用户输入一个 整数,代表某门课的考试成绩,程序接着给出“不及格”、“及格”、“中”、“良”、“优”的结论。

要求程序必须具备足够的健壮性,不管用户输入什 么样的内容,都不会崩溃。

源代码:

import javax.swing.*;

public class Chengji {

public static void main(String[] args){

int a=0;

try{

String str=JOptionPane.showInputDialog("请输入成绩");

a=Integer.parseInt(str);

if(0<=a&&a<60)

{

JOptionPane.showMessageDialog(null,"不及格","Result",

JOptionPane.PLAIN_MESSAGE);

}

else if(60<=a&&a<70)

{

JOptionPane.showMessageDialog(null,"及格","Result",

JOptionPane.PLAIN_MESSAGE);

}

else if(70<=a&&a<80)

{

JOptionPane.showMessageDialog(null,"中","Result",

JOptionPane.PLAIN_MESSAGE);

}

else if(80<=a&&a<90)

{

JOptionPane.showMessageDialog(null,"良","Result",

JOptionPane.PLAIN_MESSAGE);

}

else if(90<=a&&a<100)

{

JOptionPane.showMessageDialog(null,"优","Result",

JOptionPane.PLAIN_MESSAGE);

}

else 

{

JOptionPane.showMessageDialog(null,"输入超出范围","Result",

JOptionPane.PLAIN_MESSAGE);

}

}

catch(Exception e){

JOptionPane.showMessageDialog(null, "输入错误","Result",

JOptionPane.PLAIN_MESSAGE);

}

}

}

运行结果截图:

原文地址:https://www.cnblogs.com/sz20142898/p/4967025.html