java try的用法_try、catch 你真的会用吗

f4d677c7a940e6fde3e57548e5a92cb8.png

今天依旧是刷题的一天,在做LeetCode的题目8时遇到了一个问题

Exception in thread "main" java.lang.NumberFormatException: For input string: "20000000000000000000" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Long.parseLong(Long.java:592)
at java.lang.Long.parseLong(Long.java:631)
at com01.Code8.myAtoi(Code8.java:28)
at com01.Code8.main(Code8.java:50)

为什么会报错呢?仔细研究加推敲一番后,发现原来是因为这行代码Long.parseLong(str)str转化为long类型之后超出了long的范围,错误就自然而然的产生了。那怎么修改一下程序呢?代码整体上是没有问题的,测试样例1079个过了1073个,不想大动干戈改代码,这就很尴尬了。怎么办呢,这个时候就想到了我能不能检测一下如果发生该错误,就针对该问题处理一下。这个时候trycatch就排上用场了。具体结构如下:

try{
	可能发生异常的代码
}catch(异常的类型1 e) {
	处理异常的代码
}catch(异常类型2 e){
	处理异常的代码
}...	// 可以有多个catch
finally{
	最终一定要执行的代码
}

那么在这个结构中代码的执行顺序是怎样的呢?分为以下三个步骤执行

1. 从try内发生异常的那一行代码,中断执行

2. 执行对应catch内处理异常的代码

3. 继续执行trycatch结构之后的代码

了解了原理之后问题又来了,我知道发生异常了,但是异常类型又该怎么写?我怎么知道发生了哪个异常?小编也很苦恼,于是就上网搜了一下,结果发现异常的类型是真的多,看的人眼花缭乱,不过看得多了发现异常类型的后面都是以Exception结尾的,那么再看看我们的报错信息,忽然发现有一个NumberFormatException,有一种柳暗花明又一村的感觉哈哈,就抱着试一试的心态,结果发现没问题,程序正确运行。

通过解决这个错误呢,也算是真正了解到了trycatch的用法,实践操作了一把。之前是知道异常处理的,但也仅仅是纸上谈兵罢了,没有真正的使用过。总结下来,就是要仔细查看报错信息,不管是调试也好、还是使用异常处理,了解了错误的原因,离成功解决问题就不远了。下面贴一下题目的代码,比较简单,思路就不做介绍了

public int myAtoi(String str) {
		String s = str.trim();
		long result;
		// 字符串为空
		if(s.length() < 1 || s == null) {
			return 0;
		}
		// 开始字符不是0~9且不为+-号
		if((s.charAt(0)<'0' || s.charAt(0)>'9') && s.charAt(0)!='+' && s.charAt(0)!='-') {
			return 0;
		} else {
			String sub = "" + s.charAt(0);
			for(int i=1; i<s.length(); i++) {
				if(s.charAt(i)>='0' && s.charAt(i)<='9') {
					sub += s.charAt(i);
				} else {
					break;
				}
			}
			if(sub.equals("+") || sub.equals("-")){
				return 0;
			} else {
				try {
					result = Long.parseLong(sub);
				} catch(NumberFormatException e) {
					if(sub.charAt(0) == '-') {
						return Integer.MIN_VALUE;
					} else {
						return Integer.MAX_VALUE;
					}
				}
				if(result > Integer.MAX_VALUE) {
					return Integer.MAX_VALUE;
				} else if(result < Integer.MIN_VALUE) {
					return Integer.MIN_VALUE;
				} else {
					return new Long(result).intValue();
				}
			}
		}
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值