InputMismatchException可以由自己处理吗?

我希望系统在捕获InputMismatchException异常时可以交给我处理,比如打印“输入有误,请重新输入!”,然后我可以再次输入。比如下面这个switch,我想用以上方法检测每个nextDouble();
switch(k)
{
case 1:System.out.println("请输入三边长度");

             i.setValue(x.nextDouble(),x.nextDouble(),x.nextDouble());i.getPerimeter();i.getArea();
             count1++;
             break;
             case 2:System.out.println("请输入长和宽");

             ii.setValue(x.nextDouble(),x.nextDouble());ii.getPerimeter();ii.getArea();
             count2++;
             break;
             case 3:System.out.println("请输入半径");

             iii.setValue(x.nextDouble());iii.getPerimeter();iii.getArea();
             count3++;
             break;
             default:System.out.println("输入有误!");
        }
    }

我知道可以用下面的方法,但是好像对每个输入都要重复使用
for(;;){
try{Scanner x=new Scanner(System.in);

     if(!x.hasNextInt())throw new InputMismatchException();
   }catch(InputMismatchException e){
        System.out.println("输入有误");
        continue;
    }
    }
try
{
这里括住整个switch就好
}
catch(InputMismatchException e)
{
System.out.println("输入有误");
continue;
}

 try
{
    Scanner x=new Scanner(System.in);
    if(!x.hasNextInt())throw new InputMismatchException();
}
catch(InputMismatchException e)
{
    System.out.println("输入有误");
    continue;
}

图片说明把switch放到try里面也不行

 import java.util.*;
abstract class Ashape 
{
    abstract double getArea();
    abstract double getPerimeter();
}
class Tri
{
    double a,b,c,p;
    void setValue(double a,double b,double c){
        this.a=a;
        this.b=b;
        this.c=c;
    }

    void getArea(){
        p=(a+b+c)/2;
        System.out.println("三角形面积为"+Math.sqrt(p*(p-a)*(p-b)*(p-c)));
    }
    void getPerimeter(){
        System.out.println("三角形周长为"+(a+b+c));
    }
}

class Rect
{
    double l,w;
    void setValue(double l,double w){
        this.l=l;
        this.w=w;
    }
    void getArea(){
        System.out.println("矩形面积为"+l*w);
    }
    void getPerimeter(){
        System.out.println("三角形周长为"+2*(l+w));
    }
}

class Circle
{
     double r;
     void setValue(double r){
         this.r=r;
     }
     void getArea(){
        System.out.println("圆形面积为"+Math.PI*r*r);
    }
    void getPerimeter(){
        System.out.println("圆形周长为"+2*Math.PI*r);
    }
}

class ShapeEx
{
    static int count1,count2,count3;
    static{
    count1=0;
    count2=0;
    count3=0;}
    public static void main(String[] args)
        {

        int k;
        Scanner x=new Scanner(System.in);
        Tri i=new Tri();
        Rect ii=new Rect();
        Circle iii=new Circle();
         for(;;)
        {
               System.out.println("\n**已创建三角形"+count1+"个,"+
                  "矩形"+count2+"个,"+"圆形"+count3+"个**");
              System.out.println("**创建三角形请按1,矩形按2,圆形按3**\n");
              k=x.nextInt();

            try{ switch(k)
            {
                 case 1:System.out.println("请输入三边长度");

                 i.setValue(x.nextDouble(),x.nextDouble(),x.nextDouble());i.getPerimeter();i.getArea();
                 count1++;
                 break;
                 case 2:System.out.println("请输入长和宽");

                 ii.setValue(x.nextDouble(),x.nextDouble());ii.getPerimeter();ii.getArea();
                 count2++;
                 break;
                 case 3:System.out.println("请输入半径");

                 iii.setValue(x.nextDouble());iii.getPerimeter();iii.getArea();
                 count3++;
                 break;
                 default:System.out.println("输入有误!");
            }
            }catch(InputMismatchException e){System.out.println("输入有误!");
            continue;

            }


        }
    }
}