`
suhuanzheng7784877
  • 浏览: 704229 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
Ff8d036b-05a9-33b5-828a-2633bb68b7e6
读金庸故事,品程序人生
浏览量:47744
社区版块
存档分类
最新评论

Java基础复习笔记03面试、笔试、开发中我们不太注意的陷阱之流程控制、面向对象、异常处理

阅读更多

1.       switch语句的用法

有人说:“笔者基础也太差了,switch都得说说?”是啊?哥们得说说啊,因为笔者基础确实自认比较差。试问,自从你学了分支语句后,你使用if else多啊?还是用switch的情况多啊?很肯定,很多人在开发中switch几乎没怎么用,使用if else不容易出错,之后就渐渐淡忘了switch的用法。现在咱们来复习一下。

public static void main(String[] args) {
		
		int num = -1;
		switch (num) {
		case 5:
			System.out.println("小学牛逼啊!经常作业得5分");
			break;
		case 4:
			System.out.println("小学还行啊!经常作业得4分");
			break;
		case 3:
			System.out.println("小学贪玩啊!经常作业得3分");
			break;
		case 2:
			System.out.println("小学干嘛呢!经常作业得2分,坏学生");
			break;
		case 1:
			System.out.println("小学胆子够大的!经常作业得1分");
			break;
		case 0:
			System.out.println("小学牛逼啊!敢和老师叫板");
			break;

		default:
			System.out.println("这孩子没上小学");
			break;
		}
	}

 switch中的字符是欲判断变量,下面的分支就根据此变量。每一个分支case代表了该变量的一种可能性,如果没有任何case符合,那么就进入default处理。每一个分支都有一个break,代表如果符合此分支的情况,处理完毕后会退出switch块。如果没有break,那么会继续往下面的case走,无论下面的case是否符合都会执行,直到遇到break或者整个switch块走完方才停止。

比如

int num = 3;
		switch (num) {
		case 5:
			System.out.println("小学牛逼啊!经常作业得5分");
			break;
		case 4:
			System.out.println("小学还行啊!经常作业得4分");
			break;
		case 3:
			System.out.println("小学贪玩啊!经常作业得3分");
			;
		case 2:
			System.out.println("小学干嘛呢!经常作业得2分,坏学生");
			;
		case 1:
			System.out.println("小学胆子够大的!经常作业得1分");
			;
		case 0:
			System.out.println("小学牛逼啊!敢和老师叫板");
			break;

		default:
			System.out.println("这孩子没上小学");
			break;

 会输出

小学贪玩啊!经常作业得3分
小学干嘛呢!经常作业得2分,坏学生
小学胆子够大的!经常作业得1分
小学牛逼啊!敢和老师叫板

 这也是为什么那么多人喜欢使用if else了,哪怕一个简单的字符匹配,也用if elseswitch表达式的类型只有Java个别的基本类型和枚举——byteshortintcharenum。其他类型都不能作为预判断变量。

2.       方法的重载

JVM在识别方法的时候有一定的智能型,传入的实参如果和定义的形参不一样的话,那么会向上转型以适应方法的调用需要,比如

public static void test(String str, double num) {
	System.out.println("test(String str,double num):" + str + "|" + num);
}


public static void main(String[] args) {
	test("叶", 10);
}

 实参第二个参数不是double类型的,那么再执行test的时候它会向上转型,让它自动匹配double,如果重载方法还有更精确的形参,那么自然会去匹配最精确的方法了。

比如

public static void test(String str, double num) {
		System.out.println("test(String str,double num):" + str + "|" + num);
	}
	
	public static void test(String str, int num) {
		System.out.println("test(String str,int num):" + str + "|" + num);
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		test("叶", 10);
	}

 

 

实参10不必向上转型,直接执行test(String str, int num)这个方法。

3.       非静态内部类

非静态内部类实际上需要外部类才能顺利创建实例,非静态内部类的构造函数,JVM都做了特别的处理,将外部类对象作为默认构造器的第一个隐式参数。而且非静态内部类有个限制,不能拥有静态成员变量,因为非静态的内部类本身就处在一个非静态的上下文环境中

4.       静态内部类

如果非使用静态类不可,其实大多数都是用静态内部类,因为静态内部类可以访问外部类的静态成员变量。而换句话说,静态内部类不能访问外部类的非静态成员变量。所谓静态static,就是理解成类对象级别的,非静态成员变量是实例对象级别的,属于在类对象创建完了它才创建呢。怎么能在类对象中使用一个还没创建出来的东东呢?

5.       异常处理

finally的使用:一般在finally中回收一些资源,比如数据库连接的关闭、IO文件流的通道关闭、临时变量的指针回收等等操作。唯一存有疑问的可能就是finally的执行时机。到底是在return之前还是之后,实际上如果一个try块存在return了,那么如果这段try块有相应的finally的话那么return操作先挂起,之后执行finally中的代码,如果finally代码块没有return,或者其他影响try块的语句的话,那么执行完finally代码段之后再执行return语句。什么情况下finally中会影响try中的return执行呢?就是finally中也存在着return语句,或者System.exit(0);这种系统级关闭的语句。

如下:

try{
			test("叶", 10);
			return ;
		}finally{
			System.out.println("haha");
			return;
		}

 那么tryreturn是不会执行的。还有一点就是即使try块抛出异常了,finally会执行吗?

如下:

		try{
			test("叶", 10);
			throw new RuntimeException("运行时异常");
		}finally{
			System.out.println("haha");
			return;
		}

 实际上finally块依然会执行,并且此时RuntimeException也不会往上抛异常了,因为在finally块已经正常返回了。

catch到一个异常后不应该在catch中执行任何与应用有关的业务逻辑了,而是应当及时反映异常,比如打印到控制台、发送错误消息、记录error日志、发送错误的消息(web serviceJMSsocket)等等操作。如果在catch中进行业务处理有可能是死循环,将资源都吃掉不说,真正导致异常的错误信息估计此时也已经错过了。

比如代码

		try{
			test("叶", 10);
		}catch(RuntimeException e){
			test("金小开", 12);
		}finally{
			System.out.println("haha");
			return;
		}

 就不太妥了。当然了极端的情况不是没有,有可能自己的系统应用中大量使用了自定义的异常类。遇到某某自定义的异常后尝试继续执行某业务,这个场景虽然极端,但是确实存在,只不过这样的处理有点违背Java设计异常机制的初衷。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics