Java解惑读书笔记2

从网上下的java解惑总共讲了61点,我拣一些,自己不知道的或者需要注意的分享出来,以作笔记。

20.程序中的Unicode转义字符
//\u0022是双引号的Unicode编码表示
System.out.println("a\u0022.length() + \u0022b".length());// 2
\u0022表示一个双引号",可以在编码时用\u0022代替双引号,当然不会有人干这么二的事情,但我们需要知道\u开头的4个数字表示unicode编码的字符,Unicode编码表示的字符是在[b]编译期间[/b]就转换成了普通字符,它与普通转义字符(如:\")是不一样的,它们是在程序被解析为各种符号之后才处理转义字符序列。

此外,注释中也是支持Unicode转义字符的。

23.string的编码,默认是utf-8或者gbk编码,在将string和byte[]互相转化的时候要注意编码类型,否则容易出现乱码

String s = "你号";//默认是UTF-8编码
byte[] bs = s.getBytes("GBK");//去GBK编码的bytes,
System.out.println(bs.length);//GBK长度为4,UTF-8为6
String s1 = new String(bs, "GBK");//如果不用GBK会乱码,因为默认的是utf-8
System.out.println(s1);

ISO8859-1是唯一能够让该程序按顺序打印从0到255的整数的缺少字符集,这也是唯一在字符和字节之间一对一的映射字符集。所以ISO-8859-1不能存储汉字,这点要注意,如果把某汉字字符串用iso-8859-1编码后,就乱码了,也再也还原不出原汉字了。

24.string的replace和replaceAll
举个例子,将.class的.替换为\$如何写?如果是replace,可以这么写:
System.out.println(".class".replace(".", "\\$"));

如果是replaceAll.按照上面写法System.out.println(".class".replaceAll(".", "\\$"));会出错结果是$$$$$$,为何?因为replaceAll的第一个参数是正则表达式,因此要匹配.,需要转义因为.在正则表达式里表示任意字符。第二个参数里的\和$也需要转义,因此\的转义是\\\\,$的是\\$。因为replaceAll实际调用正则表达式里的replaceAll:Pattern.compile(regex).matcher(str).replaceAll(repl),这个函数要求需要将\和$转义,因为这2个字符有特殊用处,[quote]美元符号可视为到如上所述已捕获子序列的引用,反斜线可用于转义替换字符串中的字面值字符。 [/quote]

所以正确写法:
System.out.println(".class".replaceAll("\\.", "\\\\\\$"));



26. finally与中断
不要用return、break、continue或throw来退出finally语句块,并且千万不要允许受检查的异常传播到finally语句块之外。也就是说不要在finally块内终止程序,而是执行完finally块后,要将控制权移交给try块,由try最终决定怎样结束方法的调用。因为如果在finally里执行return,则try的ruturn则无效果。

27.捕获RuntimeException、Exception或Throwable的catch语句是合法,不管try块里是否抛出了这三个异常。但如果try块没有抛出或不可能抛出检测性异常,则catch不能捕获这些异常。重写或实现时不能扩大异常的范围,如果是多继承,则异常取所有父类方法异常的交集或不抛出异常。这样设计可以编码异常范围扩大。

31. 递归构造
public class S {
private S instance = new S();
public S() {}
}

如果在程序外面构造该类的实例,则会抛出java.lang.StackOverflowError错误。其原因是实例变量的初始化操作将先于构造器的程序体而运行。

32. 构造器中的异常
如果父类构造器抛出了检测异常,则子类也只能抛出,而不能采用try-catch来捕获:
33. StackOverflowError
Java虚拟机对栈的深度限制到了某个值,当超过这个值时,VM就抛出StackOverflowError。一般VM都将栈的深度限制为1024,即当方法调用方法的层次超过1024时就会产生StackOverflowError。
发布了21 篇原创文章 · 获赞 0 · 访问量 3536
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章