InputMismatchException是Exception的子类。
System.exit(1); //结束程序运行
如果try语句块在执行过程中遇到异常,而抛出的异常在catch块里没有被声明,那么程序立刻退出。
在catch块中可以加入用户自定义处理信息,也可以调用异常对象的方法输出异常信息,常用的方法主要有以下两种。
void printStackTrace();输出异常的堆栈信息。堆栈信息包括程序运行到当前类的执行流程,它将输出从方法调用处到异常抛出处的方法调用序列,如图6.5所示。该例中java.util.Scanner类中的throwFor()方法是异常抛出处,而Test3类中的main()方法在最外层的方法调用处。
String getMessage():返回的异常信息描述字符串。该字符串描述异常产生的原因,是printStackTrace()输出信息的一部分。
表6-1 常见的异常类型:
异常 |
说明 |
Exception |
异常层次结构的根类 |
ArithmeticException |
算术错误情形,如以零做除数 |
ArrayIndexOutOfBoundsException |
数组下标越界 |
NullPointerException |
尝试访问null对象成员 |
ClassNotFoundException |
不能加载所需的类 |
InputMismatchException |
欲得到的数据与实际输入的类型不匹配 |
IllegalArgumentException |
方法接受到非法参数 |
ClassCastException |
对象强制类型转换出错 |
NumberFormatException |
数字格式转换异常,如把“abc”转换成数字 |
注意:即使在try块和catch块中存在return语句,finally块中语句也会被执行,发生异常时执行顺序:执行try块或catch中return之前的语句,执行finally块中的语句,执行try块或catch块中的return语句退出。
Finally块中语句不被执行的唯一情况:在异常处理代码中执行System.exit(1),将退出Java虚拟机。
在使用多重catch块时,catch块的排列顺序必须是从子类到父类,最后一个一般的都是Exception类。
Java语言中通过关键字throws声明某个方法可能抛出的各种异常。Throws可以同时声明多个异常,之间用逗号隔开。
两种处理异常的方式:
- 通过try-catch捕获并处理异常。
- 通过throws继续声明异常。如果调用者不打算处理该异常,可以继续通过throws声明异常,让上一级调用者处理异常。main()方法声明的异常将由Java虚拟机来处理。
在Java语言中,可以使用throw关键字来自行抛出异常。
如:*****!!!!!
public void setSex(String sex) throws Exception{
if("男".equals(sex)||"女".equals(sex))
this.sex=sex;
else{
throw new Exception("性别必须是\"男\"或者\"女\"!"); //*****!!!!!
}
}
throw和throws的区别表现在以下3各方面:
- 作用不同:throw用于在程序中抛出异常;throws用于声明在该方法内抛出了异常。
- 使用位置不同:throw位于方法体内部,可以作为单独语句使用;throws必须跟在方法参数列表的后面,不能单独使用。
- 内容不同:throw抛出一个异常对象,而且只能是一个;throws后面跟异常类,而且可以跟多个异常类。
异常分类:
Throwable类:所有异常类型都是Throwable类的子类,Throwable是Object的子类,它派生两个子类,即Error和Exception。
Error类:表示仅靠程序本身无法恢复的严重错误,如内存溢出动态链接失败、虚拟机错误。应用程序不应该抛出这种类型的对象(一般是由虚拟机抛出)。假如出现这种错误,除了尽力使程序安全退出外,在其他方面是无能为力的。所以在进行程序设计时,应该更关注Exception类。
Exception类:由Java应用程序抛出和处理的非严重错误,如所需文件找不到、网络连接不通或中断、算术运算出错(如被零除)、数组下标越界、装载了一个不存在的类、对null对象操作、类型转换异常等。它的各种不同的子类分别对应不同类型的异常。
运行时异常:包括RuntimeException及其所有子类,不要求程序必须对他们作出处理。子类包括ArithmeticException,InputMismatchException,NullPointerException,NumberFormatException等,在程序中可以不使用try-catch或throws进行处理,仍旧可以进行编译和运行,如果运行时发生异常,会输出异常的堆栈信息并终止程序的运行。
Checked异常(非运行时异常):除了运行时异常外的其他由Exception继承来的异常类。程序必须捕获或者声明抛出这种异常,否则会出现编译错误,无法通过编译。处理方式包括两种:通过try-catch在当前位置捕获并处理异常;通过throws声明抛出异常,交给上一级调用方法处理。
在MyEclipse中使用log4j的步骤比较简单,主要分为以下4个步骤:
(1)在项目中加入log4j所使用的JAR文件。
(2)创建log4j.properties文件。
(3)编写log4j.properties文件,配置日志信息。
(4)在程序中使用log4j记录日志信息。
日志根据记录内容的不同,主要分成以下3类:
SQL日志:记录系统执行的SQL语句。
异常日志:记录系统运行中发生的异常事件。
业务日志:记录系统运行过程,如用户登录、操作记录。
注意:log4j.properties文件必须要放在src根目录中,而不是放在包中!!!
编写log4j.properties文件,配置日志信息:
### 设置Logger输出级别和输出目的地 ###
log4j.rootLogger=debug, stdout,logfile
### 把日志信息输出到控制台 ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout
### 把日志信息输出到文件:jbit.log ###
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=jbit.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss}%l %F %p %m%n
Logger对象是用来替代System.out或者System.err的日志记录器,供程序员输出日志信息,他提供了一些列方法来输出不同级别的日志信息。
Public void debug(Object msg)
Publci void debug(Object mes,Throwable t)
Public void info(Object msg)
Public void info(Object msg,Throwable t)
Public void warn(Object msg)
Public void warn(Object msg,Throwable t)
Public void error(Object msg)
Public void error(Object msg,Throwable t)
Public void fatal(Object msg)
Public void fatal(Object msg,Throwable t)
关于配置文件log4j.properties的详细说明:
1、输出级别
log4j.rootLogger=debug,stdout,logfile
其中,debug指的是日志记录器(Logger)的输出级别,主要输出级别及含义如下。
fatal:指出严重的错误事件将会导致应用程序的退出。
error:指出虽然发生错误事件,但仍然不影响系统的继续运行。
warn:表明会出现潜在错误的情形。
info:在粗粒度级别上指明消息,强调应用程序的运行过程。
debug:指出细粒度信息事件,对调试应用程序是非常有帮助的。
各个输出级别优先级:fatal>error>warn>info>debug
日志记录器(Logger)将只输出那些级别高于或等于它的信息。例如,级别为debug,将输出fatal、error、warn、info、debug级别的日志信息;而级别为error,将只输出fatal、error级别的日志信息。
2、日至输出目的地Appender
log4j.rootLogger=debug,stdout,logfile
其中,stdout、logfile指的是日志输出目的地的名字。
Log4j允许记录日志到多个输出目的地,一个输出目的地被称为一个Appender。Log4j中的Appender有以下几种。
ConsoleAppender:输出日志事件到控制台。通过Target属性配置输出到System.out或System.err,默认的目标是System.out。
FileAppender:输出日志事件到一个文件。通过File属性配置文件的路径及名称。
示例中有两个Appender,第一个命名为stdout,使用了ConsoleAppender,通过配置Target属性,把日志信息写到控制台System.err。第二个Appender命名为logfile,使用FileAppender,通过配置File属性,把日志信息写到指定的文件jbit.txt中。
3、日志布局类型Layout
Appender必须使用一个与之相关联的布局类型Layout,用来指定它的输出样式。Log4j中最常用的Layout有以下3种。
HTMLLayout:格式化日志输出为HTML表格。
SimpleLayout:以一种非常简单的方式格式化日志输出,他的输出级别Level,然后跟着一个破折号“——”,最后是日志消息。
PatternLayout:根据指定的转换模式格式化日志输出,从而支持丰富多样的输出格式。需要配置layout.ConversionPattern属性,若没有配置该属性,则使用默认的转换模式。
示例中的第一个Appender是stdout,使用了SimpleLayout;第二个Appender是logfile,使用了PatternLayout,需要配置layout.ConversionPattern属性来自定义输出格式。
4、转化模式ConversionPattern
对于PatternLayout,需要配置layout.ConversionPattern属性,常用的配置参数及含义如下。
%d:用来设置输出日志的日期和时间,默认格式为ISO8601。也可以在其后指定格式,比如%d{yyyy-MM-dd HH:mm:ss},输出格式类似于2010-03-09 17:51:08。
%m:用来输出代码中指定的消息。
%n:用来输出一个回车换行符。
%l:用来输出日志事件的发生位置,包括类名、发生的线程,以及在代码中的行数。例如,如果输出为cn.jbit.log.Test11.main(Test.java:21),说明日志事件发生在cn.jbit.log包下的Test11类的main线程中,在代码中的行数为第21行。
%p:用来输出优先级,即debug、info、warn、error、fatal等。
%F:用来输出文件名。
%M:用来输出方法名。