String.valueOf()抛NumberFormatException异常

默默-瑷 2014-09-21 04:54:12
temp = String.valueOf(Double.parseDouble(left)*Double.parseDouble(right));

其中left、right都是string类型的数字。
为什么会抛NumberFormatException异常
...全文
657 16 打赏 收藏 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
程序员在修行 2014-10-03
  • 打赏
  • 举报
回复
引用 14 楼 u013596294 的回复:
不不 我碰到过你这种情况 我保证 他截取到的两个操作数是正确的·· [quote=引用 11 楼 humanity 的回复:] 多数情况下是刚好出个空白字符串或截取到一个小数点啥的,另外这个字符串式的数字还不能科学表示法 (1.0E-3这种)。 [quote=引用 8 楼 magi1201 的回复:] [quote=引用 6 楼 u013596294 的回复:] 我保证left、right是正确的 而且 Double.parseDouble(left)*Double.parseDouble(right) 这一步是能计算的(我断点调试试出来的),而且能计算正确
断点调试能通过,直接运行就出错? [/quote][/quote][/quote] 打印下里面的相乘结果看看
scmod 2014-10-03
  • 打赏
  • 举报
回复
这个貌似只能是left或者right出问题转不了啊, 或者两个值乘积比double类型上限还大
humanity 2014-09-22
  • 打赏
  • 举报
回复
多数情况下是刚好出个空白字符串或截取到一个小数点啥的,另外这个字符串式的数字还不能科学表示法 (1.0E-3这种)。
引用 8 楼 magi1201 的回复:
[quote=引用 6 楼 u013596294 的回复:] 我保证left、right是正确的 而且 Double.parseDouble(left)*Double.parseDouble(right) 这一步是能计算的(我断点调试试出来的),而且能计算正确
断点调试能通过,直接运行就出错? [/quote]
默默-瑷 2014-09-22
  • 打赏
  • 举报
回复
不不 我碰到过你这种情况 我保证 他截取到的两个操作数是正确的··
引用 11 楼 humanity 的回复:
多数情况下是刚好出个空白字符串或截取到一个小数点啥的,另外这个字符串式的数字还不能科学表示法 (1.0E-3这种)。 [quote=引用 8 楼 magi1201 的回复:] [quote=引用 6 楼 u013596294 的回复:] 我保证left、right是正确的 而且 Double.parseDouble(left)*Double.parseDouble(right) 这一步是能计算的(我断点调试试出来的),而且能计算正确
断点调试能通过,直接运行就出错? [/quote][/quote]
默默-瑷 2014-09-22
  • 打赏
  • 举报
回复
引用 10 楼 wopabe 的回复:
[quote=引用 楼主 u013596294 的回复:]
temp = String.valueOf(Double.parseDouble(left)*Double.parseDouble(right));
其中left、right都是string类型的数字。 为什么会抛NumberFormatException异常
你是一个String乘以一个double啊[/quote] 不是啊,是两个double类型的数相乘 得到一个 “ N.0” 形式的数 当string。valueof是 抛异常
wopabe 2014-09-22
  • 打赏
  • 举报
回复
引用 楼主 u013596294 的回复:
temp = String.valueOf(Double.parseDouble(left)*Double.parseDouble(right));
其中left、right都是string类型的数字。 为什么会抛NumberFormatException异常
你是一个String乘以一个double啊
默默-瑷 2014-09-22
  • 打赏
  • 举报
回复
引用 8 楼 magi1201 的回复:
[quote=引用 6 楼 u013596294 的回复:] 我保证left、right是正确的 而且 Double.parseDouble(left)*Double.parseDouble(right) 这一步是能计算的(我断点调试试出来的),而且能计算正确
断点调试能通过,直接运行就出错? [/quote] 肯定是不能通过 但是你可以查看中间变量的值啊,我查看得到算出的数是争取的
姜小白- 2014-09-21
  • 打赏
  • 举报
回复
引用 6 楼 u013596294 的回复:
我保证left、right是正确的 而且 Double.parseDouble(left)*Double.parseDouble(right) 这一步是能计算的(我断点调试试出来的),而且能计算正确
断点调试能通过,直接运行就出错?
默默-瑷 2014-09-21
  • 打赏
  • 举报
回复
	private int find_ChengAndChu(String s) {
		for (int i = 0; i < s.length(); i++)
		{
			char c = s.charAt(i);
			if (c == '*')
				return 100+i+1;
			else
			{
				if (c == '/')
					return 200+1+i;
			}
		}
		return 0;
	}
	
	private  int find_JiaAndJian(String s)
	{
		for (int i = 0; i < s.length(); i++)
		{
			char c = s.charAt(i);
			if (c == '+')
				return 300+i+1;
			else
			{
				if ((c == '-') && i != 0 && (s.charAt(i - 1) >= '0'&&s.charAt(i - 1) <= '9'))
					return 400+i+1;
			}
		}
		return 0;
	}
	
	private String find_Left(String s)
	{
		int n = 0;
		for (int i = s.length()-1; i >= 0; i--)
		{
			char c = s.charAt(i);
			if ((c >= '0'&&c <= '9')||c =='.' || i == 0)
				n++;
			else
				break;
		}
		return s.substring(s.length()-n);
	}

	private String find_Right(String s)
	{
		int n = 0;
		for (int i =0; i<s.length(); i++)
		{
			char c = s.charAt(i);
			if ((c >= '0'&&c <= '9') || c == '.'|| i ==0)
				n++;
			else
				break;
		}
		return s.substring(0,n);
	}
	
	private String  chuLing(String s)
	{
		if (Double.parseDouble(s) - Integer.parseInt(s) == 0)
			s = String.valueOf(Integer.parseInt(s));
		else
		{
			int n = 0;
			for (int i = s.length() - 1; i >= 0; i--)
			{
				char c = s.charAt(i);
				if (c == '0')
					n++;
				else
					break;
			}
			s = s.substring(0,s.length() - n).toString();
		}
		return s;
	}
	
	private String jiSuan(String s) {
		//if  处理括号问题
		if (s.indexOf(')') + 1 != 0)
		{
			//核心就是找出配对括号,将 字符串中“ (算式)”替换乘算式的结果
			//循环调用,最终变成一个无括号的字符串算式
			//最后再计算这个无括号的字符串算式,就能返回一个字符串类型的结果
			for (int right = s.indexOf(')') + 1 ; right > 0; )
			{
				int left = s.substring(0,right - 1).toString().lastIndexOf('(') + 1;
				String sLeft = s.substring(0,left - 1).toString();
				String sRight = s.substring(right);
				s = sLeft + jiSuan(s.substring(0,right - 1).toString().substring(left)) + sRight;
			}
			return jiSuan(s);
		}
		//  else 做四则运算
		else
		{
			//思路:先找到运算符,再找这个运算符的两个操作数
			//		计算,返回  “将原字符串中  此次运算的算式  替换为   运算结果”   的字符串
			
			//乘除运算
			for (int i = find_ChengAndChu(s);i>0 ;)
			{
				int mark = i / 100;
				int where = i % 100;
				String left = find_Left(s.substring(0,where - 1).toString());
				String right = find_Right(s.substring(where).toString());
				String temp = "";
				if (mark == 1)
				{
					temp = String.valueOf(Double.parseDouble(left)*Double.parseDouble(right));
					temp = chuLing(temp);
				}
				if (mark == 2)
				{
					if(Double.parseDouble(right) == 0) {
						throw new ArithmeticException();
					}
					else {
						temp = String.valueOf(Double.parseDouble(left)/Double.parseDouble(right));
						temp = chuLing(temp);
					}
				}
				s = s.substring(0,where - left.length() - 1) + temp + s.substring(where + right.length());
				i = find_ChengAndChu(s);
			}

			//加减运算
			for (int i = find_JiaAndJian(s); i>0;)
			{
				int mark = i / 100;
				int where = i % 100;
				String left = find_Left(s.substring(0,where - 1).toString());
				String right = find_Right(s.substring(where));
				String temp = "";
				if (mark == 3)
				{
					temp = String.valueOf(Double.parseDouble(left) + Double.parseDouble(right));
					temp = chuLing(temp);
				}
				if (mark == 4)
				{
					temp = String.valueOf(Double.parseDouble(left) - Double.parseDouble(right));
					temp = chuLing(temp);
				}
				s = s.substring(0,where - left.length() - 1) + temp + s.substring(where + right.length());
				i = find_JiaAndJian(s);
			}
			return s;
		}
	}
默默-瑷 2014-09-21
  • 打赏
  • 举报
回复
引用 1 楼 magi1201 的回复:
可否将left 和 right 的定义 或者 数值贴出来看看呢 还有将具体的异常信息贴出来,异常信息中会指出异常的原因
int where = i % 100;
String left = find_Left(s.substring(0,where - 1).toString());
String right = find_Right(s.substring(where).toString());
String temp = "";
temp = String.valueOf(Double.parseDouble(left)*Double.parseDouble(right));
我保证left、right是正确的 而且 Double.parseDouble(left)*Double.parseDouble(right) 这一步是能计算的(我断点调试试出来的),而且能计算正确
默默-瑷 2014-09-21
  • 打赏
  • 举报
回复
引用 3 楼 software_gemeng 的回复:
额~~ 我测试了一下没有问题呀 你能把left和right的定义都写出来吗
int mark = i / 100;
		                int where = i % 100;
				String left = find_Left(s.substring(0,where - 1).toString());
				String right = find_Right(s.substring(where).toString());
				String temp = "";
				temp = String.valueOf(Double.parseDouble(left)*Double.parseDouble(right));
				temp = chuLing(temp);
王子文龙 2014-09-21
  • 打赏
  • 举报
回复
left或right肯定有问题
software_gemeng 2014-09-21
  • 打赏
  • 举报
回复
额~~ 我测试了一下没有问题呀 你能把left和right的定义都写出来吗
姜小白- 2014-09-21
  • 打赏
  • 举报
回复
可否将left 和 right 的定义 或者 数值贴出来看看呢 还有将具体的异常信息贴出来,异常信息中会指出异常的原因

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧