异常处理

如何判断一个方法中可能抛出异常

  1. 该方法中出现throw语句
  2. 该方法调用了其他已经带throws子句的方法。

如果方法中可能抛出异常,有两种处理方法:

1.若当前方法有能力处理异常,则用Try-catch

public void A(int x)
{
try{
if (x == 0)
throw new Exception("Zero");
}
catch(Exception e)
{
//do sth
}
}

2.若当前方法没有能力处理异常,则在方法的声明处写上throws语句。

public void A(int x) throws Exception
{
if (x == 0)
throw new Exception("Zero");
}

finally:总是会被执行的语句。

不管try代码块中是否出现异常,finally代码块总是被执行。

(1)finally唯一不被执行的情况就是先执行了System.exit();

public static void main(String[] args)
{
try
{
System.out.println("Begin");
System.exit(0);
}
finally
{
System.out.println("Finally");
}
System.out.println("End");
}

结果为Begin

public static void main(String[] args) throws Exception
{
try
{
System.out.println("Begin");
A(0); //抛出异常
System.exit(0);
}
catch(Exception e)
{
System.out.println("Wrong");
throw e;
}
finally
{
System.out.println("Finally");
}
System.out.println("End");
}

输出结果为
Begin

Wrong

Finally

因为main方法已经抛出了异常,所以异常终止,不会继续执行下去。

假如注释掉throw e;这条语句

public static void main(String[] args) throws Exception
{
try
{
System.out.println("Begin");
A(0); //抛出异常
System.exit(0);
}
catch(Exception e)
{
System.out.println("Wrong");
//throw e;
}
finally
{
System.out.println("Finally");
}
System.out.println("End");
}

输出结果为
Begin

Wrong

Finally

End

(2)假如含有return语句,那么finally会在return之前执行。

public void A(int x) throws Exception
{
if (x == 0)
throw new Exception("Zero"); //
} piblic int B(int x)
{
try
{
System.out.println("Begin"); //
A(x); //
return 1;
}
catch(Exception e)
{
System.out.println(e.getMessage()); //
return 0; //
}
finally
{
System.out.println("Finally"); //
}
} public static void main(String[] args)
{
System.out.println(B(0)); //
}

输出结果为

Begin

Zero

Finally

0

throw与throws

注意throw与throws的区别:

throw是方法中抛出异常时使用的句子。

throws是方法名称后面用于声明该方法可能抛出的异常的句子。

异常处理的语法规则

  • try不能单独存在,后面至少要接一个catch或finally
  • try后面可以有0个或多个catch,可以有0个或1个finally,但不能2种都是0个。
  • try后面若有多个catch,则出现异常时会根据顺序去匹配catch,所以小类异常的catch应当放在更前一些。

数组

数组的声明与c++有所不同

int[] s;    (√)

int s[];    (√)

int s[30];    (×)

int[] s = new int[30];      (√)

int[] s = new int[]{1,2,3};  (√)

int[] s = new int[3]{1,2,3};  (×)

Java中数组的长度可以用s.length来获取。

线程初步

线程的创建和启动有2种方法:

1.继承Thread类

 public class S extends Thread
{
public void run()
{
//do sth;
}
} S s = new S();
s.start(); //start()会自动调用run()

2.实现Runnable接口

 public class S implements Runnable
{
public void run()
{ }
} S s = new S();
Thread thread = new Thread(s);
thread.start();

尽管S实现了run方法,但S始终不是线程类,所以要重新创建一个线程类。

Thread中有这样的构造方法

Thread(Runnable runnable);

输入/输出

InputStream,OutputStream类 字节输入/输出流(最小的传输数据是字节)

Reader,Writer类 字符输入/输出流(最小的传输数据是字符)

字节输入流

所有的字节输入流都是InputStream类的子类。

文件输入流是InputStream的子类:

FileInputStream(File file);

FileInputStream(String name);

过滤输入流FilterInputStream(可以按照需要来读取相应的数据类型,如double,int)

FilterInputStream有以下2个子类:

BufferedInputStream  利用缓冲区来提高读写效率

DataInputStream    与DataOutputStream配合,可以从流中读取基本类型(int,double,char等)数据。

BufferedInputStream:

BufferedInputStream(InputStream in)  //装饰输入流In

BufferedInputStream(InputStream in, int size)  //装饰输入流in,指定缓冲区大小

FileOutputStream out1 = new FileOutputStream("C:\\test.txt");

//装饰文件输出流
BufferedOutputStream out2 = new BufferedOutputStream(out1); //装饰带缓冲的文件输出流
DataOutputStream out3 = new DataOutputStream(out2); out3.writeByte(-12); out3.flush(); //无论缓冲区是否满,都输出 out3.writeDouble(1.2); out3.writeChar('a'); out3.close(); //close()会自动调用flush() InputStream in1 = new InputStream("C:\\test.txt"); //装饰文件输入流
BufferedInputStream in2 = new BufferedInputStream(in1); //装饰带缓冲的文件输入流
DataOutputStream in3 = new DataOutputStream(in2); int a = in3.readByte(); double b = in3.readDouble(); char c = in3.readChar(); in3.close(0);

字节输出流同理

Reader类

Reader类有以下子类

InputStreamReader

FileReader

BufferedReader

InputStreamReader

InputStreamReader(InputStream in)  //按默认编码方式读取输入流中的字符

InputStreamReader(InputStream in, String charsetName)  //按给定编码方式读取输入流中的字符

FileReader(File file)

FileReader(String name)

BufferedReader

BufferedReader(Reader in)

BufferedReader(Reader in, int size)

InputStream in1 = new FileInputStream("C:\\test.txt");

InputStreamReader in2 = new InputStreamReader(in1, "UTF-8");

BufferedReader in3 = new BufferedReader(in2);

StringWriter buffWriter = new StringWriter();

int data;
while ((data = in3.read()) != -1)
buffWriter.write(data); in3.close; String result = buffWriter.toString();

若有编码的问题,则应当考虑使用Reader/Writer而不是InpuStream/OutputStream.

Java逍遥游记读书笔记<三>的更多相关文章

  1. Java逍遥游记读书笔记<一>

    前言 必须先来一句,这是入门级别,高手勿喷~ 写Android的时候总有一些语句不是很理解,其实大部分是Java的内容,所以想系统的学下Java. 这本书——<Java逍遥游记>是在图书馆 ...

  2. Java逍遥游记读书笔记<二>

    Abstract抽象类 1.抽象类不能被实例化 2.抽象方法没有方法体 如: public abstract class Weapen { public abstract void attack(); ...

  3. java编程思想读书笔记三(11-21)

    十一:持有对象 >持有对象实例 ●数组将数字与对象联系起来.它保存类型明确的对象,查询对象时,不需要对结果做类型转换.他可以是多维的. 可以保存基本的数据类型.但是,数组一旦生成,容量就不会在变 ...

  4. 深入理解Java虚拟机之读书笔记三 内存分配策略

    一般的内存分配是指堆上的分配,但也可能经过JIT编译后被拆散为标量类型并间接地在栈上分配.对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配,少数情况下直接分 ...

  5. 《深入理解java虚拟机》读书笔记三——第四章

    第四章 虚拟机性能监控与故障处理工具 1.JDK命令行工具 jps命令: 作用:列出正在运行的虚拟机进程. 格式:jps [option] [hostid] 选项:-q 只输出LVMID(Local ...

  6. 《深入理解Java虚拟机》读书笔记三

    第四章 虚拟机性能监控与故障处理工具 1.JDK命令行工具 jps命令: 作用:列出正在运行的虚拟机进程. 格式:jps [option] [hostid] 选项:-q 只输出LVMID(Local ...

  7. JAVA编程思想读书笔记(三)--RTTI

    接上篇JAVA编程思想读书笔记(二) 第十一章 运行期类型判定 No1: 对于作为程序一部分的每个类,它们都有一个Class对象.换言之,每次写一个新类时,同时也会创建一个Class对象(更恰当的说, ...

  8. JAVA编程思想读书笔记(四)--对象的克隆

    接上篇JAVA编程思想读书笔记(三)--RTTI No1: 类的克隆 public class MyObject implements Cloneable { int i; public MyObje ...

  9. 《大型网站系统与Java中间件》读书笔记 (中)

    前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 回顾上一篇: <大型网站系统与Java中间件& ...

随机推荐

  1. TortoiseSVN版本管理软件使用简单说明

    很多时候在写一个小的项目不想使用github等工具,只想简单在本地搭建一个版本管理器.那么TortoiseSVN就非常适合. 第一步:下载TortoiseSVN,http://tortoisesvn. ...

  2. PHP连接Azure Redis

    概述 Azure Redis缓存基于流行的开源Redis缓存,可以通过各种Redis客户端进行访问,这些客户端适用于许多编程语言.每个客户端有自身的API,用于通过Redis命令调用Redis缓存实例 ...

  3. 扩展方法 DataTable的ToList<T>

    using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.T ...

  4. Android USB转串口通信开发基本流程

    好久没有写文章了,年前公司新开了一个项目,是和usb转串口通信相关的,需求是用安卓平板通过usb转接后与好几个外设进行通信.一直忙到近期,才慢慢闲下来,趁着这个周末不忙.记录下usb转串口通信开发的基 ...

  5. 重写spring cloud config 本地bootstrap

    在spring-cloud中使用了config-server之后,需要在client端加入bootstrap作为配置文件,其中通常包含如下: spring.application.name=ms-as ...

  6. springboot页面缓存和url缓存实例

    @Autowired RedisService redisService; @Autowired GoodsService goodsService; @Autowired ThymeleafView ...

  7. 【Objective-C】03-第一个OC程序

    一.打开Xcode,新建Xcode项目 二.选择最简单的命令行项目 因为我们只是学习OC语法,还未正式进入iOS开发,所以选择命令行项目即可 三.输入项目名称,选择Foundation框架进行创建项目 ...

  8. 转-linux下配置socks5代理

    简介: 在Linux下有各种各样的代理程序可用,象最常用的Squid,是http/https代理,也能代理ftp请求,但它实际上 是个HTTP代理程序,不是ftp代理,但它能处理ftp代理请求,就象浏 ...

  9. make命令用法--转

    转自:http://www.techug.com/make 代码变成可执行文件,叫做编译(compile):先编译这个,还是先编译那个(即编译的安排),叫做构建(build). Make是最常用的构建 ...

  10. C#中Equals和==的比较

    一.值类型的比较 对于值类型来说  两者比较的都是”内容”是否相同,即 值 是否一样,很显然此时两者是划等号的. ; ; Console.WriteLine("i==j"+(i== ...