异常:编译时没有错误,运行时出现各种错误。
Error和Exception的区别:
Error:指的是JVM错误,这个时候程序并没有执行,无法处理。
Exception:指的是程序中出现的错误信息,可以进行异常处理。
异常处理流程:
(1) 如果程序中产生了异常,那么会自动地由JVM根据异常的类型实例化一个指定异常类的对象
(2) 如果程序中没有任何异常处理操作,则这个异常的实例化对象将交给JVM进行处理,而JVM的默认处理方式就是进行异常信息的输出,而后中断程序的执行。
(3) 如果程序中存在异常处理,会由try语句捕获产生的异常类对象
(4) 与try之后的每一个catch进行匹配,如果匹配成功,则使用指定的catch进行处理,如果没有匹配成功,则向后面的catch继续匹配,如果没有任何catch匹配成功,将交给JVM执行默认处理
(5)不管是否有异常都会执行finally程序,如果此时没有异常,执行完finally会继续执行程序中的其他代码,如果此时有异常但没有一个catch匹配成功,那么也会执行finally,但是执行完finally后,将默认交给JVM进行异常信息输出,并且程序中断
所有异常都是Exception的子类,那么所有异常都可以用Exception来接收
例:
public class test {
public static void main(String args[]){
System.out.println("1、除法计算开始");
try{
int x=Integer.parseInt(args[0]);
int y=Integer.parseInt(args[1]);
int result=x/y;
System.out.println("2、除法计算结果:"+ result);
}catch(Exception e){
e.printStackTrace();
}finally{
System.out.println("不管是否出现异常都执行");
}
System.out.println("3.除法计算结束");
}
}
throws关键字与throw关键字
throws是用来声明一个方法可能抛出的所有异常信息
throw则是指抛出的一个具体的异常类型。
通常在一个方法(类)的声明处通过throws声明方法(类)可能抛出的异常信息,而在方法(类)内部通过throw声明一个具体的异常信息。
throws通常不用显示的捕获异常,可由系统自动将所有捕获的异常信息抛给上级方法;
throw则需要用户自己捕获相关的异常,而后在对其进行相关包装,最后在将包装后的异常信息抛出。
异常处理的标准格式
try…catch、finally、throws、throw
例:
class MyMath{
public int div(int x,int y)throws Exception{ //出现异常要交给被调用处处理
System.out.println("===计算开始===");
int result=0;
try{
result=x/y; //除法计算
return result;
}catch(Exception e){
throw e; //向上抛
}finally{
System.out.println("===计算结束===");
}
//return result;
}
}
public class test {
public static void main(String args[]){
try{
System.out.println(new MyMath().div(10,0)); //被调用处处理异常
}catch(Exception e){
e.printStackTrace();
}
}
}
问题:try语句中有一个return语句,那么紧跟在try后面的finally语句会不会被执行??什么时候执行,在return前还是后?
finally语句一定会执行,且在return前执行
异常最大的父类是Throwable,它分为两个子类:Exception和Error。Exception表示程序处理的异常,而Error表示JVM错误,一般不由程序开发人员处理。
包
使用package关键字来定义包,如:package cn.mldn.demo;
一旦包定义完成后,类名称就是:包.类
包的导入
不同包之间一定会存在包的导入问题,导入包在程序中用import完成。
Ø 一个包中的类若想要被其他包中的类使用,那这个类一定要定义为publicclass
Ø class声明的类只能在同一个包中使用
Ø 在一个*.java文件中,只能存在一个public class定义,且文件名和类名称保持一致
Ø 在一个*.java文件中,可以有多个class定义,文件名称可以和类名称不一致
[1] Import 包.类;
[2] Import 包.*;
在java中使用“*”导入类或者是单独导入,从实际的操作性能上来讲是没有任何区别的,因为即使是使用了“*”也表示只导入所需要的类,不需要的不导入。
在导入包时会导入不同包的同名类,所以在实例化对象时一定要使用完整的类名称(包.类)
例:
package cn.mldn.util;
public class Message {
public String getInfo(){
return "hello world!";
}
}
package cn.mldn.test;
import cn.mldn.util.*;
public class Test {
public static void main(String args[]){
Message msg=new Message();
System.out.println(msg.getInfo());
}
}
Java的常用包
Applet和Applacation的区别:
Applet是不需要主方法运行的
Applacation是需要通过主方法执行的
现在所写的代码都应该是Application程序
四种访问权限
² Private只能在同一包的同一类中访问
² Default只能在同一个包中访问
² Protected在不同的子类中可以访问(extends)
² Public所以都可以