关于命令行参数的小问题

时间:2023-02-03 17:40:18
遇到一个题目:

设计一个程序,用于根据用户输入的命令行参数数量来计算长方形、正方形、三角形的面积。如果输入的参数为一个、二个、三个则它们应分别对应正方形、长方形、三角形,如果没有参数,则通过异常处理方法现实错误消息。(用于计算面积的方法是一个重载的方法。提示:定义一个抽象的父类,并提供一个抽象的方法area(). 再派生出三个子类,重写area()方法,然后在main方法中用多态来实现具体的面积函数的调用)。

我就是不太明白怎么用命令行参数,好象是argv argc什么的。
请高手帮帮忙哦~多谢~

15 个解决方案

#1


主方法这样写:

public static void main(String[] args)
{
  int n = args.length;
  if(n==0)
    throw new Exception("...");
  else if(n==1)
    //处理正方形 用args[0]
  else if(n==2)
    //处理长方形 用args[0]、args[1]
  else if(n==3)
    //处理三角形 用args[0]、args[1]、args[2]
}

  
}

#2


运行的时候各个参数之间加上空格

#3


命令行下java 类名 参数

#4


我找了段程序,请看:
abstract class MyAreaDemo               //抽象类
{
   abstract void area();
}

class MyRectangle extends MyArea        //长方型
{
   void area(int rh,int rw)
   {
        System.out.println(rh*rw);
   }
}

class MySquare extends MyArea           //方形
{
    void area(int sb)
    {
         System.out.println(sb*sb);
    }
}

class MyArea                        //主类
{
     public static void main(String args[])
     {
        try
        {
           int arrSize=args.length;         //args.length是命令行参数的长度吧?
           int num1;
           int num2;
           int num3;
           num1=Integer.parseInt(args[0]);  //给命令行参数附值?
           num2=Integer.parseInt(args[1]);
           num3=Integer.parseInt(args[2]);

           if(arrSize==2)                      //当输入两个数字的时候,用这个方法
           {
               MyRectangle objR=new MyRectangle();
               objR.area(num1,num2);
           }


           if(arrSize==1) //当输入一个数字的时候,用这个方法
                          //问题就出在这里,当输入一个数字的时候,
                          //总是出现异常“没有输入参数”就结束程序了~
           {
                MySquare objS=new MySquare();
                objS.area(num1);
           }
           // System.out.println(num1+"&"+num2+"&"+num3);
         }
           catch(ArrayIndexOutOfBoundsException e)
          {            
                System.out.println("没有输入参数");
          }
      }
}

我输入的格式是,先编译文件javac MyArea.java
产生所有class文件
然后执行java MyArea 4 5
结果:20
当执行java MyArea 4
的时候却提示‘没有输入参数’
我想让它输出:16
所的够详细了~~~
帮忙看看嘛`

#5




           int num1;
           int num2;
           int num3;
           num1=Integer.parseInt(args[0]);  //给命令行参数附值?
           num2=Integer.parseInt(args[1]);
           num3=Integer.parseInt(args[2]);

改为

           int num1;
           int num2;
           num1=Integer.parseInt(args[0]);  //给命令行参数附值?
           num2=Integer.parseInt(args[1]);
多加的那条是我实验3个数据的时候写的
上面的程序没有num3

#6


问题在这里把,还不知道有没有的时候,就引用,应该不对
但是两个的时候为什么没问题我也搞不懂了。
int arrSize=args.length; //args.length是命令行参数的长度吧?
int num1;
int num2;
int num3;
num1=Integer.parseInt(args[0]); //给命令行参数附值?
num2=Integer.parseInt(args[1]);
num3=Integer.parseInt(args[2]);

#7


哦 ,不好意思,没看清楚
那问题就肯定在
int num1;
int num2;
num1=Integer.parseInt(args[0]); //给命令行参数附值?
num2=Integer.parseInt(args[1]);
这个地方了,
只有一个参数的时候,你引用args[1],肯定会出异常,所以下面的根本没有执行,直接转到从一场处理去了。

#8


还有一点不太明白,题中说要定义个抽象的父类,在产生3个子类,可是我上面的程序2个子类是MyArea的子类,而没有是抽象类MyAreaDemo的子类,当我把2个子类的由class MyRectangle extends MyArea改成class MyRectangle extends MyAreaDemo时程序就出错误了~
这个问题的答案又是什么呢?

#9


dollyn(逆风飞扬)
可是当我执行java MyArea 4 时程序的args.length应该为1吧?那它应该跳转到 
if(arrSize==1) 执行下面语句啊~
可能程序需要我把定义的所有已经定义好的参数都附值才不会报错对吗?
那这样的话,只有最多参数的那条指令才能执行了~
有没有动态,我的意思是不知道怎么修改了~
应为以前没学过命令行参数,以前都用JB编程,对命令行参数的了解很少`

#10


自己顶下

#11


主类改成这样:

class MyArea                        //主类
{
     public static void main(String args[])
     {
        try
        {
           int arrSize=args.length;         //args.length是命令行参数的长度吧?
           int num1;
           int num2;
           int num3;

           if(arrSize==2)                      //当输入两个数字的时候,用这个方法
           {
               num1=Integer.parseInt(args[0]);  
               num2=Integer.parseInt(args[1]);
               MyRectangle objR=new MyRectangle();
               objR.area(num1,num2);
           }


           if(arrSize==1) //当输入一个数字的时候,用这个方法
                          //问题就出在这里,当输入一个数字的时候,
                          //总是出现异常“没有输入参数”就结束程序了~
           {
                num1=Integer.parseInt(args[0]);  
                MySquare objS=new MySquare();
                objS.area(num1);
           }
           // System.out.println(num1+"&"+num2+"&"+num3);
         }
           catch(ArrayIndexOutOfBoundsException e)
          {            
                System.out.println("没有输入参数");
          }
      }
}

#12


class MyArea
{
  public static void main(String [] args)
  {
  
   if(args.length==1){
       int a=Integer.parseInt(args[0]);
        System.out.println("正方形的面积: "+a*a);
   }
   else if(args.length==2){
     int a=Integer.parseInt(args[0]);
       int b=Integer.parseInt(args[1]);
     System.out.println("长方形的面积: "+a*b);
   }
   else if(args.length==3){
     int a=Integer.parseInt(args[0]);
       int b=Integer.parseInt(args[1]);
       int c=Integer.parseInt(args[2]);
     System.out.println("三角形的面积: "+a*b/2);
   }
   else{
       System.out.println("请输入一到三个参数!");
   }
   }
}
条条大路通java啊!!

#13


恩 ,上面的回答已经不错了

我说下这个问题:

dollyn(逆风飞扬)
可是当我执行java MyArea 4 时程序的args.length应该为1吧?那它应该跳转到
if(arrSize==1) 执行下面语句啊~

因为你执行下面的语句的时候,并没有判断长度阿,所以下面的是一定会被试图执行的,那么就出问题了吧。
int num1;
int num2;
num1=Integer.parseInt(args[0]); //给命令行参数附值?
num2=Integer.parseInt(args[1]);
正确的方法就向楼上的那样,判断以后再引用。

#14


#15


好久没来这里了~谢谢大家的支持!
我的程序已经做好了~还请大家分享~

public abstract class Shape {
    public abstract double area();
}
class Square extends Shape{
    double said_distence;
    public Square(double num1){
        said_distence = num1;
    }
    public double area(){
        return (said_distence * said_distence);
    }
}
class Rectangle extends Shape{
    double width;
    double hight;
    public Rectangle(double num1,double num2){
        width = num1;
        hight = num2;
    }
    public double area(){
        return (width * hight);
    }
}
class Triangle extends Shape{
    double sd1;
    double sd2;
    double sd3;
    double s,k;
    double tArea;
    public Triangle(double num1,double num2,double num3){
        sd1 = num1;
        sd2 = num2;
        sd3 = num3;
        s = (sd1 + sd2 + sd3)/2;
        k = s * (s - sd1) * (s - sd2) * (s - sd3);
        
        if(k<=0){
            System.out.println("此三条边不能构成一个三角形");
        }
        else{
            tArea = Math.sqrt(s * (s - sd1) * (s - sd2) * (s - sd3));
        }
    }
    public double area(){
        return (tArea);
    }
}
=================

public class MainTest {
    public static void main(String args[]) {
        try {
            int arrSize = args.length;
            double num1;
            double num2;
            double num3;
            if (arrSize == 3){
                num1 = Integer.parseInt(args[0]); 
                num2 = Integer.parseInt(args[1]);
                num3 = Integer.parseInt(args[2]);
                Shape objT = new Triangle(num1,num2,num3);
                System.out.println("三角形面积是:" + objT.area());
            
            }
            if (arrSize == 2) {
                num1 = Integer.parseInt(args[0]);
                num2 = Integer.parseInt(args[1]);
                Shape objR = new Rectangle(num1, num2);
                System.out.println("长方形面积是:" + objR.area());
            }

            if (arrSize == 1) {
                num1 = Integer.parseInt(args[0]);
                Shape objS = new Square(num1);
                System.out.println("正方形面积是:" + objS.area());
            }
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("没有输入参数");
        }
    }
}
正规执行没问题~
虽然还有些小BUG~
散分揭贴

#1


主方法这样写:

public static void main(String[] args)
{
  int n = args.length;
  if(n==0)
    throw new Exception("...");
  else if(n==1)
    //处理正方形 用args[0]
  else if(n==2)
    //处理长方形 用args[0]、args[1]
  else if(n==3)
    //处理三角形 用args[0]、args[1]、args[2]
}

  
}

#2


运行的时候各个参数之间加上空格

#3


命令行下java 类名 参数

#4


我找了段程序,请看:
abstract class MyAreaDemo               //抽象类
{
   abstract void area();
}

class MyRectangle extends MyArea        //长方型
{
   void area(int rh,int rw)
   {
        System.out.println(rh*rw);
   }
}

class MySquare extends MyArea           //方形
{
    void area(int sb)
    {
         System.out.println(sb*sb);
    }
}

class MyArea                        //主类
{
     public static void main(String args[])
     {
        try
        {
           int arrSize=args.length;         //args.length是命令行参数的长度吧?
           int num1;
           int num2;
           int num3;
           num1=Integer.parseInt(args[0]);  //给命令行参数附值?
           num2=Integer.parseInt(args[1]);
           num3=Integer.parseInt(args[2]);

           if(arrSize==2)                      //当输入两个数字的时候,用这个方法
           {
               MyRectangle objR=new MyRectangle();
               objR.area(num1,num2);
           }


           if(arrSize==1) //当输入一个数字的时候,用这个方法
                          //问题就出在这里,当输入一个数字的时候,
                          //总是出现异常“没有输入参数”就结束程序了~
           {
                MySquare objS=new MySquare();
                objS.area(num1);
           }
           // System.out.println(num1+"&"+num2+"&"+num3);
         }
           catch(ArrayIndexOutOfBoundsException e)
          {            
                System.out.println("没有输入参数");
          }
      }
}

我输入的格式是,先编译文件javac MyArea.java
产生所有class文件
然后执行java MyArea 4 5
结果:20
当执行java MyArea 4
的时候却提示‘没有输入参数’
我想让它输出:16
所的够详细了~~~
帮忙看看嘛`

#5




           int num1;
           int num2;
           int num3;
           num1=Integer.parseInt(args[0]);  //给命令行参数附值?
           num2=Integer.parseInt(args[1]);
           num3=Integer.parseInt(args[2]);

改为

           int num1;
           int num2;
           num1=Integer.parseInt(args[0]);  //给命令行参数附值?
           num2=Integer.parseInt(args[1]);
多加的那条是我实验3个数据的时候写的
上面的程序没有num3

#6


问题在这里把,还不知道有没有的时候,就引用,应该不对
但是两个的时候为什么没问题我也搞不懂了。
int arrSize=args.length; //args.length是命令行参数的长度吧?
int num1;
int num2;
int num3;
num1=Integer.parseInt(args[0]); //给命令行参数附值?
num2=Integer.parseInt(args[1]);
num3=Integer.parseInt(args[2]);

#7


哦 ,不好意思,没看清楚
那问题就肯定在
int num1;
int num2;
num1=Integer.parseInt(args[0]); //给命令行参数附值?
num2=Integer.parseInt(args[1]);
这个地方了,
只有一个参数的时候,你引用args[1],肯定会出异常,所以下面的根本没有执行,直接转到从一场处理去了。

#8


还有一点不太明白,题中说要定义个抽象的父类,在产生3个子类,可是我上面的程序2个子类是MyArea的子类,而没有是抽象类MyAreaDemo的子类,当我把2个子类的由class MyRectangle extends MyArea改成class MyRectangle extends MyAreaDemo时程序就出错误了~
这个问题的答案又是什么呢?

#9


dollyn(逆风飞扬)
可是当我执行java MyArea 4 时程序的args.length应该为1吧?那它应该跳转到 
if(arrSize==1) 执行下面语句啊~
可能程序需要我把定义的所有已经定义好的参数都附值才不会报错对吗?
那这样的话,只有最多参数的那条指令才能执行了~
有没有动态,我的意思是不知道怎么修改了~
应为以前没学过命令行参数,以前都用JB编程,对命令行参数的了解很少`

#10


自己顶下

#11


主类改成这样:

class MyArea                        //主类
{
     public static void main(String args[])
     {
        try
        {
           int arrSize=args.length;         //args.length是命令行参数的长度吧?
           int num1;
           int num2;
           int num3;

           if(arrSize==2)                      //当输入两个数字的时候,用这个方法
           {
               num1=Integer.parseInt(args[0]);  
               num2=Integer.parseInt(args[1]);
               MyRectangle objR=new MyRectangle();
               objR.area(num1,num2);
           }


           if(arrSize==1) //当输入一个数字的时候,用这个方法
                          //问题就出在这里,当输入一个数字的时候,
                          //总是出现异常“没有输入参数”就结束程序了~
           {
                num1=Integer.parseInt(args[0]);  
                MySquare objS=new MySquare();
                objS.area(num1);
           }
           // System.out.println(num1+"&"+num2+"&"+num3);
         }
           catch(ArrayIndexOutOfBoundsException e)
          {            
                System.out.println("没有输入参数");
          }
      }
}

#12


class MyArea
{
  public static void main(String [] args)
  {
  
   if(args.length==1){
       int a=Integer.parseInt(args[0]);
        System.out.println("正方形的面积: "+a*a);
   }
   else if(args.length==2){
     int a=Integer.parseInt(args[0]);
       int b=Integer.parseInt(args[1]);
     System.out.println("长方形的面积: "+a*b);
   }
   else if(args.length==3){
     int a=Integer.parseInt(args[0]);
       int b=Integer.parseInt(args[1]);
       int c=Integer.parseInt(args[2]);
     System.out.println("三角形的面积: "+a*b/2);
   }
   else{
       System.out.println("请输入一到三个参数!");
   }
   }
}
条条大路通java啊!!

#13


恩 ,上面的回答已经不错了

我说下这个问题:

dollyn(逆风飞扬)
可是当我执行java MyArea 4 时程序的args.length应该为1吧?那它应该跳转到
if(arrSize==1) 执行下面语句啊~

因为你执行下面的语句的时候,并没有判断长度阿,所以下面的是一定会被试图执行的,那么就出问题了吧。
int num1;
int num2;
num1=Integer.parseInt(args[0]); //给命令行参数附值?
num2=Integer.parseInt(args[1]);
正确的方法就向楼上的那样,判断以后再引用。

#14


#15


好久没来这里了~谢谢大家的支持!
我的程序已经做好了~还请大家分享~

public abstract class Shape {
    public abstract double area();
}
class Square extends Shape{
    double said_distence;
    public Square(double num1){
        said_distence = num1;
    }
    public double area(){
        return (said_distence * said_distence);
    }
}
class Rectangle extends Shape{
    double width;
    double hight;
    public Rectangle(double num1,double num2){
        width = num1;
        hight = num2;
    }
    public double area(){
        return (width * hight);
    }
}
class Triangle extends Shape{
    double sd1;
    double sd2;
    double sd3;
    double s,k;
    double tArea;
    public Triangle(double num1,double num2,double num3){
        sd1 = num1;
        sd2 = num2;
        sd3 = num3;
        s = (sd1 + sd2 + sd3)/2;
        k = s * (s - sd1) * (s - sd2) * (s - sd3);
        
        if(k<=0){
            System.out.println("此三条边不能构成一个三角形");
        }
        else{
            tArea = Math.sqrt(s * (s - sd1) * (s - sd2) * (s - sd3));
        }
    }
    public double area(){
        return (tArea);
    }
}
=================

public class MainTest {
    public static void main(String args[]) {
        try {
            int arrSize = args.length;
            double num1;
            double num2;
            double num3;
            if (arrSize == 3){
                num1 = Integer.parseInt(args[0]); 
                num2 = Integer.parseInt(args[1]);
                num3 = Integer.parseInt(args[2]);
                Shape objT = new Triangle(num1,num2,num3);
                System.out.println("三角形面积是:" + objT.area());
            
            }
            if (arrSize == 2) {
                num1 = Integer.parseInt(args[0]);
                num2 = Integer.parseInt(args[1]);
                Shape objR = new Rectangle(num1, num2);
                System.out.println("长方形面积是:" + objR.area());
            }

            if (arrSize == 1) {
                num1 = Integer.parseInt(args[0]);
                Shape objS = new Square(num1);
                System.out.println("正方形面积是:" + objS.area());
            }
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("没有输入参数");
        }
    }
}
正规执行没问题~
虽然还有些小BUG~
散分揭贴