当前位置: 首页 > news >正文

java异常处理

参考java官网教程:The Java™ Tutorials java.util.logging.Logger使用详解

1. java异常处理包括trycatch, finally三个部分,try内是可能会产生异常的代码,例如数组访问,IO操作等等;catch是异常捕捉和处理部分;finally部分主要在于发生异常时候,用于处理异常以及清理(例如下面例子PrinterWriter流需要关闭)。

try {

} catch (ExceptionType name) {
   ...handler...
} catch (ExceptionType name) {

}
ExceptionType是异常类型,必须是继承自Throwable类。在handler中我们可以通过name引用异常获得相关信息,例如:
try {

} catch (IndexOutOfBoundsException e) {
    System.err.println("IndexOutOfBoundsException: " + e.getMessage());
} catch (IOException e) {
    System.err.println("Caught IOException: " + e.getMessage());
}

 

2. handler不仅仅可以打印异常信息和挂起程序,还可以进行错误恢复(error recovery),让用户决定异常处理,通过chained exceptions传送异常到更高级别。

关于chained exceptions详细参考Chained Exceptions,其中涉及到打印日志和Stack Trace打印:

        try{
            int a[] = new int[2];
            System.out.println("Access element three :" + a[1]);
        } catch (ArrayIndexOutOfBoundsException e) {
            System.err.println("Exception thrown  :" + e);
            StackTraceElement elements[] = e.getStackTrace();
            for (int i = 0 , n = elements.length; i < n; i++){
                /*System.out.println("elements: " + i);
                System.err.println(elements[i].getFileName()+":" +
                elements[i].getLineNumber() + ">>" + elements[i].getMethodName());*/
                logger.log(Level.INFO, elements[i].getMethodName());
            }
            throw e;
        }

3. finally部分始终会运行,用于善后处理,这个实例中他负责关闭PrintWriter,如果PrintWriter已经打开。
catch (IndexOutOfBoundsException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (out != null){
                // No IOException, Stream open
                System.out.println("PrintWriter closed!");
                out.close();
            }
            else{
                // Stream not open maybe for IOException
                System.out.println("PrintWriter not open!");
            }
        }
想要了解更多关于finally在资源释放方面作用,请看:try-with-resources Statement,这里我们提供一个示范

4. 综合应用请看一下例子:
    try {
System.out.println("Enter try statement: ");
out = new PrintWriter(new FileWriter("OutFile.txt"));

for(int i = 0; i < SIZE; i++){
out.println("Value at:" + i + list.get(i));
}
}catch (IndexOutOfBoundsException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
out.close();
以上加粗部分新建一个PrintWriter类指向文件输出流,并且获取list数组内容输出到输出流指定文件。因为涉及到新建文件以及获取数组内容,所以需要处理IndexOutOfBoundsException(数组越界)和IOException(IO异常)。我们可以通过触发异常来进行试验:
正常运行时候,程序会建立OutFile.txt文件,并且写入信息。结果如下
Enter try statement: 
Access element three :0
Out of the block

Process finished with exit code 0

OutFile.txt中内容如下:

Value at:0

Value at:1

Value at:2

Value at:3

 

4.1 我们通过预先在相关目录下建立OutFile.txt文件,并且修改权限为高于目前用户,例如"chown root OutFile.txt"将文件所有权改为root这样程序便会因为无法建立文件产生IO异常,如下:

Enter try statement: 
java.io.FileNotFoundException: OutFile.txt (Permission denied)
    at java.io.FileOutputStream.open(Native Method)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:221)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:110)
    at java.io.FileWriter.<init>(FileWriter.java:63)
    at oracle.ListOfNumbers.writeList(ListOfNumbers.java:28)
    at oracle.ListOfNumbers.main(ListOfNumbers.java:45)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

 

4.2 我们在通过"for(int i = 0; i < SIZE + 1; i++)"使数组越界,然后运行程序发现:

java.lang.IndexOutOfBoundsException: Index: 10, Size: 10
    at java.util.ArrayList.rangeCheck(ArrayList.java:635)
    at java.util.ArrayList.get(ArrayList.java:411)
    at oracle.ListOfNumbers.writeList(ListOfNumbers.java:31)
    at oracle.ListOfNumbers.main(ListOfNumbers.java:45)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Access element three :0
Out of the block 

 

附注代码:

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.*;

class MyLogHandler extends Formatter{
    public String format(LogRecord record){
        return record.getLevel() + ":" + record.getMessage() + "\n";
    }
}

public class ListOfNumbers{
    private List<Integer> list;
    private static final int SIZE = 10;

    public ListOfNumbers(){
        list  = new ArrayList<Integer>(SIZE);
        for(int i = 0; i < SIZE; i++){
            list.add(new Integer(i));
        }
    }

    void writeList() {
        PrintWriter out = null;
        try {
            System.out.println("Enter try statement: ");
            out = new PrintWriter(new FileWriter("OutFile.txt"));

            for(int i = 0; i < SIZE; i++){
                out.println("Value at:" + i + list.get(i));
            }
        }catch (IndexOutOfBoundsException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        out.close();

    }

    public static void main(String args[]) throws IOException{
        ListOfNumbers test = new ListOfNumbers();
        test.writeList();
        Logger logger = Logger.getLogger("oracle");
        logger.setLevel(Level.ALL);
        ConsoleHandler handler = new ConsoleHandler();
        handler.setLevel(Level.SEVERE);
        logger.addHandler(handler);
        FileHandler fileHandler = null;
        try {
            fileHandler = new FileHandler("/users/wsy/language/java/Exception/log.txt");
        } catch (IOException e) {
            System.err.println("Create FileHandler failed!");
            e.printStackTrace();
        }
        fileHandler.setLevel(Level.ALL);
        fileHandler.setFormatter(new MyLogHandler());
        logger.addHandler(fileHandler);

        try{
            int a[] = new int[2];
            System.out.println("Access element three :" + a[2]);
        } catch (ArrayIndexOutOfBoundsException e) {
            System.err.println("Exception thrown  :" + e);
            StackTraceElement elements[] = e.getStackTrace();
            for (int i = 0 , n = elements.length; i < n; i++){
                /*System.out.println("elements: " + i);
                System.err.println(elements[i].getFileName()+":" +
                elements[i].getLineNumber() + ">>" + elements[i].getMethodName());*/
                logger.log(Level.INFO, elements[i].getMethodName());
            }
            throw e;
        }

        System.out.println("Out of the block");
    }
}

 

转载于:https://www.cnblogs.com/wenwangt/articles/4934258.html

相关文章:

  • Jangaroo:把ActionScript编译为JavaScript
  • 入侵网游服务器手记
  • win7 32bit下安装mysql server
  • 有时候就是看不进论文-jQuery动画特效篇MySQL
  • Java之父回应苹果停止更新Java
  • CompoundButton.OnCheckedChangeListener与RadioGroup.OnCheckedChangeListener冲突
  • 当项目经理是一种修炼
  • git重写历史记录
  • Python导出Excel为Lua/Json/Xml实例教程(一):初识Python
  • 在京高校大学生“准”程序员召集令(新发布上课时间及地点)
  •  D - 粉碎叛乱F - 其他起义
  • Ruby的GC机制源码分析(4)
  • 【随笔】android开发的学习路线
  • 第十章学习笔记总结
  • S3C2440-AD应用
  • CentOS7简单部署NFS
  • Elasticsearch 参考指南(升级前重新索引)
  • ES6系列(二)变量的解构赋值
  • Git学习与使用心得(1)—— 初始化
  • java概述
  • jquery cookie
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • js中的正则表达式入门
  • October CMS - 快速入门 9 Images And Galleries
  • Sublime Text 2/3 绑定Eclipse快捷键
  • tensorflow学习笔记3——MNIST应用篇
  • vue-router的history模式发布配置
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • Web标准制定过程
  • 日剧·日综资源集合(建议收藏)
  • 线上 python http server profile 实践
  • 协程
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #QT(一种朴素的计算器实现方法)
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (31)对象的克隆
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (六)Hibernate的二级缓存
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (一)基于IDEA的JAVA基础1
  • **PHP分步表单提交思路(分页表单提交)
  • *1 计算机基础和操作系统基础及几大协议
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .net 获取url的方法
  • .NET设计模式(11):组合模式(Composite Pattern)
  • ?
  • [ vulhub漏洞复现篇 ] JBOSS AS 5.x/6.x反序列化远程代码执行漏洞CVE-2017-12149
  • [2016.7 test.5] T1
  • [android学习笔记]学习jni编程
  • [ComfyUI进阶教程] animatediff视频提示词书写要点
  • [English]英语积累本