入门篇:Javascript
作者:matrixkey 日期:2010-07-15
在上一篇日志里,提到许多专业技术名称。而其实,熟悉它们并不难,只要你有了一定的编程思想,学习新的技术非常容易入门。
今天介绍Javascript。
为了减少多余的工作量,这里不再赘述各种概念。
首先,Javascript是网络的脚本语言(脚本语言是一种轻量级的编程语言)。
它不同于Java,Java(由太阳微系统公司开发)很强大,同时也是更复杂的编程语言,就像同级别的 C 和 C++。
Javascript在HTML页面中的位置
位于 head 部分的脚本:
当脚本被调用时,或者当事件被触发时,脚本就会被执行。当你把脚本放置到 head 部分后,就可以确保在需要使用脚本之前,它已经被载入了。
- <html>
- <head>
- </head>
- <body>
- <script type="text/javascript">
- ....
- </script>
- </body>
- </html>
位于 body 部分的脚本:
在页面载入时脚本就会被执行。当你把脚本放置于 body 部分后,它就会生成页面的内容。
- <html>
- <head>
- </head>
- <body>
- <script type="text/javascript">
- ....
- </script>
- </body>
- </html>
知道了放置Javascript的位置之后,我们可以体验一下简单的Javascript!
- <html>
- <head>
- </head>
- <body>
- <script type="text/javascript">
- document.write("你好,我是Matrixkey!");
- </script>
- </body>
- </html>
根据 Javascript 标准,分号是可选的,浏览器把行末作为语句的结尾。
不过大多数人都认为在每行语句的结尾加上一个分号,是一个好的编程习惯。
Javascript 注释
和C#一样,单行的注释以 // 开始,多行注释以 /* 开头,以 */ 结尾。
- <html>
- <head>
- </head>
- <body>
- <script type="text/javascript">
- // 这行代码输出Matrixkey:
- document.write("Matrixkey");
- /* 第一行输出1798
- 第二行输出4772 */
- document.write("<p>This is a paragraph</p>");
- document.write("<p>This is another paragraph</p>");
- </script>
- </body>
- </html>
实验13(文件更新)
作者:matrixkey 日期:2009-06-12
回寝室折腾到10点
丁帅老师布置的实验13所要求的功能全部完成
至此,深刻体会了公共类和CONFIG文件的牛B之处
我靠要是晓得还能这样写程序我还至于傻傻一句一句琢磨么
再次膜拜,并且!
浅显地认识到了写代码之前流程和结构的规划的重要性
什么叫面向对象?
李三,李二,李曼祖孙三代
面向对象就是修改了李三的姓氏比如改成奥特
李二,李曼自动变成奥特二,奥特曼
可见公安局户籍管理工作全是面向过程操作啊
改了爷爷的姓氏,还得改老爸和儿子的姓氏
恩,今天这个比喻很有模范作用

不断地忙,忙到累忙到困,累了困了就睡觉。
不思考,不发呆,不给上帝发笑的机会。
也不给自己痛的机会。
PS,经蒋梁提醒,订单管理部分界面不符要求,重做上传
JAVA实现:螺旋输出矩阵
作者:matrixkey 日期:2009-04-03
那天写完日志后想了想,觉得实现某方法通用于任意数组螺旋输出可能并不成立。上午上课的时候蒋梁同学说题目应该是矩阵,不是数组。
这立马让题目简单了很多,事实上我那时还不确定,是否存在这样一个函数,能够让任意数组螺旋输出。但是矩阵的话,我非常的确定,肯定存在这样一个函数。
课堂上。
我们以一个4阶矩阵作为实例来模拟...
JAVA实现:螺旋输出二维数组
作者:matrixkey 日期:2009-03-30
答案C#版本
作者:matrixkey 日期:2008-12-11
设计题目:输入10个学生5门课的成绩,分别用函数求:(1)每个学生的平均分;(2)每门课的平均分;(3)找出最高的分数所对应的学生和课程。
要求:定义一函数input( ),用做输入10个学生的成绩;
定义一函数aver1( ),用做计算每个学生的平均分;
定义一函数aver2( ),用做计算每门课程的平均分;
定义一函数highest( ),找出最高分数及对应的学生和课程;
在main( )函数中调用以上函数。
用普通变量做参数和用数组做参数,特别是二维数组,题目的难度马上就增加了。调试了许久,答案终于出来了,好心的独行侠也把那100分给了我,虽然我是用C#做的。
鉴于我这里无法编译C和C++,他特地发了个Turbo C&C++ 过来,软件很小,界面很DOS。。好在是汉化的,用来也很不错,没有.NET那样的繁琐。先睡一觉,晚上改C。
下午的时候网站服务器出了问题,频繁无法连接,晚上正常了。
| static void Main(string[] args) { input(); } /*输入10个学生5门课程的成绩*/ static void input() { int[,] info = new int[10, 6]; for (int i = 0; i < info.GetLength(0); i++) { Console.Write("输入学号:"); info[i, 0] = int.Parse(Console.ReadLine()); for (int j = 1; j < info.GetLength(1); j++) { Console.Write("输入第{0}门课程的成绩:", j); info[i, j] = int.Parse(Console.ReadLine()); } } Console.WriteLine(); int h = highest(info); Console.WriteLine(); double a1 = aver1(info); Console.WriteLine(); double a2 = aver2(info); } /* 最高分*/ static int highest(int[,] info) { int mat = info[0, 1]; for (int i = 0; i < info.GetLength(0); i++) { for (int j = 1; j < info.GetLength(1); j++) { if (info[i, j] > mat) mat = info[i, j]; } } Console.WriteLine("最高分是:{0}", mat); return mat; } /*每个学生的平均分*/ static double aver1(int[,] info) { double sum = 0; double aver1 = 0; for (int i = 0; i < info.GetLength(0); i++) { for (int j = 1; j < info.GetLength(1); j++) { sum = (sum + info[i, j]); aver1 = sum / (info.GetLength(1) - 1); } Console.WriteLine("学号为{0}的学生,课程平均分为:{1}", info[i, 0], aver1); sum = 0; aver1 = 0; } return aver1; } /*每门课程的平均分*/ static double aver2(int[,] info) { double sum = 0; double aver2 = 0; for (int i = 1; i < info.GetLength(1); i++) { for (int j = 0; j < info.GetLength(0); j++) { sum = info[j, i] + sum; aver2 = sum / info.GetLength(0); } Console.WriteLine("第{0}门课程的平均分为:{1}", i, aver2); sum = 0; aver2 = 0; } return aver2; } |
一直用FCKeditor 编辑而不是UBB,让我最头疼的是没有代码高亮,晚上尝试一下,动手添加代码高亮功能,如果还能代码折叠,行数显示那就更好了。
趣题:如何把输出赋值给变量
作者:matrixkey 日期:2008-12-10
最近迷上百度知道的回答,不得不说,“百度知道”是一个非常成功的板块,就像更加人性化的BBS式的搜索引擎。今天看到一位高达7级的萬裏獨行俠,提了一个比较低端的问题,并且悬赏100分,好事啊,趁着夜深人静赶紧解决了拿分。
但是最后我懂了个道理,简单和复杂就在一线之间啊。。。。
他的题目是:
设计题目:输入10个学生5门课的成绩,分别用函数求:(1)每个学生的平均分;(2)每门课的平均分;(3)找出最高的分数所对应的学生和课程。
要求:定义一函数input( ),用做输入10个学生的成绩;
定义一函数aver1( ),用做计算每个学生的平均分;
定义一函数aver2( ),用做计算每门课程的平均分;
定义一函数highest( ),找出最高分数及对应的学生和课程;
在main( )函数中调用以上函数。
刚看题目,眼睛一瞟,喜滋滋地想这100分不拿不爽啊。立马在.NET上模拟着写。但是马上出问题了!
| static void Main(string[] args) { input(); } /*函数input:输入3个学生成绩*/ static void input() { Console.Write("输入3个数据:"); int a = int.Parse(Console.ReadLine()); int b = int.Parse(Console.ReadLine()); int c = int.Parse(Console.ReadLine()); Console.WriteLine("{0},{1},{2}",a,b,c); } |
上面代码片段的运行结果显而易见,在main函数中调用input函数,假设我们输入的是1,3,9,则输出1,3,9。接下来,问题就出现了。当我们自定义了求平均的aver1函数,就会发现在main函数中调用aver1函数时,不知该参数该从哪里获得。意思就是在main函数里的input();之后,如果我们调用aver1()函数,则必须根据定义aver1()函数时的参数表,给出相应的参数。请看:
|
static void Main(string[] args) |
我们知道调用aver1()时应该放入的参数,是调用input()时输出的参数a,b,c,但是由于a,b,c都是input函数体中的局部变量,无法在main函数中使用。所以就想到:如何把输出赋值给变量?
只要把输出的a,b,c赋值给main函数中的变量,那么aver1函数圆括号里需要的参数就有了。
问题是有了,答案还没有找到 =。= 在CSDN论坛上发帖求助,明天应该会有人解决,睡吧~
洗把脸一看论坛,发现问题解决了。
| static void Main(string[] args) { int a, b, c; input(out a, out b, out c); aver1(a, b, c); } static void input(out int a, out int b, out int c) { Console.Write("输入3个数据:"); a = int.Parse(Console.ReadLine()); b = int.Parse(Console.ReadLine()); c = int.Parse(Console.ReadLine()); Console.WriteLine("{0},{1},{2}",a,b,c); } void aver1(int x,int y,int z) { double m; int a = x; int b = y; int c = z; m = (a + b + c)/3; Console.WriteLine(m); } |
学习了!另外还多了一种思路:并不是”一件事件“都得拆成“几个函数”来实现
这句话在编写程序过程中最佳体现就是这样:
| static void input() { Console.Write("输入3个数据:"); int a = int.Parse(Console.ReadLine()); int b = int.Parse(Console.ReadLine()); int c = int.Parse(Console.ReadLine()); Console.WriteLine("{0},{1},{2}",a,b,c); aver1(a, b, c); } |
为了参数的简单化,将aver1函数在input函数中调用,所得结果与前面的一样。好思路!
JAVA语言速成手册(四):异常处理(比较特殊)
作者:matrixkey 日期:2008-11-27
将异常处理独立成一篇日志的用意是,在看这篇日志前就隐约明白这个知识点的重要性。
事实上,2个小时之前,这篇日志的第一句话是:任何知识,总是越学越觉得自己肤浅。
刚刚保存日志为草稿失败,辛苦了2个小时的东西,很优雅地不见了。没有被干败,卯足劲重新写。好吧我承认我在心里偷偷擦眼泪。
什么是异常?
“异常”是在程序运行过程中发生的异常事件,比如除0溢出、数组越界、文件找不到,空指针等,这些事件的发生将阻止程序的正常运行。为了加强程序的健壮性,程序设计时,必须考虑到可能发生的异常事件并做出相应的处理。
什么是异常处理机制?
在C语言中,通过使用if语句来判断是否出现了异常,同时调用函数,通过被调用函数的返回值,感知在被调用函数中产生的异常事件并进行处理。这就是种异常处理机制。
异常处理机制是指当程序出现错误后,程序如何处理。具体来说,异常机制提供了程序退出的安全通道。当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器。
传统异常处理方法是什么样的?
传统的处理异常的办法,就像上面提到的,函数返回一个特殊的结果来表示出现异常,调用该函数的程序负责检查并分析函数返回的结果。但是这样做有这样一个弊端:我们假设函数返回-1代表出现异常,但是如果函数要返回的值很恰巧的正好是-1时就会出现混淆。返回了-1,到底是异常,还是正常?
JAVA中异常处理的方法是什么样的?
Java通过面向对象的方法来处理异常,这是一种新的处理方法。
在概念上,java中异常处理的流程是这样的:在一个方法的运行过程中,如果发生了异常,则这个方法生成一个代表该异常的对象,并把它交给运行系统,运行系统寻找相应的代码来处理这个异常。我们把生成异常对象并把它提交给运行系统的过程称为抛出(throw)一个例外。运行系统在方法的调用栈中查找,从生成异常的方法开始进行回朔,直到找到包含相应异常处理的方法为止,这一个过程称为捕获(catch)一个异常。
这段话太恶了,我来通俗地翻译一下。我们直接拿程序说话,观察下面一段程序:
| public class Mat { public static void main(String[] args) { try{ int i=0; System.out.print(10/i); } catch(Exception e){ System.out.print("一个异常已经产生!"); } } } |
main方法中,在try{}里的是可能产生异常的代码。当然了,我们都知道大括号中的代码是百分百会产生异常的——除数是0;在catch{}里的假设出现异常后作出的处理方法,而catch后面的()内,是表示一个异常对象e。
请看赤裸裸的运行过程:先执行“定义整型变量i 等于0,输出10除以i的结果”,因为除数为0出现异常,所以跳过System.out.print(10/i);,往下寻找catch中的处理方法。在catch中,如果前面出现异常,则输出“一个异常已经产生!”。
如果将int i=0; 改成int i = 1; 则运行结果为 10 。
异常的分类
JAVA异常分2种:一种是JAVA运行时的系统异常Error,由Java虚拟机生成并抛出,一般来说 Error表示恢复不是不可能但很困难的情况下的一种严重问题。
另一种是 Exception异常,表示一种设计或实现问题上的错误(如 数组越界)。
异常的继承结构:基类为Throwable,Error和Exception继承Throwable,RuntimeException和IOException等继承Exception,具体的RuntimeException继承RuntimeException。
异常类型
Java为异常定义了类和关键字,把异常加入了Java语言的结构体系。
异常类在Java语言中是一种比较特殊的类,按照异常处理的不同可以分为捕获异常,声明异常,抛出异常和运行异常。
(1)捕获异常
通过在try字句中处理需要解决的问题,然后再catch字句中对来自try字句代码内部的错误进行处理,最后通过finally字句释放资源,实现异常处理的出口。语法如下:
|
try { |
当程序执行到try中时,若真的遇到了相关异常,就转入catch,屏蔽该异常,执行你个catch中的语句,再得不到解决,则转入finally(如果有的话)。
(2)声明异常
Java方法遇到自己不能解决的情况,就会声明异常。声明异常的方法在方法声明中必须描述潜在的异常类型,它属于方法声明的一部分,位于参数列表的后面。语法如下:
| throws exception1,exception2, …… //异常列表 |
(3)抛出异常
在捕获一个异常之前,必须先有异常被抛出。通过使用抛出异常来生成一个异常对象。要求能抛出的异常必须是Throwable类或其子类的实例,并且抛出异常和生成异常对象都是通过throw语句实现。
|
catch(Exception e) { |
处理异常
(1)try和catch字句
try语句用大括号{}指定了一段代码,该段代码可能会抛出一个或多个异常。
catch语句的参数类似于方法的声明,包括一个异常类型和一个异常对象。异常类型必须为Throwable类的子类,它指明了catch语句所处理的异常类型,异常对象则由运行系统在try所指定的代码块中生成并被捕获,大括号中包含对象的处理,其中可以调用对象的方法。catch语句可以有多个,分别处理不同类的异常。Java运行系统从上到下分别对每个catch语句处理的异常类型进行检测,直到找到类型相匹配的catch语句为止。这里,类型匹配指catch所处理的异常类型与生成的异常对象的类型完全一致或者是它的父类,因此,catch语句的排列顺序应该是从特殊到一般。也可以用一个catch语句处理多个异常类型。
需要注意的是:
如果在try块里的任何一段代码产生了一个catch块要捕捉的异常,那么在try块中其余剩下的代码都将被忽略,而相应的catch块将会被执行
如果在try块里没有代码产生异常,那么所有的catch语句块都将会被忽略
如果抛出的异常在catch块里面没有被声明,那么方法立刻退出
捕捉异常时,如果你同时写了很多个catch语句,注意将catch(Exception ex) 语句放到最后,所有的异常都会被catch(Exceptione)所捕捉。这意味着其它的catch块都不会被执行
(2)finally字句
try所限定的代码中,当抛出一个异常时,其后的代码不会被执行。通过finally语句可以指定一块代码。无论try所指定的程序块中抛出或不抛出异常,也无论catch语句的异常类型是否与所抛出的异常的类型一致,finally所指定的代码都要被执行,它提供了统一的出口。通常在finally语句中可以进行资源的清除工作。如关闭打开的文件等。 但是如果在try语句中使用了System.exit() 语句,中断了程序,finally就无法执行。
(3)异常处理的原则
对异常事件分类,通过异常层次实现控制;将异常处理代码和正常代码分开;使用finally作为统一出口;能简单测试就尽量不使用异常控制;自定义异常类时,使用Throwbale类及其子类,一般定义为非运行时的异常,除非在运行时产生或者不易预测。
try甚至可以嵌套
你可以在一个成员函数调用的外面写一个try语句,在这个成员函数内部,写另一个try语句保护其他代码。每当遇到一个try语句,异常的框架就放到堆栈上面,直到所有的try语句都完成。如果下一级的try语句没有对某种异常进行处理,堆栈就会展开,直到遇到有处理这种异常的try语句。下面是一个try语句嵌套的例子:
|
class Test { static void matrixkey() { try { int a = 0; int b = 42/a; } catch(java.lang.ArithmeticException e) { System.out.println("在matrixkey方法中,捕获ArithmeticException异常: " + e); } }
public static void main(String args[]) { try { matrixkey(); } catch(java.lang. Exception e) { System.out.println("在main方法中,捕获Exception异常: " + e); } } } |
这段代码执行的结果是输出:
在matrixkey方法中,捕获ArithmeticException异常: java.lang.ArithmeticException: /by zero
原因是成员方法matrixkey里有自己的try/catch控制,所以main方法不用去处理ArithmeticException异常。
如果在matrixkey中catch到异常时使用throw e;语句把matrixkey里的异常抛出,那么main还是能够捕捉并处理这个matrixkey抛出来的异常。因此在matrixkey方法的catch中的System.out语句后面增加throw e;语句之后,执行结果就变为:
在matrixkey方法中,捕获ArithmeticException异常: java.lang.ArithmeticException: /by zero
在main方法中,捕获Exception异常: java.lang.ArithmeticException: /by zero
观察以下代码片段:
|
class test7 static void method() throws Exception{ |
输出结果是:
test7!
finally!
在method方法中,无论try字句中的代码块是否执行,finally字句必定被执行。事实上在这里,我曾有过一个疑问:method方法中,是肯定没有异常的,那么为什么在main方法中调用method方法时,仍需要throws语句来声明异常,即使这个异常并不存在。我们再来观察下面代码片段:
|
class test7 method(); } static void method(){ System.out.println("test!"); } System.exit(0); } |
上面这段程序首先输出test!,然后程序进入finally代码段,在这里调用System类中的exit()方法退出系统,在这之后,程序已经退出,不会执行finally代码段下面的语句,因此只输出test! 。
JAVA中创建自己的异常类
除了使用系统预定义的异常外,用户还可以创建自己的异常。例如:
| //定义名为MyException的异常类,继承Exception类 class MyException extends Exception{ } |
用户自定义的所有异常类都必须是Exception的子类。
在程序中发现异常情况时,程序员可以抛出(throw)一个异常实例,将其放到异常队列中去,并激活Java的异常处理机制,如:
throw new MyException();
相关题目:
对于try和catch子句的排列方式,下列哪个是正确的?
A。 子类异常在前,父类异常在后
B。 父类异常在前,子类异常在后
C。 只能有子类异常
D。 父类异常和子类异常不能同时出现在同一个try程序段内
解析:在java语言中,在捕获父类异常时对其子类异常也捕获了,根据try与catch的匹配原则,尽量使用一个父类去捕获其所有子类的异常,而父类和子类异常是可以同时出现的。
答案:A
运行下面的程序时,会产生几个异常?
|
public class Test8 { |
解析:只能出现一个异常:java.lang.ArithmeticException:/ by zero。由于在程序第4行出现了这个异常后,程序就跳出,不能继续执行下去,因此不会出现第6行的数组越界异常。
答案:A
太晚,睡觉。明天可能会补充部分题目。这篇日志是不是太长了额。0:00:05。
程序代码






