JAVA自学教程之(java程序的异常处理 (二))。
异常处理的捕捉形式:
这是可以对异常进行针对性处理的方式
六、try、catch的理解
具体格式:
- try
- {
- //需要被检测异常的代码
- }
- catch(异常类 变量)//改变量用于接受发生异常的对象
- {
- //处理异常的代码
- }
- finally
- {
- //一定会被执行的代码
- }
try
{
//需要被检测异常的代码
}
catch(异常类 变量)//改变量用于接受发生异常的对象
{
//处理异常的代码
}
finally
{
//一定会被执行的代码
}
这三个代码块是一个整体。
try是尝试,catch捕捉,finally最终化
什么时候用try&catch,什么时候用抛?
在定义功能时,如果这个问题你可以处理的了,那么就用try&&catch,处理不了那么就用抛
代码演示:
- import java.util.*;
- class FuException extends Exception
- {
- FuException()
- {
- }
- FuException(String s)
- {
- super(s);//Exception有
- //System.out.println(s);
- }
- }
- class ExceptionDemo
- {//要么捕捉,要么抛出
- public int method(int[] arr,int index) throws FuException
- {
- if(index<0)
- {
- throw new FuException(“The index is fushu”);
- }
- return arr[index];
- }
- }
- public class Main
- {
- public static void main(String[] args)//throws FuException
- {
- int[] a = new int[10];
- ExceptionDemo C = new ExceptionDemo();
- try
- {
- int num = C.method(a,-2);
- System.out.print(“num”+num);
- }
- catch (FuException e)
- {
- System.out.println(“角标为负数啦!”);
- //e对象可用可不用,下面是一些常用的方法
- System.out.println(“Message:”+e.getMessage());
- System.out.println(“string:”+e.toString());//toString可省略
- //打印异常信息
- e.printStackTrace();//jvm默认的异常处理机制就是调用异常对象的这个方法
- }
- }
- }
import java.util.*;
class FuException extends Exception
{
FuException()
{
}
FuException(String s)
{
super(s);//Exception有
//System.out.println(s);
}
}
class ExceptionDemo
{//要么捕捉,要么抛出
public int method(int[] arr,int index) throws FuException
{
if(index<0)
{
throw new FuException("The index is fushu");
}
return arr[index];
}
}
public class Main
{
public static void main(String[] args)//throws FuException
{
int[] a = new int[10];
ExceptionDemo C = new ExceptionDemo();
try
{
int num = C.method(a,-2);
System.out.print("num"+num);
}
catch (FuException e)
{
System.out.println("角标为负数啦!");
//e对象可用可不用,下面是一些常用的方法
System.out.println("Message:"+e.getMessage());
System.out.println("string:"+e.toString());//toString可省略
//打印异常信息
e.printStackTrace();//jvm默认的异常处理机制就是调用异常对象的这个方法
}
}
}
/*真正建立日志文件
*log four(java; ; )
*{
*
*}
*/其简写形式:log4j
七、多catch情况
如果在程序处理时,抛出了多个异常
- import java.util.*;
- class FuException extends Exception
- {
- FuException()
- {
- }
- FuException(String s)
- {
- super(s);//Exception有
- //System.out.println(s);
- }
- }
- class ExceptionDemo
- {
- public int method(int[] arr,int index) throws FuException,NullPointerException
- {
- if(index<0)
- {
- throw new FuException(“The index is fushu”);
- }
- if (arr==null)
- {
- throw new NullPointerException(“没有数组实体”);//可自定义
- }
- return arr[index];
- }
- }
- public class Main
- {
- public static void main(String[] args)//throws FuException
- {
- int[] a = new int[10];
- ExceptionDemo C = new ExceptionDemo();
- try
- {
- int num = C.method(a,2);
- System.out.print(“num”+num);
- }
- catch (FuException e)
- {
- System.out.println(“角标为负数啦!”);
- }
- catch (NullPointerException e)
- {
- //e.printStackTrace();
- System.out.println(“Message:”+e.getMessage());
- }
- //多catch情况,如果有以下catch情况,不能房最上面,会接受所有对象
- catch (Exception e)
- {
- //父类的catch房最下面,否则编译失败
- //如果实在出现已有catch以外的情况,虚拟机会处理
- }
- }
- }
import java.util.*;
class FuException extends Exception
{
FuException()
{
}
FuException(String s)
{
super(s);//Exception有
//System.out.println(s);
}
}
class ExceptionDemo
{
public int method(int[] arr,int index) throws FuException,NullPointerException
{
if(index<0)
{
throw new FuException("The index is fushu");
}
if (arr==null)
{
throw new NullPointerException("没有数组实体");//可自定义
}
return arr[index];
}
}
public class Main
{
public static void main(String[] args)//throws FuException
{
int[] a = new int[10];
ExceptionDemo C = new ExceptionDemo();
try
{
int num = C.method(a,2);
System.out.print("num"+num);
}
catch (FuException e)
{
System.out.println("角标为负数啦!");
}
catch (NullPointerException e)
{
//e.printStackTrace();
System.out.println("Message:"+e.getMessage());
}
//多catch情况,如果有以下catch情况,不能房最上面,会接受所有对象
catch (Exception e)
{
//父类的catch房最下面,否则编译失败
//如果实在出现已有catch以外的情况,虚拟机会处理
}
}
}
八、异常的处理原则
try到底什么时候用?
最根本的核心:只要使用了声明异常的方法,就要try,只要代码中有抛出异常的动作,如果能处理就用try,见到了异常就处理,没有异常就不需要处理。注意:没有错误,非要写try,不仅没意义,还存在弊端,如果真的要处理异常,但是不知道是什么异常,那么只能写Exception,一旦未知异常真的发生了,但是却有个预先处理的方式 ,处理什么不知道,这个异常被处理掉了,一旦处理掉了,就相当于异常被隐藏,但是程序还在正常执行。所以,只要没说有问题,就不处理,只要问题发生了,看到了,再考虑问题是否要处理
异常处理的原则:
1.函数内部如果抛出需要检测的异常,函数上必须要声明,否则必须在函数内部用try&&catch捕捉,否则编译失败
2.如果调用到了声明异常的函数,要么try&&catch,要么throws,否则编译失败
3.什么时候catch,什么时候throws?
功能内部可以解决,用catch
解决不了,用throws,由调用者解决
4.一个功能如果抛出了多个异常,那么调用时必须对应多个catch,进行针对性的处理
(内部有几个需要检测的异常,就要抛几个异常,抛几个,就catch几个)
九、finally代码块
/*finally的应用: * 用到finally最多的地方,比如数据库 * 例如:打开百度,搜索 * 连接数据库 * 查询:假如Exception了,查询过程中出问题 * 关闭连接 *如果出现异常,不关闭连接,还在浪费数据库资源,所以无论是否出现异常,关闭连接一定要执行 *进而释放资源,故关闭连接定义在finally里 */
所以:凡是有资源需要关闭,一定要定义在finally里。
try,catch,finally代码块组合的方式:
1、try,catch,finally(三个都有常见)
2、try、catch,没有必要资源需要释放时,就没必要定义finally
3、try、finally 异常无法直接catch处理,但是资源一定要关闭
- void show()//throws Exception,不用声明,因为catch已经处理了
- {
- try
- { throw new Exception(); }
- //有catch
- catch
- { ….. }
- }
void show()//throws Exception,不用声明,因为catch已经处理了
{
try
{ throw new Exception(); }
//有catch
catch
{ ..... }
}
- void show()throws Exception//没catch,就要声明
- try
- { throw new Exception(); }
- //没catch
- finally //连接资源,出现异常,但是这个异常不一定就要处理,但是资源一定要关闭,因为在内部开辟的,别人不知道
- { …. }