△子父类涉及的异常问题:
     1.子类在覆盖方法时,父类的方法如果抛出了异常,那么子类的方法只能抛出父类的异常或者该异常的子类,且只能抛出异常的子集
     2.如果父类抛出了多个异常,子类只能抛出父类异常的子集,如果父类的方法没有抛出异常,那么子类重写方法时一定不能抛,只能捕捉
△throw和throws:
     1.throw声明在方法内部,抛出的是异常的对象。
     2.throws生命在方法上,抛出的是异常类
△编译异常和运行时异常:编译异常必须对其进行处理,而运行时异常不需处理.编译时的异常称为已检查异常,运行时的异常称为未检查异常。
△JDK1.7新增异常的特性:catch(Exception | NullpointerException e):捕获异常,这里注意,参数名只有一个,另外中间只能用"|"不能用"||".并且两个异常不能互相是继承关系。
△多catch语句,父类异常一定要放在最下面。
在一个异常体系捕捉后,catch语句块里面抛出另外一个异常是相当实用的做法。称为异常的转换。
△finally就算碰到return也会继续执行
△finally只用于发生异常且未捕捉到的时候,执行关闭资源的动作,其他情况下,其语句等同于正常的语句,按照正常的顺序执行。
△finally的返回值会将try语句的返回值覆盖
public static int f(int n){
try{
int r =n *n ;
return r ;
}
finally{
if(n ==2)
return 6;
}
}

该语句当n=2时,返回6。

△try finally语句中,finally语句中如果关闭抛出了异常,那么后抛出的异常将会把刚抛出的异常给覆盖

class XyyException extends Exception{
public XyyException(String s ){
super(s );
}
}
class HlhException extends Exception{
public HlhException(String s ){
super(s );
}
}
public class Demo { public static void main(String[] args) throws XyyException, HlhException {
f();
} public static void f() throws XyyException, HlhException {
int x =2;
try{
x= x*2;
throw new XyyException("try");
}
finally{
if(x ==4){
throw new HlhException("finally");
}
}
} }
异常为:
Exception in thread "main" string.Demo.HlhException: finally
at string.Demo.Demo.f( Demo.java:26)
at string.Demo.Demo.main( Demo.java:15)
解决这种方法的步骤为:采用带资源的try语句,在try()括号里实现了AutoCloseable接口的类都可以在调用try后关闭资源,(此时try语句里的资源关闭发生的异常将会被抑制,不会被抛出)。
△关于异常finally对于返回值的覆盖,有以下几点细节:
  finally语句在return执行后返回前执行。对于基本类型,return可以确定的是进入finally前的返回值。对于引用数据类型,return可以确定的是返回的对象内容。用两个示例加以说明:
public static int f(){
int x=10;
try{
System.out.println(12/0);
return x;
} catch(Exception e) {
x=20;
return x;
}
finally {
x=30;
if(x==30)
return x;
}
}

  这个代码finally会将return30,因为finally中的return会将catch中的return覆盖,而如果没有return x,则该方法返回20,因为x仅仅赋值,但是返回的此时已经确定好了值.即在finally语句在return执行后返回前执行。

import java.util.*;

public class FinallyTest6
{
public static void main(String[] args) {
System.out.println(getMap().get("KEY").toString());
} public static Map<String, String> getMap() {
Map<String, String> map = new HashMap<String, String>();
map.put("KEY", "INIT"); try {
map.put("KEY", "TRY");
return map;
}
catch (Exception e) {
map.put("KEY", "CATCH");
}
finally {
map.put("KEY", "FINALLY");
map = null;
} return map;
}
}

  这个代码运行结果是finally。因为在try中即返回了引用所指向的对象(即确定的是对象),随后对对象的操作都会改变返回值,但是在finally代码块的最后一句将引用指向空,对于对象不构成任何影响,原对象返回。

△断言机制:assert关键字
 格式为:assert 条件;
或assert 条件:表达式;(表达式部分的唯一目的是产生一个消息字符串。)    
 当assert的条件为false的时候,将会抛出一个有关键字构成的AssertionError异常。
 利用java -ea打开assert,即可进入断言机制模式,默认情况下为关闭。
△记录日志
  Logger logger=Logger.getLogger("Demo");               //获得一个记录器,其名为Demo
  logger.setLevel(Level.ALL)                                        //获得记录器的等级
  然后利用;logger.entering() logger.exiting记录进入方法,离开方法。(需要手动记录)
  处理器:可以利用FileHandler将日志输出到文件。
  FileHandler fh=new FileHandler( "MyLogger.txt");
 fh.setLevel(Level. FINE);
 logger .addHandler(fh);                 //将处理器添加到日志记录器中,可以添加多个
 但是这样输出的文件将会是XML格式,不方便阅读因此需要定义格式化器,然后将其添加到处理器
 示例:
package io.project.one;
import java.util.logging.FileHandler;
import java.util.logging.Formatter;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger; public class Demo2 {
public static void main(String[] args) {
Logger logger=Logger. getLogger("io.project.one.Demo2");
logger.setLevel(Level. FINE);
try {
FileHandler fh= new FileHandler("MyLogger.txt" );
fh.setLevel(Level. FINE);
fh.setFormatter( new MyFormatter());
logger.addHandler( fh); logger.fine( "进入main函数" );
int x =2;
int y =3;
add(x,y);
logger.exiting( "io.project.one.Demo2", "main" );
} catch (Exception e ) {
e.printStackTrace();
}
} public static void add(int x, int y) {
Logger logger=Logger. getLogger("io.project.one.Demo2");
logger.fine( "io.project.one.Demo2");
System. out.println("x+y" );
logger.fine( "io.project.one.Demo2");
} }
class MyFormatter extends Formatter{ @Override
public String format(LogRecord record ) {
return "类别:" +record .getLevel()+"....信息:"+ record.getMessage();
}
}
这样输出的信息:
类别:FINE....信息:进入main函数类别:FINE....信息:io.project.one.Demo2类别:FINE....信息:io.project.one.Demo2。
简单易懂。
△调试技巧
  step into:跟踪到每个方法的内部(F5)
  step over:定位到下一行,不跟踪到方法的内部。(F6)
  step return:返回原来调用此方法的方法。(F7)
  step resume:跳到下一个断点(F8)
  调试窗口中,断点视图可以设置条件断点(当且仅当某个表达式值为true,才在此断点暂停。)点击断点视图中的断点--右键breakpoints properties--Conditional--设置断点的值。
  也可以添加异常断点,保证遇到某个异常的时候,仍然能够继续调试。
△通过注释规避编译器检查
 规避对于方法所有代码的检查:
     @SuppressWarnings("unchecked" )
        public void setFirst(T first) {
               this.first = first ;
       }
 对于调用方法时的语句进行规避检查:  
     @SuppressWarnings("unchecked" )
     Pair<String> mm=ArrayAlg. minmax(words);

JavaSE复习_7 异常的更多相关文章

  1. javaSE复习之——线程

    线程其实就是程序执行的一条路径,一个进程中可以包含多条线程,多线程并发执行可以提高程序效率,可以同使完成多项任务 多线程的应用场景 迅雷多线程一起下载 服务器同时处理多个客户请求 多线程原理(单核CP ...

  2. JavaSE复习(三)异常与多线程

    异常 分类 编译时期异常:checked异常. 在编译时期,就会检查,如果没有处理异常,则编译失败.(如日期格式化异常) 运行时期异常:runtime异常. 在运行时期,检查异常.在编译时期,运行异常 ...

  3. javaSE复习总结

    之前匆匆忙忙学完了java,后来又接着学习ee,然而,越是想要快一点最后反而会更慢一点.因为匆忙间 我几乎什么都没学会.在后面的学习中实在非常吃力.就把javase 的视频大部分又重新看了一遍.真的收 ...

  4. JavaSE复习总结之集合(Collection)

    Java早期版本只给集合类库提供了很少的一组类,但是随着Java版本的升级,Java集合类库越来越充实.集合类库里面存放的,是各式各样的数据容器,我们基本都学过数据结构这门课,数据结构所讲的就是ADT ...

  5. JavaSE复习日记 : 算是个小前言吧

    /* * Java也学了好久了,抽个时间整理了一下课堂笔记,也有些是我刚开始学会犯的一些错误.在这里浅谈一下JavaSE的基础内容,对我来说也是一种不错的复习方式. * * 那好,对于初学者来说,学习 ...

  6. JavaSE复习巩固

    第二天:复习if语句,扫描器,switch语句,循环语句 1.if语句---流程控制语句 if之前学的语句是顺序结构 1.1 单个if的语法结构 if(条件判断){ 满足条件需要做的事情: } int ...

  7. JavaSE复习_12 Socket网络编程

    △客户端使用Scanner与BufferedReader的异同,Scanner在客户端调用s.shutdownoutput的时候,将会因为读不到行而报异常,但是BufferedReader的readl ...

  8. JavaSE复习_11 IO流复习

    △FileReader是使用默认码表读取文件, 如果需要使用指定码表读取, 那么可以使用InputStreamReader(字节流,编码表)    FileWriter是使用默认码表写出文件, 如果需 ...

  9. JavaSE复习_10 多线程复习

    △wait()和sleep()的区别:  1.wait():没有等待时间,而sleep()需要有等待时间作为参数.  2.在同步中对于CPU的执行权和锁的处理不同:   wait()会释放执行权和锁. ...

随机推荐

  1. JavaScript DOM 编程艺术(第2版)读书笔记(6)

    案例研究:图片库改进版 我们在学校里学过一种理论,叫做结构化程序设计.其中有这样一条原则:函数应该只有一个入口和一个出口.从理论上讲,我很赞同这项原则:但在实际工作中,过分拘泥于这项原则往往会使代码变 ...

  2. Ajax案例:简易的购书网页

    ****使用Ajax可以不需要刷新整个页面,而使局部页面更新的技术: ****JSON是JavaScript得原生格式,JavaScript中处理JSON数据不需要特殊的工具或架包,其规则很简单,对象 ...

  3. 哈夫曼树-Fence Repair 分类: 树 POJ 2015-08-05 21:25 2人阅读 评论(0) 收藏

    Fence Repair Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 32424 Accepted: 10417 Descri ...

  4. 【20160924】GOCVHelper 图像增强部分(5)

    // Multiply 正片叠底 void Multiply(Mat& src1, Mat& src2, Mat& dst) {     for(int index_row=0 ...

  5. logo上线

  6. livereload的简单使用

    一/直接使用:npm install -g livereload 全局安装 http-server  起到服务 livereload启动 在html中引入<script src="ht ...

  7. Android WebView使用基础

    WebView基本使用 WebView是View的一个子类,可以让你在activity中显示网页. 可以在布局文件中写入WebView:比如下面这个写了一个填满整个屏幕的WebView: <?x ...

  8. dubbo源码之四——dubbo服务发布

    dubbo版本:2.5.4 服务发布是服务提供方向注册中心注册服务过程,以便服务消费者从注册中心查阅并调用服务. 服务发布方在spring的配置文件中配置如下: <bean id="d ...

  9. 区分一下dpkg,rpm和yum以及apt-get

    一般来说著名的 Linux 系统基本上分两大类: RedHat 系列:Redhat.Centos.Fedora 等 Debian 系列:Debian.Ubuntu 等 Dpkg (Debian系):U ...

  10. Python3基础 random 产生置顶区间的随机整数

    镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...