问题:用户输入三角形的三条边,当三角形不成立的时候,给用户重新再次输入的时候,假设第二次输入正确,因为使用了函数嵌套,那么会出现递归的问题?
最终解决方法:强制抛出一个异常,就可以解决这个问题
以下是我的代码:
domain类
package com.itxiaojia.domain;
//实体类
public class Triangle {
//三角形的三条边
private double side1;
private double side2;
private double side3;
public void setSide1(double side1){
this.side1=side1;
}
public double getSide1(){
return side1;
}
public void setSide2(double side2){
this.side2=side2;
}
public double getSide2(){
return side2;
}
public void setSide3(double side3){
this.side3=side3;
}
public double getSide3(){
return side3;
}
}
工具类,主要是验证数据
package com.itxiaojia.utils;
import java.util.regex.*;
/**
* 检查工具类
* @author wu
*
*/
public class Check {
/**
* 判断是否为三角形
* @param a1
* @param a2
* @param a3
* @return
*/
public static boolean isTriangle(double a1,double a2,double a3){
if((a1+a2)>a3 && (a1+a3)>a2 && (a2+a3)>a1){
return true; //如果符合三角形成立的条件,返回true
}
return false;
}
//判断用户输入是否是数字字符串
public static boolean isNumber(String str){
Pattern p=Pattern.compile("^\\d+[0-9 .]*");
Matcher m=p.matcher(str);
if(!m.matches()){
return false; //如果用户输入的不是数字,返回false
}
return true;
}
}
包含main函数的类
package com.itxiaojia.test;
import java.util.Scanner;
import com.itxiaojia.utils.Check;
public class Demo1 {
public static void main(String[] args){
show();
}
/**
* 显示界面
* @throws Exception
*/
public static void show(){
System.out.println("*************************************\n" +
"***需求: 用户输入三角形的三条边,求其周长和面积***\n************************************");
Scanner scan=new Scanner(System.in);
System.out.println("请输入三角的第一条边:");
String str=scan.nextLine();
while(!Check.isNumber(str)){
System.out.println("你输入的格式不正确,请重新输入:");
str=scan.nextLine();
}
double a1=Double.parseDouble(str);
//第二条边
System.out.println("请输入三角形的第二条边:");
str=scan.nextLine();
while(!Check.isNumber(str)){
System.out.println("你输入的格式不正确,请重新输入:");
str=scan.nextLine();
}
double a2=Double.parseDouble(str);
//第三条边
System.out.println("请输入三角形的第三条边:");
str=scan.nextLine();
while(!Check.isNumber(str)){
System.out.println("你输入的格式不正确,请重新输入:");
str=scan.nextLine();
}
double a3=Double.parseDouble(str);
//判断三角形是否成立
while(!Check.isTriangle(a1, a2, a3)){
System.out.println("你输入的三条边不符合三角形成立的条件\n请重新开始输入:");
show();
}
System.out.println("该三角形的周长为:"+getPerimeter(a1,a2,a3)+" 面积为:"+getArea(a1,a2,a3));
}
/**
* 三角形的周长
* @param a1
* @param a2
* @param a3
* @return
*/
public static double getPerimeter(double a1,double a2,double a3){
return a1+a2+a3;
}
/**
* 三角形的面积
* @param a1
* @param a2
* @param a3
* @return
*/
public static double getArea(double a1,double a2,double a3){
double d=(a1+a2+a3)/2;
return Math.sqrt(d*(d-a1)*(d-a2)*(d-a3));
}
}
以下是运行后输出结果截图
这个是一次性并且值正常的结果
下面这个是问题,当输出三角形的面积和周长的时候并没有结束,而是进入了递归
解决方法:1,试过用return;但没有效果
2,通过抛出一个异常强制结束递归
最初想到在show方法最后一行加上return;但是由于采用的递归,所以没有达到我要的效果。如下:
public static void show(){
System.out.println("*************************************\n" +
"***需求: 用户输入三角形的三条边,求其周长和面积***\n************************************");
Scanner scan=new Scanner(System.in);
System.out.println("请输入三角的第一条边:");
String str=scan.nextLine();
while(!Check.isNumber(str)){
System.out.println("你输入的格式不正确,请重新输入:");
str=scan.nextLine();
}
double a1=Double.parseDouble(str);
//第二条边
System.out.println("请输入三角形的第二条边:");
str=scan.nextLine();
while(!Check.isNumber(str)){
System.out.println("你输入的格式不正确,请重新输入:");
str=scan.nextLine();
}
double a2=Double.parseDouble(str);
//第三条边
System.out.println("请输入三角形的第三条边:");
str=scan.nextLine();
while(!Check.isNumber(str)){
System.out.println("你输入的格式不正确,请重新输入:");
str=scan.nextLine();
}
double a3=Double.parseDouble(str);
//判断三角形是否成立
while(!Check.isTriangle(a1, a2, a3)){
System.out.println("你输入的三条边不符合三角形成立的条件\n请重新开始输入:");
show();
}
System.out.println("该三角形的周长为:"+getPerimeter(a1,a2,a3)+" 面积为:"+getArea(a1,a2,a3));
return;
}
运行结果如下图,显然没有达到要求
后来想到了这个方法,也就是可以抛出一个异常来结束后面的代码执行。只要修改两个地方 :第1个地方是在main方法中:
public class Demo1 {
public static void main(String[] args){
try {
show();
} catch (Exception e) {
}
}
第2个地方是在show方法中:
public static void show() throws Exception{
System.out.println("*************************************\n" +
"***需求: 用户输入三角形的三条边,求其周长和面积***\n************************************");
Scanner scan=new Scanner(System.in);
System.out.println("请输入三角的第一条边:");
String str=scan.nextLine();
while(!Check.isNumber(str)){
System.out.println("你输入的格式不正确,请重新输入:");
str=scan.nextLine();
}
double a1=Double.parseDouble(str);
//第二条边
System.out.println("请输入三角形的第二条边:");
str=scan.nextLine();
while(!Check.isNumber(str)){
System.out.println("你输入的格式不正确,请重新输入:");
str=scan.nextLine();
}
double a2=Double.parseDouble(str);
//第三条边
System.out.println("请输入三角形的第三条边:");
str=scan.nextLine();
while(!Check.isNumber(str)){
System.out.println("你输入的格式不正确,请重新输入:");
str=scan.nextLine();
}
double a3=Double.parseDouble(str);
//判断三角形是否成立
while(!Check.isTriangle(a1, a2, a3)){
System.out.println("你输入的三条边不符合三角形成立的条件\n请重新开始输入:");
show();
}
System.out.println("该三角形的周长为:"+getPerimeter(a1,a2,a3)+" 面积为:"+getArea(a1,a2,a3));
throw new Exception(); //强制退出递归
}
最终运行的结果为: