Java面向对象编程除了上一篇文章的编程框架以外,还有一些东西需要补充一下。
Java中的异常机制——Exception初步
在一个已编译的程序运行时,因为一些非正常现象(如除数为0、数组越界等)导致程序异常终止,此时我们就需要捕获并处理此异常,确保程序正常执行。
一、简单异常的体现
public class textEx {
public static void main(String[] args) {
System.out.println(1/0);
}
}
系统抛出一个异常
二、异常的抛出
到这里就有疑问了,有没有一种机制既可以让程序顺利执行完毕,又能抛出这个异常呢?——有try-chtch-finally
我们可以在try块中放入可能会出现异常的代码,如果出现异常,则捕获异常并交给JRE中,JRE得到异常之后寻找相应的代码来处理该异常。JRE在方法的调用栈中查找,从生成异常的方法开始回溯,直到找到相应的异常处理代码为止。
随后就是finally,无论有没有发生异常现象,程序都会走到finally语句。
如图所示
程序演示
public class textEx {
public static void main(String[] args) {
try {
System.out.println(1/0);
} catch (Exception e) {
e.printStackTrace();
}finally {
System.out.println("异常捕获结束");
}
System.out.println("运行结束");
}
}
这里我们可以看到最后一行的运行结束被成功打印,说明程序没有终止,任务达成。
三、手动抛出异常
在实际开发过程中,有些时候我们想让程序抛出一个我们想要的异常形式,在Java中支持自定义异常格式——即手动抛出异常。
这里对上面的程序简单修改即可完成一个简单的手动抛出异常
public class textEx {
public static void main(String[] args) {
try {
System.out.println(1/0);
} catch (Exception e) {
System.err.println("异常除数出现0!");
}
System.out.println("运行结束");
}
}
四、异常抛出原则
- 在Java中有时候我们会遇到一些异常,但捕获之后并不想立即将其抛出,此时我们就可以利用这样一种机制——抛给上一级。
- 实际上,异常也是一个类,Error与Exception都继承自Throwable类,抛出多个异常时要子类异常在前,父类异常在后,当然有时为了避免出错,会只是用一个父类完事了。
- 我们可以在编写一个方法时,可以用throws关键字声明一个异常类,供给异常的上抛。
常见的异常类:
--ArithmeticException
--NullPointerException
--ClassCastException
--ArrayIndexOutOfBoundsException
--NumberFormatException
Java OOP中的一些其他操作
一、 instanceof 运算符
当一个程序中声明了多个类,而且多次继承,new了好多个多个对象时,就可以借助instanceof 运算符判断对象与类之间的关系。
程序演示
public class test_class {
public static void main(String[] args) {
Cat cat=new Cat();
System.out.println(cat instanceof Cat); //true
System.out.println(cat instanceof Dog); //false
//System.out.println(cat instanceof man); //会报错
}
}
class Cat{
}
class man{
}
class Dog extends Cat{
}
二、equals运算符
在Java中双等号 == 是用来比较两个对象是不是同一个,而equals才是用来比较对象里数据是否相等。
public class testEquals {
public static void main(String[] args) {
String s1 = new String("yang");
String s2 = new String("yang");
System.out.println(s1==s2); //false, 两个字符串不是同一个对象
System.out.println(s1.equals(s2)); //true, 两个字符串内容相同
}
}
三、对象转型
对象可以自动向上转型,即子类对象可以自动向父类对象转型,而父类对象也可以通过修饰想子类转型,我们称之为向下转型。
public class testCasting {
public static void main(String[] args) {
//向下自动转型
Object objs=new String();
//向下转型
String str=(String)objs;
System.out.println(objs==str); //true,是同一个对象
}
}
到这里,Java面向对象编程的初步操作就记录完成了,抽象类和方法在这里暂且不记录吧。