(JAVA)工厂模式的问题?

顺应天意了却凡尘 发布于 02/06 11:32
阅读 145
收藏 1

package shier;
interface Fruit 
{   // 定义一个水果标准
    public void eat() ; // 吃
}
class Apple implements Fruit 
{
    public void eat() 
    {
        System.out.println("吃苹果。") ;
    }
}
class Orange implements Fruit 
{
    public void eat() 
    {
        System.out.println("吃橘子。") ;
    }
}
class Factory1 
{ // 此类不需要维护属性的状态
    public static Fruit getInstance(String className) 
    {
        if ("apple".equals(className)) 
        {
            return new Apple() ;
        }
        if ("orange".equals(className))
        {
            return new Orange() ;
        }
        return null ;
    }
}
public class factory 
{
    public static void main(String args[]) 
    {    
        Fruit f = Factory1.getInstance(args[1]) ; // 初始化参数
//          System.out.println(args[2]);
           f.eat() ;
    }
}

这是书上的代码,args[0]报了数组下标越界异常,这是为什么呢? Factory1类的getInstance方法为什么要传args[0]参数进去?应该怎样修改呢?

加载中
0
kakai
kakai

main方法是程序执行入口,其参数是需要外部传入的,你直接运行没有传入参数自然是数组越界

顺应天意了却凡尘
顺应天意了却凡尘
不是传人了args[0]作为参数吗?
0
tcxu
tcxu
  1. 通过 指令 java 写成一个命令行,可以运行编译好的字节码文档。
  2. 运行这个文档的代码,要调用它的驱动方法 public static void main(String args[]){...},即 只调用这个主方法。 字符串数组 args  就是调用主方法时, 从命令行输入的参数。
  3. 数组的长度为 args.length, 如果数组存在, args[ 0 ] 表示数组的第一个元素,  args[ 1 ] 表示 第二个元素,...
  4. 如果命令行没用数据输入,则 args.length 为零。这时,代码中若出现任何字符串数组 args 元素的表示:args[ i ]( i为任何一个正整数), 都会在运行(解释)时报错而停机。
  5. 假设,用户在命令行,仅通过字符串数组的第一个元素 args[ 0 ], 输入有关水果的信息,其它下标的元素均被忽略,那么,代码可以修改成如下的样子。
interface Fruit{   // 定义一个水果标准
    public void eat() ; // 吃
}
class Apple implements Fruit{
     public void eat(){
         System.out.println("吃苹果。") ;
     }
 }
class Orange implements Fruit{
     public void eat() {
         System.out.println("吃橘子。") ;
     }
 }
class Factory1 { // 此类不需要维护属性的状态
    public static Fruit getInstance(String className) {
         if ("apple".equals(className)){
             return new Apple() ;
         }
         if ("orange".equals(className)){
             return new Orange() ;
         }
         return null ;
     }
 }
 public class Factory {
     public static void main(String args[]) {  
     if (args.length==0) {
     	System.out.println("命令行没有输入数据。运行终止。");
     	System.exit(0);
     	} else{
         	Fruit f = Factory1.getInstance(args[0]) ; // 初始化参数
         	if (f == null) 
         	System.out.println("没有这种水果。运行终止。");
         	else
         	f.eat() ;
     	}
     }
 }

以下代码案例,显示

  1. 如何接收用户从命令行输入的字符串数组,
  2. 同时,通过镶嵌的不同异常的捕捉,分辨数组元素的不同类型(整形、浮点型、非数字的字符串),
  3. 并且 统计这个字符串数组的元素。
import java.io.*;
public class T{
public static void main(String args[]){
	int N= args.length; 		//获得用户从命令行输入的字符串数组的长度
int i[] = new int[N]; 			//定义 保存整形数类型元素的数组 i      
double d[] = new double[N];     //定义 保存浮点/双精度数类型元素的数组 d
String s[]= new String[N];		// 定义 保存非数字类型的字符串元素的数组 s
int indexI=0,indexD=0,indexS=0; // 声明以上三种数组的初始下标
 for (int k=0;k<N;k++)
  try{
	int n=Integer.parseInt(args[k]);
	i[indexI++]=n; //鉴别元素为整型类,将其存入 整形类数组 i
	}catch(NumberFormatException e){
	try {
		double dd = Double.parseDouble(args[k]);
		d[indexD++]= dd;//鉴别元素为双精度类,将其存入 整形类数组 d
		}catch(NumberFormatException ee){
		s[indexS++]=args[k];//若元素既不是整形类,也不是双精度类,将其存入 非数字数组 s
		}
	   }
	  /* 输出最终结果 */
 System.out.println("输入的整型数:");
 for (int k=0;k<indexI;k++)
 System.out.print(i[k]+ " ");
 System.out.println("\n输入的浮点数:");
 for (int k=0;k<indexD;k++)
 System.out.print(d[k]+ " ");
 System.out.println("\n输入的非数字:");
 for (int k=0;k<indexS;k++)
 System.out.print(s[k]+ " ");
 System.out.println();
	}
}

tcxu
tcxu
回复 @顺应天意了却凡尘 : 若 用 eclipse 运行,那必须将 eclipse 设置成"在命令行输入数据"的模式来运行。学习java语言,就要学会在 DOS 窗口里编译(指令 javac)、运行(指令 java) java 代码。
顺应天意了却凡尘
顺应天意了却凡尘
回复 @tcxu : 没有在DOS窗口中运行, 我是在eclipse中直接运行。有什么区别吗?
tcxu
tcxu
回复 @顺应天意了却凡尘 : 接下来的数行:"输入的整型数:...输入的浮点数:... 输入的非数字:...", 是运行这段代码的结果(输出)。即,输出解析(分析)用户输入数据的结果。分别列出不同类型的数据。在 DOS 窗口环境 调试/编译/运行 java 程序,是程序员学习java语言最基本的技能, 必须首先牢牢掌握。
tcxu
tcxu
回复 @顺应天意了却凡尘 : 你所说的 "第一段...、第二段代码..."是否是指 上面在 DOS 窗口 编译和运行 T.java 的记录显示?如实这样,第一行指令:"javac T.java" 实现了 java 代码的成功编译。接下来一行的指令;"java T .1415 56 ...." 的指令,是通过命令行,输入字符串数组形式的数据,运行(解释)编译好的字节码文档。
顺应天意了却凡尘
顺应天意了却凡尘
回复 @tcxu : 第一段代码的运行结果是:命令行没有输入数据。运行终止。第二段代码的运行结果是 输入的整型数: 输入的浮点数: 输入的非数字: 这是怎么回事?
下一页
返回顶部
顶部