S2/JAVA/06-异常

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可以同时声明多个异常,之间用逗号隔开。

两种处理异常的方式:

      1. 通过try-catch捕获并处理异常。
      2. 通过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各方面:

      1. 作用不同:throw用于在程序中抛出异常;throws用于声明在该方法内抛出了异常。
      2. 使用位置不同:throw位于方法体内部,可以作为单独语句使用;throws必须跟在方法参数列表的后面,不能单独使用。
      3. 内容不同: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:用来输出方法名。

时间: 2024-07-29 00:14:51

S2/JAVA/06-异常的相关文章

java中异常类与类别

异常类的层次结构: 在 Java 中,所有的异常都有一个共同的祖先 Throwable(可抛出).Throwable 指定代码中可用异常传播机制通过 Java 应用程序传输的任何问题的共性,它们都在java.lang包下面. Error类标记了严重错误,类似内存溢出,虚拟机异常,等等,是不该出现的.这些错误表示故障发生于虚拟机自身.或者发生在虚拟机试图执行应用时,如Java虚拟机运行错误(Virtual MachineError).类定义错误(NoClassDefFoundError)等.这些错

Java基础—异常

一.  Exception异常 1. 概述 异常是程序在运行时出现的错误 异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述.并封装成对象. 其实就是java对不正常情况进行描述后的对象体现. 2. Java的异常体系 1. 从图中可以看出Throwable下有两个子类,Error和Exception 对于严重的问题,java通过Error类进行描述.对Error类一般不编写针对性的代码对其进行处理. 对于非严重的,java通过Exception类进行描述.对于Ex

Java基础——异常体系

在Java中,异常对象都是派生于Throwable类的一个实例,Java的异常体系如下图所示: 所有的异常都是由Throwable继承而来,在下一层立即分解为两个分支,Error和Exception. Error错误:描述了Java运行时系统的内部错误和资源耗尽错误.一般是指虚拟机相关的问题,如系统崩溃,虚拟机出错误等,这种错误无法恢复或不可能捕获,将导致应用程序中断,通常不处理.因为如果出现这样的内部错误,除了通告用户,并尽力使程序安全地终止之外,再也无能为力了. Exception异常:Ja

Java Exception异常介绍

 一:介绍java异常 异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的众多子类描述各种不同的异常.因而,Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的 错误条件.当条件生成时,错误将引发异常. 在 Java 中,所有的异常都有一个共同的祖先 Throwable(可抛出).Throwable 指定代码中可用异常传播机制通过 Java 应用程序

Java socket异常

Java socket异常 分类: Java 2013-07-15 22:38 981人阅读 评论(0) 收藏 举报 目录(?)[+] 使用Java socket编写程序时,通常会遇到几种种异常:BindException.UnknownHostException.ConnectException.SocketTimeoutException. BindException 会发生在Socket或ServerSocket的bind()操作中,如果无法与本机指定的IP地址或端口绑定,就会抛出此异常.

Java基础——异常(2)

throws 和 throw 有什么区别? 1.位置不同:throws用在函数上,后面跟的是异常类,可以跟很多个. throw用在函数内,后面跟的是异常对象. 2.功能不同:throws用来声明异常,让调用者知道功能有可能出现问题,并由调用者可以给出预先的处理方式. throw抛出具体问题对象.执行到throw功能已经结束了,跳转到调用者(谁调用跳哪去),并将具体的问题对象抛给了调用者. 异常体系最大的特点就是体系中的类以及类产生的对象,都具备可抛性.可抛性的意思就是可以被throws和thro

Java并发编程:Java ConcurrentModificationException异常原因和解决方法

Java ConcurrentModificationException异常原因和解决方法 在前面一篇文章中提到,对Vector.ArrayList在迭代的时候如果同时对其进行修改就会抛出java.util.ConcurrentModificationException异常.下面我们就来讨论以下这个异常出现的原因以及解决办法. 以下是本文目录大纲: 一.ConcurrentModificationException异常出现的原因 二.在单线程环境下的解决办法 三.在多线程环境下的解决方法 若有不

《java中异常和错误》

异常和错误的区别. 异常: 在Java中程序的错误主要是语法错误和语义错误,一个程序在编译和运行时出现的错误我们统一称之为异常,它是VM(虚拟机)通知你的一种方式,通过这种方式,VM让你知道,你(开发人员)已经犯了个错误,现在有一个机会来修改它.Java中使用异常类来表示异常,不同的异常类代表了不同的异常.但是在Java中所有的异常都有一个基类,叫做Exception. 错误:它指的是一个合理的应用程序不能截获的严重的问题.大多数都是反常的情况.错误是VM的一个故障(虽然它可以是任何系统级的服务

关于java中异常机制

什么是异常:异常就是程序在运行时出现的不正常情况.对于严重的情况Java通过Error类进行描述,一般不用编写代码处理:对于不严重的情况Java通过Exception描述,一般编写针对性代码对其进行处理. 异常由来:问题也是生活中一个具体的事物,也可以通过Java类的形式进行描述(比如进行运算时被除数不可以为0否则出现ArithmeticException异常,数组越界会出现ArrayIndexOutOfBoundsException等等),并封装成对象.即Java对不正常情况进行描述后的对象体

java中异常介绍

一.异常概述 异常处理已经成为衡量一门语言是否成熟的标准之一,目前的主流编程语言如C++.C#.Ruby.Python等,大都提供了异常处理机制.增加了异常处理机制后的程序有更好的容错性,更加健壮. 二.传统错误处理的缺陷 –无法穷举所有异常情况:因为人类知识的限制,异常情况总比可以考虑到的情况多,总有“漏网之鱼”的异常情况,所以程序总是不够健壮. –错误处理代码和业务实现代码混杂:这种错误处理和业务实现混杂的代码严重影响程序的可读性,会增加程序维护的难度. 三.java的异常体系 四.异常信息