`
dandy
  • 浏览: 67278 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

我的类是什么2

    博客分类:
  • java
阅读更多

下面的程序所要做的事情正是前一个谜题所做的事情,但是它没有假设斜杠符号就是分隔文件名组成部分的符号。相反,该程序使用的是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: 1
at 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类就没有很好地遵从这一原则。对许多程序员来说,对于哪些字符串替代方法使用的是字面含义的字符串,以及哪些使用的是正则表达式或替代字符串,要记住这些都不是一件容易事。
2
0
分享到:
评论

相关推荐

    我积攒的java工具类 基本满足开发需要的工具类

    D:\002 我的工具类\001 流\文件操作整体2\Charsets.java D:\002 我的工具类\001 流\文件操作整体2\CompressUtils.java D:\002 我的工具类\001 流\文件操作整体2\FileReadImpl.java D:\002 我的工具类\001 流\文件...

    基类与派生类(类base派生两个类)

    2. **派生类(Derived Class)**:派生类是从一个或多个基类继承的类,它可以访问基类的所有非私有属性和方法。派生类可以扩展基类的功能,或者对基类的方法进行重写。在Python中,我们使用冒号(:)和基类名来表示...

    最新垃圾分类数据集和源代码.zip

    垃圾分类数据集和源代码含四个大类和245个小类,垃圾分类是目前社会的一个热点,分类的任务是计算机视觉任务中的基础任务,相对来说比较简单,只要找到合适的数据集,垃圾分类的模型构建并不难,这里我找到一份关于...

    LaTeX2e 文类和宏包学习手册.pdf

    在LaTeX2e的文类和宏包学习手册中,主要的知识点围绕着如何使用LaTeX2e来编写文档类(class)和宏包(package),以及如何使用常见的宏包来撰写文档。下面详细地展开这些知识点。 首先,我们需要了解LaTeX文档的...

    仿照vc定时器,我自己封装的CppTimer定时器类

    我用C++封装的跨平台定时器类,CppTimer类。目前仅支持单定时器。特分享出来供大家使用。后续我会添加支持多定时器的功能,敬请期待。 用法: 1、解压,放入项目文件夹中; 2、添加入项目; 3、在需要使用定时器的...

    微信小程序 小游戏类 你画我猜 (源代码+截图)

    微信小程序 小游戏类 你画我猜 (源代码+截图)微信小程序 小游戏类 你画我猜 (源代码+截图)微信小程序 小游戏类 你画我猜 (源代码+截图)微信小程序 小游戏类 你画我猜 (源代码+截图)微信小程序 小游戏类 你画...

    金蝶bos万能工具类和开发工具类代码.rar

    1、这是bos开发使用的工具类,大概一千多行代码,包括获取当前组织,用户,自定义编码规则等等等等实用的方法,这是一朋友给我的,我在做金蝶开发的时候,帮了我很多很多!感兴趣的可以下来看看,每个方法都有注释。...

    ssh2分页类

    SSH2分页类是Spring、Struts2和Hibernate2这三大框架组合应用中,用于处理大量数据分页显示的一种实用工具。在Web开发中,当数据量过大时,一次性加载所有数据不仅会消耗大量服务器资源,也会导致用户界面响应缓慢。...

    这是我个人写的一个分页类

    这是我人做的一个分页类,这是我人做的一个分页类,这是我人做的一个分页类,这是我人做的一个分页类,这是我人做的一个分页类,这是我人做的一个分页类,这是我人做的一个分页类,

    跟我学JAVA-day11-类和对象.pdf

    day11-类和对象 1. 类和对象 1.1 类和对象的理解【理解】 客观存在的事物皆为对象 ,所以我们也常常说万物皆对象。 类 类的理解 类是对现实生活中一类具有共同属性和行为的事物的抽象 类是对象的数据类型,类...

    我自己日常使用的工具类

    标题中的“我自己日常使用的工具类”表明这是一些作者个人常用、并且可能对其他人也有帮助的编程工具类。这些工具类通常包含了各种实用的功能,旨在提高开发效率,简化常见的编程任务。它们可能涵盖字符串处理、日期...

    java实现接口返回数据实体类属性大写变成小写

    接口中我使用了缓存,以及在返回数据时候用了响应实体包装了, 没有直接返回数据库映射实体类。 怀疑问题点: 响应实体包装实体类中的字段有误,全部写成了小写字母? 缓存在出入库的时候会自动转化大小写。 问题...

    GEE代码-基于两期sentinel2遥感影像使用随机森林方法进行土地分类中各地类面积的统计结果分析.pdf

    具体的专栏大家可以前去我的博客主页学习:涵盖了GEE基础、高阶和应用程序开发以及JavaScript和python两种语言的专栏,同时还建立有GEE图表和应用,外接高阶程序应用等,与此同时,还有微软行星云计算、PIE、AI ...

    动态数据显示类 现在我把类公开,大家相互学习

    动态数据显示类 平时写程序时经常需要示波器显示数据。...由于程序的需要,我花了两天写了一个类用于数据显示。现在我把类公开,大家相互学习,详细功能介绍和使用说明参见下载压缩包中的WORD文档。欢迎提出改进意见

    调用接口怎么知道使用的是哪个实现类.doc

    调用接口怎么知道使用的是哪个实现类 Java通过接口调用方法的时候,怎么知道调用的是哪个实现类 当调用接口中的方法时,如何判定用的是哪个实现类 一个接口有多个实现类,怎么知道调用了哪个实现类

    C# 操作MySQL数据库类

    非存储过程操作类,如果要用到存储过程的话,自已修改里面的代码,里面的存储过程被我注释了。 至于调用方法,应该不用我说下载者应该也懂得吧,如果是对C#一巧不通的初学者,不懂也不要怪我,可以问我,或问懂点的...

    超实用的android自定义log日志输出工具类

    android自定义log日志...效果:比如我在MainActivity中直接LogUtils.i(this,”logTest”),配合自己喜欢的标志,结果可输出为 “zhang———-MainActivity :logTest“,方便调试和看log。 2 可以配合androidStudio

    实验一类与对象

    最重要的是,我理解了类和对象的概念,并学会了如何使用它们来解决实际问题。我也了解到了面向对象编程的思想,并掌握了基本的编程技巧。在未来的学习中,我将继续学习和实践,提高自己的编程能力。

    鱼刺类_多线程应用v5.4模块

    资源介绍:。鱼刺类_多线程应用 - 更新日志。5.4.3(2017-12-01)。...*简单封装了内存文件映射(作为私人模块,我基本是用到了什么才会往里封装什么)。资源作者:。@bints。资源界面:。资源下载:。

    取易语言类指针的三个方法源码

    上述代码首先创建了一个名为"我的窗口"的窗口对象,然后使用“取对象指针”命令获取了这个窗口对象的类指针。 ### 方法二:利用“取类信息”命令 除了直接获取对象的类指针,我们还可以通过“取类信息”命令获取类...

Global site tag (gtag.js) - Google Analytics