下面的程序所要做的事情正是前一个谜题所做的事情,但是它没有假设斜杠符号就是分隔文件名组成部分的符号。相反,该程序使用的是java.io.File.separator,它被指定为一个公共的String域,包含了平台相关的文件名分隔符。那么,这个程序会打印出其正确的、平台相关的类文件名吗?


package com.javapuzzlers;import java.io.File;public class MeToo {public static void main(String[] args){ System.out.println(MeToo.class.getName(). replaceAll("\\.", File.separator) + ".class"); } } 

这个程序根据底层平台的不同会显示两种行为中的一种。如果文件分隔符是斜杠,就像在UNIX上一样,那么该程序将打印com/javapuzzlers/MeToo.class,这是正确的。但是,如果文件分隔符是反斜杠,就像在Windows上一样,那么该程序将打印像下面这样的内容:


Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1at java.lang.String.charAt(String.java:558) at java.util.regex.Matcher.appendReplacement(Mather. java:696) at java.util.regex.Matcher.replaceAll(Mather.java:806) at java.lang.String.replaceAll(String.java:2000) at com.javapuzzlers.MeToo.main(MeToo.java:6) 

尽管这种行为是平台相关的,但是它并非就是我们所期待的。在Windows上出了什么错呢?

事实证明,String.replaceAll的第二个参数不是一个普通的字符串,而是一个替代字符串(replacement string),就像在java.util.regex规范中所定义的那样[Java-API]。在替代字符串中出现的反斜杠会把紧随其后的字符进行转义,从而导致其被按字面含义而处理了。

当你在Windows上运行该程序时,替代字符串是单独的一个反斜杠,它是无效的。不可否认,抛出的异常应该提供更多一些有用的信息。

那么你应该怎样解决此问题呢?5.0版本提供了不是一个而是两个新的方法来解决它。第一个方法是java.util.regex.Matcher.quoteReplacement,它将字符串转换成相应的替代字符串。下面展示了如何使用这个方法来订正该程序:


System.out.println(MeToo.class.getName().replaceAll("\\.", Matcher.quoteReplacement(File.separator)) + ".class");

引入到5.0版本中的第二个方法提供了一个更好的解决方案。该方法就是String.replace(CharSequence, CharSequence),它做的事情和String.replaceAll相同,但是它将模式和替代物都当作字面含义的字符串处理。下面展示了如何使用这个方法来订正该程序:


System.out.println(MeToo.class.getName().replace(".", File.separator) + ".class");

但是如果你使用的是较早版本的Java该怎么办?很遗憾,没有任何捷径能够生成替代字符串。完全不使用正则表达式,而使用String.replace(char,char)也许要显得更容易一些:


System.out.println(MeToo.class.getName().replace(‘.’, File.separatorChar) + ".class");

本谜题和前一个谜题的主要教训是:在使用不熟悉的类库方法时一定要格外小心。当你心存疑虑时,就要求助于Javadoc。还有就是正则表达式是很棘手的:它所引发的问题趋向于在运行时刻而不是在编译时刻暴露出来。

对API的设计者来说,使用方法具名的模式来以明显的方式区分方法行为的差异是很重要的。Java的String类就没有很好地遵从这一原则。对许多程序员来说,对于哪些字符串替代方法使用的是字面含义的字符串,以及哪些使用的是正则表达式或替代字符串,要记住这些都不是一件容易事。

转载于:https://www.cnblogs.com/yuyu666/p/9840413.html

谜题21:我的类是什么?相关推荐

  1. cocos2d-x初探学习笔记(21)--精灵类

    小满(bill man)个人原创,欢迎转载,转载请注明地址,小满(bill man)的专栏地址http://blog.csdn.net/bill_man 在游戏中还有一个比较重要的元素,那就是精灵类, ...

  2. 第 2-1 课:类与 Object + 面试题

    类介绍 Java 程序是由若干个类组成的,类也是面向对象编程思想的具体实现. 以下为类的基本使用: public class Cat {// 私有属性private String name;priva ...

  3. java入门篇(21)File类

    文章目录 1.File类的概述和构造方法 1.1File类的概述: 1.2File类的构造方法 1.3File类的创建功能 1.4File类的删除功能 1.5File类的重命名功能 1.6File类的 ...

  4. JavaWeb----学习(21)----struts2---ActionSupport类

    ActionSupport 1. ActionSupport 是默认的 Action 类: 若某个 action 节点没有配置 class 属性, 则 ActionSupport 即为 待执行的 Ac ...

  5. 【】每日360题,2019.11.03日21点财会类考试习题答案

    下列行为不违反银行结算纪律的是().A.出租.出借账户B.签发空头支票C.收到要求付款的汇票后第二 点我找答案 早9点到晚9点,每小时分享一套试题,每套精选30道题,一同学习! 修理车间和锅炉车间的辅 ...

  6. 【】每日360题,2019.11.05日21点财会类考试习题答案

    (操作员:刘主管:账套:101账套:操作日期:2015年1月31日)设置固定资产类别.固定资产类别编码:1固定 点我找答案 早9点到晚9点,每小时分享一套试题,每套精选30道题,一同学习! 打开现成E ...

  7. Java解惑 电子书

    --表达式谜题 Java 谜题 1--表达式谜题 谜题 1:奇数性 下面的方法意图确定它那唯一的参数是否是一个奇数.这个方法能够正确运转 吗? public static boolean isOdd( ...

  8. 读书笔记:《流畅的Python》第21章 类元编程

    # 第21章 类元编程""" 类元编程指的是运行时创建或定制类的技艺1.类是一等对象,任何时候都可以使用函数新建类,而无需使用class关键字2.类装饰器也是函数,不过能 ...

  9. 学好顶级算法谜题,不再为了编程而编程

    谜题趣味非凡.顶级谜题的解可没那么浅显易得,需要灵光一闪才能发现.算法谜题是指谜题的解法就是算法,解题的步骤可以被机器自动执行.算法可以用英文或者其他任何自然语言来描述,但是为了更加精确,往往会用伪代 ...

最新文章

  1. android不调用系统发送短信,android之两种方式调用短信发送接口
  2. mysql索引为啥要选择B+树 (上)
  3. windows python 访问mtp存储空间_Python 3.7 已上架 Microsoft Store,让你 轻松使用 Python...
  4. ios 开发框架原始雏形 01
  5. 【大话Hibernate】hibernate事务管理
  6. rxjava 循环发送事件_使用RxJava和SseEmitter进行服务器发送的事件
  7. Java SE 7 Update 25 –发行说明进行了解释。
  8. 计算机网络课程设计之网络聊天程序的设计与实现
  9. 【BZOJ4008】【HNOI2015】亚瑟王 [期望DP]
  10. jsp标记之动作标记介绍
  11. 多维数组做参数,内存可以看做是线性的
  12. 2019,国产手机生死存亡的一年
  13. 用c#语言制作ktv点歌系统,KTV点歌系统的设计与实现的设计和实现(C#,C/S,Access)
  14. linux 电源管理
  15. 三思笔记之一步一步学ORACLE
  16. mysql 给root授权_mysql授权
  17. reg型变量怎么赋值_FPGA的wire和reg类型变量
  18. U盘没有文件但空间被占用解决办法(U盘文件夹隐藏恢复)
  19. C++学习int main()函数
  20. JavaScript运算符 ~,~~,|,,

热门文章

  1. 它被称为“蓝领”的编程语言!90%的财富500强公司都在使用!
  2. PDO连接MYSQL报错SQLSTATE[HY000] [2002] ����Ŀ�����������ܾ����޷����ӡ�
  3. Dynamics AX2012 AOT同步到VS
  4. C语言小游戏“剪刀石头布”
  5. 小甲鱼python003答案_小甲鱼Python第003讲:插曲之变量和字符串|课后测验及参考答案...
  6. C#windows实验器材管理系统,耗材管理系统
  7. 看过的最好的护肤心得 续
  8. 使用 Spring Quartz组件实现定时任务
  9. Java核心技术·卷I(原书第12版)
  10. 计算机应用能力问题分析,浅析高职院校计算机应用基础教学的思考