静态绑定,异常

来源:互联网 发布:字体预览软件 编辑:程序博客网 时间:2024/05/29 16:29
1.静态绑定
由static,final,private修饰的方法,再有继承、向上转型,并且用向上转型的对象调用被static,final,private修饰的重写的方法时,这个过程称为静态绑定。
static,final,private修饰的方法,java编译器在编译过程中,已经知道这些方法属于哪些类或对象。

示例1:

public class Person{
private void say(){
System.out.println("这是父类的say()方法");
}
public static void main(String[]args){
Person person=new Son();
person.say();
}
}
class Son extends Person{
public void say(){
System.out.println("这是子类的say方法");
}
}

示例2:

public class Something{
public static void main(String[]args){
Other o=new Other();
new Something().addOne(o);
}
public void addOne(final Other o){
//o=new Other();
o.i++;
}
}
class Other{
public int i;
}

示例3:

class  A{
int s=1;
int getS(){
return s;
}
}
class B extends A{
int s=0;
int getS(){
return s;
}
}
public class TestDynaic{
public static void main(String[]args){
A a=new A();
a.s=11;
B b=new B();
b.s=22;
a=b;
System.out.println(a.s);//1
System.out.println(b.s);//22
System.out.println(a.getS());//22
System.out.println(b.getS());//22
}
}

2.IDE之 MyEclipse
开发工具:就是为了提高开发的效率和质量,更加容易的去发布或者部署一个项目。
开发工具就是让我们学会如何使用一个软件。
掌握MyEclipse的安装和使用。
MyEclipse常用的快捷键:
alt+/ 可以自动补全
ctrl+d 删除一行
ctrl+/注释,再次点击取消注释

查看所有快捷键的方式  ctrl+shift+L

3.异常
概念:在程序运行时期,发生的不正常的事件
注意:
设计良好的程序应该在异常发生时提供处理这些不正常事件的方法,使程序不会因为异常的发生
而阻断或产生不可预见的结果。
Java语言使用异常处理机制为程序提供了异常处理的能力

4.异常的处理机制
Java程序在执行过程中如果出现异常,会自动生成一个异常类对象,该异常对象将被自动提交给JVM,这个过程称为抛出(throw)异常。
当JVM接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交给其处理,这一过程称为捕获(catch)异常和处理异常。
如果JVM找不到可以捕获异常的代码,则运行时系统将终止,相应的Java程序也将退出。

5.异常的分类
从严重性角度分为:
Error(错误):Error级别的异常一般指非常严重的事件,无法通过代码解决。例如:JVM内部报错、资源耗尽
Exception(异常):该级别的异常指的是一般性的事件,能够有机会通过代码处理,让程序恢复到正常的执行流程。
注意:程序员通常只能处理异常(Exception),而对错误(Error)无能为力。

6.Exception的分类
从编程的角度Excepiton划分两大类;
1.非受检异常:就是指在编译期间不要求强制处理的异常。
java.lang.RuntimeException类以及子类都属于非受检异常
例如:
错误的类型转换:java.lang.ClassCastException
数组下标越界:java.lang.ArrayIndexOutOfBoundsException
空指针访问:java.lang.NullPointerException
算术异常(除0溢出):java.lang.ArithmeticException
2.受检异常:就是指在编译期间强制要求处理的异常。
没有找到指定名称的类:java.lang.ClassNotFoundException 
访问不存在的文件:java.io.FileNotFoundException 
操作文件时发生的异常:java.io.IOException
操作数据库时发生的异常:java.sql.SQLException

7.try和catch
try语句:存放的是可能发生异常的代码,如果发生异常由catch进行处理
语法:
try{
}catch(异常类 异常对象){
异常对象.getMessage();该方法输出的是异常的简短信息
异常的堆栈信息通过:异常对象.printStackTrace();
}
注意:try和catch都不能单独出现,try,catch要结合使用。
try下面可以有多个catch,但是异常父类只能出现在最后一个catch语句中。
    如果没有异常产生,所有的catch段的代码都会被忽略不执行。

8.try和finally

finally中的代码表示任何情况都需要执行的代码,一般finally适合做资源清理的工作。
finally不能单独使用,也需要和try进行匹配使用。
如果try,catch,finally三者同时使用,finally一定要位于所有catch的下面。

9.throw和throws
throw能够主动产生一个异常,throw只能出现在方法体中,语法:
throw new 异常类("参数");
注意:单独使用throw没有任何的实际意义。
throws使用来把方法体中产生的异常,抛出来。谁调用,谁负责处理异常,否则继续抛出。
throws只能出现在方法签名的后面,语法:
[访问修饰符] 返回值类型 方法名称(参数列表)throws 异常类1,异常类2{

}

10.异常实践
1.观察抛出的异常的名字和行号很重要。
2.尽量减小try语句块的体积。
3.在处理异常时,应该打印出该异常的堆栈信息以方便调试。


本 章 练 习
1. 简答题

(1) Java语言如何进行异常处理?关键字throws、throw、try、catch、finally分别代表什么意义?在try块中可以抛出异常吗?
(2) 简单描述一下Java中的异常处理机制的原理和应用。
(3) try语句块里有一个return语句,那么紧跟在这个try语句块后的finally语句块里的代码会不会被执行?什么时候被执行?在return语句之前还是之后被执行?
(4) error和exception有什么区别?
(5) final、finally和finalize有什么用法上的区别?
2. 上机题
(1) 编写一个类ExceptionTest1,在main方法中使用try、catch、finally,要求:
① 在try块中,编写被零除的代码。
② 在catch块中,捕获被零除所产生的异常,并且打印异常信息。
③ 在finally块中,打印一条语句。
(2) 上机练习:写一个自定义异常,实现数组越界异常信息。
(3) 请在IDE中创建如下所示的TestEx类,运行之后观察输出结果是什么。

public class TestEx {
public static int test(int x) {
int i = 1;
try {
System.out.println("try块中10/x之前");
i = 10 / x;
System.out.println("try块中10/x之后");
return i;
} catch (Exception e) {
i = 100;
System.out.println("catch块中......");
} finally {
i = 1000;
System.out.println("finally块");
}
return i;
}
public static void main(String[] args) {
System.out.println(TestEx.test(1));
System.out.println(TestEx.test(0));
}
}
(4) 请在IDE中创建如下所示的TestEx类,运行之后观察输出结果是什么。
public class TestReturnException {
public static void main(String[] args) {
try {
System.out.println("testReturn 的返回值为: " + testReturn());
} catch (Exception e) {
e.printStackTrace();
}


}


public static int testReturn() throws RuntimeException {
int tmp = 0;
try {
System.out.println("try区域输出");
// 这里会导致出现一个运行态异常
int i = 4, j = 0;
tmp = i / j;
} catch (RuntimeException e) {
System.out.println("catch区域输出");
e.printStackTrace();
// 异常被重新抛出,上层函数可以进一步处理此异常
throw e;
} finally {
System.out.println("finally区域输出!");
// 注意,这里有一个 return 语句
return tmp;
}

}
}



0 0
原创粉丝点击