Java exception throw throws

‘Java exception throw throws’ CheckException和RuntimeException java文档中对RuntimeException的定义是: RuntimeException 是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。 可能在执行方法期间抛出但未被捕获的 RuntimeException 的任何子类都无需在 throws 子句中进行声明。 java中Exception分为两类,一类是CheckException一类是UncheckException。并且java的Error都属于UncheckedException。 一、CheckException和UnCheckException的区别: 在编译的时候,java编译器会强制你处理CheckException,处理的方式有两种: 一种是抛出异常;另一种是捕获异常 (常见的有ClassNotFoundException等) 。而对于UncheckException编译去则不需要你做任何处理,只是在运行时出现了该类异常,则会被抛出 (常见的有: NullPointException,ArrayIndexOutofBoundException等) 。 Checked exception用来指示一种调用方能够直接处理的异常情况。而Runtime exception则用来指示一种调用方本身无法处理或恢复的程序错误。 区别 throws是用来声明一个方法可能抛出的所有异常信息,而throw则是指抛出的一个具体的异常类型。此外throws是将异常声明但是不处理,而是将异常往上传,谁调用我就交给谁处理。 2.分别介绍 throws: 用于声明异常,例如,如果一个方法里面不想有任何的异常处理,则在没有任何代码进行异常处理的时候,必须对这个方法进行声明有可能产生的所有异常 (其实就是,不想自己处理,那就交给别人吧,告诉别人我会出现什么异常,报自己的错,让别人处理去吧) 。 格式是: 方法名 (参数) throws 异常类1,异常类2,….. Java代码 class Math{ public int div(int i,int j) throws Exception{ int t=i/j; return t; } } public class ThrowsDemo { public static void main(String args[]) throws Exception{ Math m=new Math(); System.out.println(“出发操作: “+m.div(10,2)); } } throw: 就是自己进行异常处理,处理的时候有两种方式,要么自己捕获异常 (也就是try catch进行捕捉) ,要么声明抛出一个异常 (就是throws 异常~~) 。注意: throw一旦进入被执行,程序立即会转入异常处理阶段,后面的语句就不再执行,而且所在的方法不再返回有意义的值! ...

2015-05-14 · 1 min · 150 words · -

JAVA JIT Compiler(Just-in-timeCompiler) 即时编译

‘JAVA JIT Compiler(Just-in-timeCompiler) 即时编译’ JIT Compiler(Just-in-timeCompiler) 即时编译 最早的Java建置方案是由一套转译程式 (interpreter) ,将每个Java指令都转译成对等的微处理器指令,并根据转译后的指令先后次序依序执行,由于一个Java指令可能被转译成十几或数十几个对等的微处理器指令,这种模式执行的速度相当缓慢。 针对这个问题,业界首先开发出JIT (just in time) 编译器。当Java执行runtime环境时,每遇到一个新的类别 (class: 类别是Java程式中的功能群组) ,JIT编译器在此时就会针对这个类别进行编译 (compile) 作业。经过编译后的程式,被优化成相当精简的原生型指令码 (native code) ,这种程式的执行速度相当快。花费少许的编译时间来节省稍后相当长的执行时间,JIT这种设计的确增加不少效率,但是它并未达到最顶尖的效能,因为某些极少执行到的Java指令在编译时所额外花费的时间可能比转译器在执行时的时间还长,针对这些指令而言,整体花费的时间并没有减少。 基于对JIT的经验,业界发展出动态编译器 (dynamiccompiler) ,动态编译器仅针对较常被执行的程式码进行编译,其余部分仍使用转译程式来执行。也就是说,动态编译器会研判是否要编译每个类别。动态编译器拥有两项利器: 一是转译器,另一则是JIT,它透过智慧机制针对每个类别进行分析,然后决定使用这两种利器的哪一种来达到最佳化的效果。动态编译器针对程式的特性或者是让程式执行几个循环,再根据结果决定是否编译这段程式码。这个决定不见得绝对正确,但从统计数字来看,这个判断的机制正确的机会相当高。事实上,动态编译器会根据「历史资料」做决策,所以程式执行的时间愈长,判断正确的机率就愈高。以整个结果来看,动态编译器产生的程式码执行的速度超越以前的JIT技术,平均速度可提高至50%。 http://baike.baidu.com/view/132440.htm?fromtitle=jit&fromid=2039740&type=syn

2015-02-05 · 1 min · 28 words · -

java vs javaw vs javaws

java vs javaw vs javaws http://javapapers.com/core-java/java-vs-javaw-vs-javaws/ This article gives an awareness tip. Do you know the difference between java, javaw and javaws tools. All these three are java application launchers. We know well about java.exe which we use quite often. Our command line friend, mostly we use it for convenience to execute small java programs. javaw is rare for us. Sometimes we have seen that in running application list in windows task manager. javaws is web start utility. ...

2015-01-22 · 3 min · 548 words · -

websocket

websocket https://docs.oracle.com/javaee/7/tutorial/doc/websocket.htm http://blog.csdn.net/chifengxin/article/details/14521093 https://www.ibm.com/developerworks/cn/web/1112_huangxa_websocket/ 如何理解 TCP/IP, SPDY, WebSocket 三者之间的关系? http://www.zhihu.com/question/20097129

2014-11-29 · 1 min · 10 words · -

java copy file

java copy file http://www.oschina.net/question/565065_58510 private static void nioTransferCopy(File source, File target) { FileChannel in = null; FileChannel out = null; FileInputStream inStream = null; FileOutputStream outStream = null; try { inStream = new FileInputStream(source); outStream = new FileOutputStream(target); in = inStream.getChannel(); out = outStream.getChannel(); in.transferTo(0, in.size(), out); } catch (IOException e) { e.printStackTrace(); } finally { close(inStream); close(in); close(outStream); close(out); } }

2014-11-27 · 1 min · 62 words · -

Java RandomAccessFile, MappedByteBuffer, mmap

Java RandomAccessFile, MappedByteBuffer, mmap RandomAccessFile RandomAccessFile是用来访问那些保存数据记录的文件的,你就可以用 seek() 方法来访问记录,并进行读写了。这些记录的大小不必相同;但是其大小和位置必须是可知的。但是该类仅限于操作文件。 RandomAccessFile不属于InputStream和OutputStream类系的。实际上,除了实现DataInput和DataOutput接口之外(DataInputStream和DataOutputStream也实现了这两个接口),它和这两个类系毫不相干,甚至不使用InputStream和OutputStream类中已经存在的任何功能;它是一个完全独立的类,所有方法(绝大多数都只属于它自己)都是从零开始写的。这可能是因为RandomAccessFile能在文件里面前后移动,所以它的行为与其它的I/O类有些根本性的不同。总而言之,它是一个直接继承Object的,独立的类。 基本上,RandomAccessFile的工作方式是,把DataInputStream和DataOutputStream结合起来,再加上它自己的一些方法,比如定位用的getFilePointer( ),在文件里移动用的seek( ),以及判断文件大小的length( )、skipBytes()跳过多少字节数。此外,它的构造函数还要一个表示以只读方式(“r”),还是以读写方式(“rw”)打开文件的参数 (和C的fopen( )一模一样)。它不支持只写文件。 只有RandomAccessFile才有seek搜寻方法,而这个方法也只适用于文件。BufferedInputStream有一个mark( )方法,你可以用它来设定标记(把结果保存在一个内部变量里),然后再调用reset( )返回这个位置,但是它的功能太弱了,而且也不怎么实用。 RandomAccessFile的绝大多数功能,但不是全部,已经被JDK 1.4的nio的"内存映射文件(memory-mapped files)“给取代了,你该考虑一下是不是用"内存映射文件"来代替RandomAccessFile了。 import java.io.IOException; import java.io.RandomAccessFile; public class TestRandomAccessFile { public static void main(String[] args) throws IOException { RandomAccessFile rf = new RandomAccessFile(“rtest.dat”, “rw”); for (int i = 0; i < 10; i++) { //写入基本类型double数据 rf.writeDouble(i * 1.414); } rf.close(); rf = new RandomAccessFile(“rtest.dat”, “rw”); //直接将文件指针移到第5个double数据后面 rf.seek(5 * 8); //覆盖第6个double数据 rf.writeDouble(47.0001); rf.close(); rf = new RandomAccessFile(“rtest.dat”, “r”); ...

2014-11-12 · 3 min · 520 words · -

spring quartz

spring quartz http://www.oschina.net/question/8676_9032 <ref bean="testTrigger"/> </list> </property> <property name="autoStartup" value="true"/> 说明: Scheduler包含一个Trigger列表,每个Trigger表示一个作业。 2、Trigger的配置 说明: Cron表达式的格式: 秒 分 时 日 月 周 年(可选)。 字段名 允许的值 允许的特殊字符 秒 0-59 , - * / 分 0-59 , - * / 小时 0-23 , - * / 日 1-31 , - * ? / L W C 月 1-12 or JAN-DEC , - * / ...

2014-11-07 · 1 min · 183 words · -

原子操作

原子操作 CAS(Compare And Swap/Set) Fetch And Add Test And Set 原子操作-无锁多线程编程 翻译:Xiaobo 原文链接: Lock-free multithreading with atomic operations 推荐:之前读《程序员的自我修养》一书中有关于多线程的讲解非常好;但最近读到这几篇文章对于多线程的讲解,个人认为比前者(书)更加的清晰、易懂、全面。每篇文章的内容安排也很合理,非常感谢作者TRIANGLES和他优秀的文章,这里是他的个人站点。 相关系列译文 「译文」带你慢慢的了解多线程 「译文」线程同步 「译文」原子操作-无锁多线程编程 (本篇) 「译文」内存重排对无锁多线程的影响 译文正文部分 在希腊语中,原子 (ἄτομος; atomos) 的意思是不可切割。当计算机执行的每个任务无法再细分的时候(无法拆分为更小的子任务),这就是一个原子的任务。 在多线程编程中,原子是一个重要的属性:因为原子操作不可再细分,一个线程就无法闯入到另一个线程正在执行的原子操作中。假如,写入数据操作是原子的,那么其他线程就无法在另一个线程写入未完成的时候进行数据读取。反过来,读取数据也一样。换句话说,原子操作中,不存在数据竞争。 前一篇内容中,已经介绍了所谓的同步原语的概念,还有常见的实现线程同步的工具。它们也经常被用来在多线程中提供原子操作。但实现的方式仅仅是让单线程访问,阻塞其他线程,直到第一个线程完成操作。基于它们有能力冻结线程,同步原语也被称为阻塞机制。 前一篇提到的阻塞机制,在大部分情况下都能很好的工作。只有使用正确,它们也是可靠和快速的。然后,它们也有一些缺点需要注意: 1、休眠的线程除了等待,什么也做不了。 2、它们可以挂起你的应用程序——如果一个持有同步原语锁的线程由于某种原因崩溃,锁本身将永远不会被释放,等待的线程将永远被卡住; 3、开发者无法控制哪些线程将被休眠——一般这是被操作系统控制的,这就有可能引发优先级反转:执行重要任务的线程被迫等待那些执行不重要任务的线程。 大部分情况下,你可能也不会关心这些问题,因为它们似乎不会影响程序执行的正确性。但也有可能,为了充分利用多核 CPU,让一些线程一直保持运行也是可行的,此时如果因为优先级反转而引起系统假死,这就是个大问题了。 无锁编程 好消息是:我们还有其他方式控制多线程的并发任务。这个方式就是无锁编程,这是一种不使用锁机制来保证多线程安全的技术。 坏消息是:这是一种很底层的方式,这种方式,离硬件更近了一步。同时,使用无锁编程是对自己的智力挑战,也是我们了解计算机到底如何工作的好机会。 无锁编程依赖原子指令,这些原子指令是直接被 CPU 执行的。所以,我们需要先了解一些原子指令,然后我会告诉你如何使用这些执行进行并发控制。 什么是原子指令 当计算机显示一张图片到屏幕上的时候,实际上是由若干子任务组成:从存储单元中读取图片,解码图片,渲染像素点等等…,如果我们再放大每个子任务去看,每个子任务又能划分出更多的子任务。一直拆分到最小,对人类可见的被处理器直接执行的操作叫“机器指令”。下图中,虚线框属于软件层,实线框属于硬件层: 不同的 CPU 架构中,都有各自不同的机器指令,其中有些机器指令是原子的,这些指令的执行是单独的,不能分割,也不能被打断。也有一些指令不是原子的:这些指令在执行的时候,会被处理器在划分为多个更细微的操作在后台执行,也被称为微操作(micro-operations) ;我们暂时把焦点放到前边那一类,即原子指令上。原子指令可以分类两个大类: 1、存储/装载指令 (store-load) 2、RMW 指令 (read-modify-write) 存储装载原子指令 (store-load) 这些指令被用来从内存中存储和读取(装载)数据。大多数的 CPU 架构在设计时,都会确保这些操作在一些特定情况下是原子操作。比如基于 X86 架构实现的处理器,都会有MOV指令,用来从内存中读取字节数据交于 CPU,如果对字节对齐(aligned data) 的数据执行MOV操作,CPU 就会确保该操作是原子的。(aligned data:存储在内存中的信息,方便CPU轻松快速的读取)。 RMW (read-modify-write) 原子指令 一些复杂点的操作,仅仅通过存储和读取是无法完成的,比如自增操作(++x),至少需要 3个存储和读取的原子指令,这就会整个操作变的非原子化 。RMW 原子指令正是用来填补这种问题,它能让多次复杂操作变为一整个原子操作。这类指令非常多。一些 CPU 架构实现了它们,主要的分类如下,其他的都是这些指令的子集: ...

2014-08-20 · 2 min · 326 words · -

语法糖

语法糖 语法糖 (Syntactic sugar) ,也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达 (Peter J. Landin) 发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。 举个例子: 在C语言里用a[i]表示*(a+i),用a[i][j]表示*(*(a+i*数组a第二维的长度)+j),看来语法糖不是"现代语言"才有啊,连我们的老大哥C也有,而且这种写法简洁明了,也更好懂了。 实际上从面向过程到面向对象也是一种语法糖啊,C语言可以通过它的指针、类型转换,结构实现面向对象的编程风格,但是C++更进一步的推广了这种风格,更好用了,不过到了C#把OO的风格发挥得淋漓尽致。OO的编程风格对于面向过程来说是不是一种语法糖呢?如果生硬地照此理解,只有计算机硬件指令才不算语法糖,而其他一切利用编译器、汇编器将代码抽象,和自然语言更相近的手段都算语法糖。 现在很多很多编程思想,编程理论层出不穷,当然,对于学习来说我们是要抓住技术的核心,但对于工程来说如何提高工程质量,如何提高工程效率也是我们要关注的,既然这些语法糖能辅助我们以更好的方式编写代码为什么要"抵制"呢? 我想语法糖和其他编程思想一样重要,什么duck type,人本接口,最小接口,约定优于配置,其实不都是一些思想上的"语法糖"? 不过也并不是没有反对的声音,这其中就有图灵奖的第一个获得者: Alan Perlis。.net从2.0到3.0到3.5底层CLR并没有做更新,没有添加任何新的IL指令,所以C#从2.0到3.0中所有的特性都是语法糖,就算从1.0到2.0,也只有一个泛型不是语法糖,其余的新特性也都是如此,但是每一次C#发布新特性的时候我们不得不为之而鼓舞,为之而喝彩。新的语法可以酿造更好的编程风格,以前一些难以实现的方面现在也轻而易举了。 需要声明的是"语法糖"这个词绝非贬义词,它可以给我带来方便,是一种便捷的写法,编译器会帮我们做转换;而且可以提高开发编码的效率,在性能上也不会带来损失。

2014-08-10 · 1 min · 19 words · -

闭包, closure

闭包, closure 何为闭包 闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数+引用环境) 闭包(Closure) 是一种函数(或函数和其相关的变量环境的组合),它不仅包含函数的定义,还“记住”了创建该函数时的 作用域中的变量。 通俗解释: 闭包就是一个函数 “带着”它所需要的外部变量一起打包起来使用。即使这些外部变量在函数外部已经不存在了,闭包仍然可以访问它们。 函数嵌套:闭包一定是函数内部的函数。 访问外部变量:内部函数访问了外部函数的局部变量。 变量生命周期延长:被闭包引用的外部变量不会在外部函数结束后立即销毁。 java内部类 wiloon.com/inner-class golang 闭包 func outer() func() int { x := 0 return func() int { x++ return x } } Javascript function outer() { let count = 0; return function inner() { count++; console.log(count); }; } const counter = outer(); counter(); // 输出 1 counter(); // 输出 2 python def outer(): x = 10 def inner(): print(x) return inner f = outer() f() # 输出 10 我们知道这个返回的闭包中包含了 Add 函数中提供的变量 y (也就是闭包产生的环境) 也就是说这个闭包包含了函数本身,以及一个对局部变量y的引用。 这里特别需要注意的一点是,如果y是定义在函数Add的调用栈里的一个变量,那么当Add()函数被调用完毕后,y就销毁了,这时候再用原来的指针去访问y就会出问题,因此这里就出现了一个原则: 闭包中引用的外部变量必须是在堆上分配的 实际上Go的编译器在处理到这个闭包时,会使用escape analyze来识别变量y的作用域,当发现变量y被一个闭包所引用时,就会把y转移到堆中 (这一过程称为变量逃逸)。 总结一下,闭包从底层理解,就是函数本身和其所需外部变量的引用,用R大的话来形容闭包的创建过程就是: ...

2014-08-10 · 5 min · 968 words · -

MQ JMS

MQ JMS http://blog.csdn.net/xyw_blog/article/details/9128165 MQ简介: MQ全称为Message Queue, 消息队列 (MQ) 是一种应用程序对应用程序的通信方法。应用程序通过写和检索出入列队的针对应用程序的数据 (消息) 来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。其中较为成熟的MQ产品有IBMWEBSPHERE MQ。 MQ特点: MQ的消费-生产者模型的一个典型的代表,一端往消息队列中不断的写入消息,而另一端则可以读取或者订阅队列中的消息。MQ和JMS类似,但不同的是JMS是SUN JAVA消息中间件服务的一个标准和API定义,而MQ则是遵循了AMQP协议的具体实现和产品。 使用场景: 在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。 JMS简介: JMS即Java消息服务 (Java Message Service) 应用程序接口是一个Java平台中关于面向消息中间件 (MOM) 的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。 定义: JMS (Java Messaging Service) 是Java平台上有关面向消息中间件(MOM)的技术规范,它便于消息系统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发,翻译为Java消息服务。 简介: JMS是一种与厂商无关的 API,用来访问消息收发系统消息。它类似于JDBC(Java DatabaseConnectivity): 这里,JDBC 是可以用来访问许多不同关系数据库的 API,而 JMS 则提供同样与厂商无关的访问方法,以访问消息收发服务。许多厂商目前都支持JMS,包括 IBM 的 MQSeries、BEA的 Weblogic JMS service和 Progress 的 SonicMQ,这只是几个例子。 JMS 使您能够通过消息收发服务 (有时称为消息中介程序或路由器) 从一个 JMS 客户机向另一个JMS客户机发送消息。消息是 JMS 中的一种类型对象,由两部分组成: 报头和消息主体。报头由路由信息以及有关该消息的元数据组成。消息主体则携带着应用程序的数据或有效负载。根据有效负载的类型来划分,可以将消息分为几种类型,它们分别携带: 简单文本(TextMessage)、可序列化的对象 (ObjectMessage)、属性集合 (MapMessage)、字节流 (BytesMessage)、原始值流 (StreamMessage),还有无有效负载的消息 (Message)。 JMS和MQ的关系: JMS是一个用于提供消息服务的技术规范,它制定了在整个消息服务提供过程中的所有数据结构和交互流程。而MQ则是消息队列服务,是面向消息中间件 (MOM) 的最终实现,是真正的服务提供者;MQ的实现可以基于JMS,也可以基于其他规范或标准。 支持JMS的开源MQ: 目前选择的最多的是ActiveMQ。 ...

2014-06-11 · 1 min · 178 words · -

JSR168

JSR168 JSR168是Java 规范要求 (Java Specification Request ,JSR) 的缩写,它为创建Portlet建立标准的API。很多重量级的Portal开发商和开源项目组参与了Java标准化组织 (Java Community Process) 创建JSR168标准的过程,并且很多Portal产品开始支持JSR 168。JSR168在2003年10月正式发布。最主要的Portal开发商已经宣布计划支持JSR 168标准,查看JSR 168站点 (http://www.jcp.org/en/jsr/detail?id=168 ) 可以得到目前为止JSR 168支持者的完整列表。 按照Java标准化组织 (Java Community Process) 所述,JSR 168 portlet拥有一个适用于所有Portal客户端的简单的、标准的API,支持多种类型的客户端 (多设备、多浏览器) ,支持本地化和国际化,允许门户应用程序的热部署和重新部署,并且包含声明性安全 (与servlet和企业JavaBean规范中使用的机制相同) 。 现在开发商只需要支持一种Portlet集。结果,更多的ISV提供他们自己的通用的、开箱即用 (out-of-the-box) 的Portal集成构件。这是值得客户高兴的时刻,因为开箱即用的应用程序集成现在无需考虑选择那个Portal开发商就可以使用。 JSR 168意味着在Portal市场上,争夺主导地位的优势不再是哪个开发商拥有最多数目ISV的开箱即用集成。相反,标准化通过使ISV支持他们自己的Porlet统一了这一领域。客户的风险和成本降低,并且不再根据重建Portlet的业务量来选择门户开发商。在选择Portal开发商的时候,主要的决定性因素将是Portal产品与客户企业体系结构的适应程度。 对程序员简而言之,开发符合JSR168规范的Portlet将可以顺利移植到符合该规范的不同Portal平台上!

2014-06-11 · 1 min · 36 words · -

isAssignableFrom

isAssignableFrom isAssignableFrom 是用来判断一个类Class1和另一个类Class2是否相同或是另一个类的超类或接口。 通常调用格式是 Class1.isAssignableFrom(Class2) 调用者和参数都是 java.lang.Class 类型。 而 instanceof 是用来判断一个对象实例是否是一个类或接口的或其子类子接口的实例。 格式是: oo instanceof TypeName 第一个参数是对象实例名,第二个参数是具体的类名或接口名,例如 String,InputStream。 用下面的代码进行测试,我们就可以发现他们的不同之处

2014-06-09 · 1 min · 18 words · -

Java转型(向上或向下转型)upcast)和向下转型(downcast)

Java转型(向上或向下转型)upcast)和向下转型(downcast) 在Java编程中经常碰到类型转换,对象类型转换主要包括向上转型和向下转型。 5.13.1 向上转型 我们在现实中常常这样说: 这个人会唱歌。在这里,我们并不关心这个人是黑人还是白人,是成人还是小孩,也就是说我们更倾向于使用抽象概念"人"。再例如,麻雀是鸟类的一种 (鸟类的子类) ,而鸟类则是动物中的一种 (动物的子类) 。我们现实中也经常这样说: 麻雀是鸟。这两种说法实际上就是所谓的向上转型,通俗地说就是子类转型成父类。这也符合Java提倡的面向抽象编程思想。来看下面的代码: package a.b; public class A { public void a1() { System.out.println(“Superclass”); } } A的子类B: package a.b; public class B extends A { public void a1() { System.out.println(“Childrenclass”); //覆盖父类方法 } public void b1(){} //B类定义了自己的新方法 } C类: package a.b; public class C { public static void main(String[] args) { A a = new B(); //向上转型 a.a1(); } } 如果运行C,输出的是Superclass 还是Childrenclass?不是你原来预期的Superclass,而是Childrenclass。这是因为a实际上指向的是一个子类对象。当然,你不用担心,Java虚拟机会自动准确地识别出究竟该调用哪个具体的方法。不过,由于向上转型,a对象会遗失和父类不同的方法,例如b1()。有人可能会提出疑问: 这不是多此一举吗?我们完全可以这样写: B a = new B(); a.a1(); 确实如此!但这样就丧失了面向抽象的编程特色,降低了可扩展性。其实,不仅仅如此,向上转型还可以减轻编程工作量。来看下面的显示器类Monitor: package a.b; public class Monitor{ ...

2014-05-30 · 3 min · 438 words · -

Meson

Meson 一、什么是Meson Meson(The Meson Build System)是个项目构建系统,如Makefile,automake,CMake…。Meson是一个Python实现的开源项目,其思想是,开发人员花费在构建调试上的每一秒都是浪费,同样等待构建过程直到真正开始编译都是不值得的。 因此,Meson的设计目的是在用户友好的同时不损害性能,Meson提供客户语言(custom language)作为主要工具,用户可以使用它完成项目构建的描述。客户语言的设计目标是简单(simplicity)、清晰(clarity)、简洁(conciseness),其中很多灵感来源于Python语言。 Meson的另个一主要设计目的是为现代编程工具提供优秀的支持和最好的实现。这包括一些特性如:单元测试(unit testing)、代码覆盖率报告(code coverage reporting)、头文件预编译(precompiled headers)。用户不需要寻找三方宏指令(third party macros)或编写shell脚本来实现这些特性,Meson只要开箱即用(work out of the box)。 二、Meson有什么特点 对Linux,macOS,Windows,GCC,Clang,Visual Studio等提供多平台支持 支持的语言包括C,C ++,D,Fortran,Java,Rust 在非常易读且用户友好的非图灵完整DSL中构建定义 适用于许多操作系统和裸机的交叉编译 针对极快的完整和增量构建进行了优化,而不会牺牲正确性 内置的多平台依赖提供程序,可与发行版软件包一起使用 好玩! ———————————————— 版权声明:本文为CSDN博主「espresso_yu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/u010074726/article/details/108695256

2014-05-26 · 1 min · 34 words · -

Java写xml文件的编码问题

Java写xml文件的编码问题 http://itindex.net/detail/49012-java-xml-%E6%96%87%E4%BB%B6 最近项目中需要生成xml格式的配置文件,用的是 javax.xml.transform.Transformer 类中提供的transform方法,在本地执行没问题,但是一旦把工程部署到Tomcat下运行,就会出现中文乱码的现象,纠结了许久,在大神的帮助下终于解决了。 有篇文章其实已经讲的很清楚了,链接如下: http://www.cnblogs.com/yunmou/archive/2013/02/19/2917646.html 但是按照他给的方法还是不行,问题就出在 OutputStreamWriter osw = new OutputStreamWriter(fos); // 注意。。。 这一行,作者虽然加了注意,但没说明怎么办,让我更加迷惑。 最后查了若干资料,发现确实是需要在这个地方进行注意。 最终代码如下: Source source = new DOMSource((Document) obj); // Create a new Transformer that performs a copy of the Source to the Result. TransformerFactory transFactory = TransformerFactory.newInstance(); Transformer transFormer = transFactory.newTransformer(); transFormer.setOutputProperty(OutputKeys.ENCODING, “UTF-8”); transFormer.setOutputProperty(OutputKeys.METHOD, “xml”); transFormer.setOutputProperty(OutputKeys.INDENT, “no”); OutputStreamWriter outputStreamWriter = new OutputStreamWriter( new FileOutputStream(path), “UTF-8”); Result xmlResult = new StreamResult(outputStreamWriter); // Transform the XML Source to a Result. ...

2014-05-26 · 1 min · 77 words · -

java 自定义异常, customized exception

java 自定义异常, customized exception 编写自定义异常类的模式 编写自定义异常类实际上是继承一个API标准异常类,用新定义的异常处理信息覆盖原有信息的过程。常用的编写自定义异常类的模式如下: public class CustomException extends Exception { //或者继承任何标准异常类 public CustomException() {} //用来创建无参数对象 public CustomException(String message) { //用来创建指定参数对象 super(message); //调用超类构造器 } } 当然也可选用Throwable作为超类。其中无参数构造器为创建缺省参数对象提供了方便。第二个构造器将在创建这个异常对象时提供描述这个异常信息的字符串,通过调用超类构造器向上传递给超类,对超类中的toString()方法中返回的原有信息进行覆盖。 来讨论一个具体例子。假设程序中需要验证用户输入的表示年龄的数据必须是正整数值。我们可以按照以上模式编写这个自定义异常类如下: public class NegativeAgeException extends Exception { //或者: extends Throwable public NegativeAgeException() {} public NegativeAgeException(String message) { super(message); } } 下面是应用这个自定义异常类的例子: //完整程序存在本书配套资源目录为Ch11中名为NegativeAgeExceptionTest.java … try{ String ageString = JOptionPane.showInputDialog(“Enter your age: “); if (Integer.parseInt(ageString) < 0) throw new NegativeAgeException(“Please enter a positive age”); else JOptionPane.showMessageDialog(null, ageString, “Age”, 1); } catch(NegativeAgeException e){ ...

2014-05-22 · 1 min · 172 words · -

java version

java version Java class file format major version numbers Java 1.2 uses major version 46 Java 1.3 uses major version 47 Java 1.4 uses major version 48 Java 5 uses major version 49 Java 6 uses major version 50 Java 7 uses major version 51 Java 8 uses major version 52 Java 9 uses major version 53 Java 10 uses major version 54 Java 11 uses major version 55 Java 12 uses major version 56 Java 13 uses major version 57 Java 14 uses major version 58 Java 15 uses major version 59 Java 16 uses major version 60 Java 17 uses major version 61

2014-05-13 · 1 min · 105 words · -

instanceof

instanceof Java中的instanceof关键字是一个二元操作符,和==,>,<是同一类东西。由于它是由字母组成的,所以也是Java的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据。举个例子: String s = "I AM an Object!"; boolean isObject = s instanceof Object; 我们声明了一个String对象引用,指向一个String对象,然后用instancof来测试它所指向的对象是否是Object类的一个实例,显然,这是真的,所以返回true,也就是isObject的值为True。 instanceof有一些用处。比如我们写了一个处理账单的系统,其中有这样三个类: public class Bill {//省略细节} public class PhoneBill extends Bill {//省略细节} public class GasBill extends Bill {//省略细节} 在处理程序里有一个方法,接受一个Bill类型的对象,计算金额。假设两种账单计算方法不同,而传入的Bill对象可能是两种中的任何一种,所以要用instanceof来判断: public double calculate(Bill bill) { if (bill instanceof PhoneBill) { //计算电话账单 } if (bill instanceof GasBill) { //计算燃气账单 } … } 这样就可以用一个方法处理两种子类。 然而,这种做法通常被认为是没有好好利用面向对象中的多态性。其实上面的功能要求用方法重载完全可以实现,这是面向对象变成应有的做法,避免回到结构化编程模式。只要提供两个名字和返回值都相同,接受参数类型不同的方法就可以了: public double calculate(PhoneBill bill) { //计算电话账单 } public double calculate(GasBill bill) { //计算燃气账单 } 所以,使用instanceof在绝大多数情况下并不是推荐的做法,应当好好利用多态。 http://rodney.cnblogs.com/archive/2005/08/18/instanceof.html instanceof 判断对象类型 当在程序中执行向下转型操作时,如果父类对象不是子类对象的实例,就会发生ClassCastException异常,所以在执行向下转型之前需要养成一个良好习惯,就是判断父类对象是否为子类对象的实例。这个判断通常使用instanceof操作符来完成。可以使用instanceof操作符判断是否一个类实现了某个接口 (接口会在10.6节中进行介绍) ,也可以用它来判断一个实例对象是否属于一个类。 instanceof的语法格式如下: myobject instanceof ExampleClass ...

2014-05-09 · 1 min · 154 words · -

System.load 和 System.loadLibrary

System.load 和 System.loadLibrary http://blog.csdn.net/ring0hx/article/details/3242245 System.load 和 System.loadLibrary详解 1.它们都可以用来装载库文件,不论是JNI库文件还是非JNI库文件。在任何本地方法被调用之前必须先用这个两个方法之一把相应的JNI库文件装载。 2.System.load 参数为库文件的绝对路径,可以是任意路径。 例如你可以这样载入一个windows平台下JNI库文件: System.load(“C://Documents and Settings//TestJNI.dll”);。 System.loadLibrary 参数为库文件名,不包含库文件的扩展名。 例如你可以这样载入一个windows平台下JNI库文件 System. loadLibrary (“TestJNI”); 这里,TestJNI.dll 必须是在java.library.path这一jvm变量所指向的路径中。 可以通过如下方法来获得该变量的值: System.getProperty(“java.library.path”); 默认情况下,在Windows平台下,该值包含如下位置: 和jre相关的一些目录 程序当前目录 Windows目录 系统目录 (system32) 系统环境变量path指定目录 4.如果你要载入的库文件静态链接到其它动态链接库,例如TestJNI.dll 静态链接到dependency.dll, 那么你必须注意: 如果你选择 System.load(“C://Documents and Settings// TestJNI.dll”); 那么即使你把dependency.dll同样放在C://Documents and Settings//下,load还是会因为找不到依赖的dll而失败。因为jvm在载入TestJNI.dll会先去载入TestJNI.dll所依赖的库文件dependency.dll,而dependency.dll并不位于java.library.path所指定的目录下,所以jvm找不到dependency.dll。 你有两个方法解决这个问题: 一是把C://Documents and Settings//加入到java.library.path的路径中,例如加入到系统的path中。二是先调用 System.load(“C://Documents and Settings// dependency.dll”); 让jvm先载入dependency.dll,然后再调用System.load(“C://Documents and Settings// TestJNI.dll”); 如果你选择 System. loadLibrary (“TestJNI”); 那么你只要把dependency.dll放在任何java.library.path包含的路径中即可,当然也包括和TestJNI.dll相同的目录。

2014-04-14 · 1 min · 59 words · -