java中没有和C/C++对应的输入函数。要解决输入问题,有两个办法:最简单的是利用其swing.JOptionPane对话框类,接收字符串输入,然后利用Integer/Double.parseXX()方法将其转换成相应的类型。另一种方法是自己写一个输入类,解决从命令行输入的问题。
我这里有一段代码可供参考,但这决不是唯一的方法。import java.io.*;public class FormattedInput
{
private int ttype;
private StreamTokenizer token = new StreamTokenizer( new BufferedReader(
new InputStreamReader(System.in)));

private int readToken()
{
try 
{
ttype = token.nextToken();
return ttype;
}
catch (IOException e)
{
e.printStackTrace();
}

return 0;
}
public int readInt() throws InvalidUserInputException
{
if (readToken() != token.TT_NUMBER)
{
throw new InvalidUserInputException("readInt() failed. Input data not numeric");
}
return (int)token.nval;
}
public double readDouble()
{
//if (readToken() == token.TT_NUMBER)
return 0;

}
public static void main(String[] args)
{
FormattedInput kb = new FormattedInput();

try {
System.out.print("Enter an integer: ");
System.out.println("Integer read: "+kb.readInt());
} catch (InvalidUserInputException e) {
System.out.println("not numeric");
e.getMessage();
}
}
}public class InvalidUserInputException extends Exception
{
public InvalidUserInputException(String msg)
{
super(msg);
}
}

解决方案 »

  1.   

    OOps!! readDouble()并不是完成品,可利用readInt()简单修改。
      

  2.   

    谢谢 dunai2003() 给的代码,我今天下班回去试试。To Pilchardyx(沙丁鱼) ,你是不是说把public static void main(String[] args)里args里的字符串转换?那我要INT和FLOAT型的怎么办?
      

  3.   

    To cool_li(G.T.O) ,具体语法怎么用?我用过,提示有错误,我又是刚学java,不大懂。1.System.in.read(int i);
    2.int i=System.in.read();
    Which one?()
      

  4.   

    dunai2003() :你的代码运行过了,不错,谢谢!JAVA里输入这么麻烦吗?还是用JBUILDER后就会简单些呢?还有:
    D:\MyJava>javac formattedinput.java
    formattedinput.java:51: class InvalidUserInputException is public, should be dec
    lared in a file named InvalidUserInputException.java
    public class InvalidUserInputException extends Exception为什么不删掉类InvalidUserInputException前的public就会出这样的错误呢?你们是不是也这样?我以前的其它程序也是,有些类前如果用了public就会出错.
      

  5.   

    to 巫子(用心的人java中没有通用的输入类,确实实java的美中不足,这和用不用jbuilder没有关系,因为jbuilder只是IDE而已,背后的编译仍然是javac。
    另:关于编译错误,是因为你把class InvalidUserInputException和其他class放在一个文件里了:java只允许一个文件里有一个public class。因此,你要么把class InvalidUserInputException单独作为一个文件编译,文件名一定要和class名一致(包括大小写);要么取消public关键字,这样才能和其他class放在同一文件中编译。
    不知我解释清楚了没有。
      

  6.   

    To dunai2003() 谢谢,你解释得很详细,我想“java只允许一个文件里有一个public class”是因为封装的原因吧,要不就没什么意义了。
    还有点问题,把class InvalidUserInputException单独作为一个文件编译之后的文件如果和main()在一个目录,应该可以直接用吧,那如果不在同一个目录呢?是不是有个什么import?我是刚学,用的清华张孝祥老师的书,很适合初学者,但很多地方讲得不深。
      

  7.   

    是的,你可以建立自己的库,然后用import调用,语法格式和调用系统库一样。
    import yourFolderName.subFolderName.className;
      

  8.   

    其实java推荐的是使用swing的交互式响应。
      

  9.   

    To:dunai2003() :是指定路径吗?那我的class文件都在d:\myjava下,怎么import?To:lyyupeng(coolnetboy) :eclipse是编译器吗?To:coolarmy(bb考拉猪) :swing???????????
      

  10.   

    如果你的class文件在D:\myjava下,那么,被import的文件应该在D:\myjava\myimported中。这个文件夹中的*.java文件都应当有package名,如//注意package名必须和当前文件夹名完全相同
    package myimported;public class MyImportedClass
    {
         public static void message()
         {
              System.out.println("Hello");
         }
    }注意:一定要在D:\myjava下编译该文件,不要在D:\myjava\myimported下编译;编译格式为
    javac myimported/MyImportedClass.java 或javac myimported.MyImportedClass.java
    编译好以后,在D:\myjava\myimported会自动生成MyImportedClass.class文件。这样,在你的D:\myjava文件夹中的*.java文件可以import上述文件了:import myimported.MyImportedClass;public class MyClass
    {
          public static void main(String[] args)
          {
               MyImportedClass.message();
          }
    }运行当前代码,结果为:
    hello
      

  11.   

    另外coolarmy(bb考拉猪) :“其实java推荐的是使用swing的交互式响应”
    其实就是我在第一个帖子中所说的swing.JOptionPane.showInputDialog()方法,用这个方法,你不必再创建输入类,可以利用java本身提供的swing对话框得到输入。具体如下:import javax.swing.*;
    public class Input
    {
        public static void main(String[] args)
        {
             String input = JOptionPane.showInputDialog(null, "Enter a number");         int intNumber = Integer.parseInt(input);
             
             // 或者可以转换成double
             double doubleNumber = Double.parseDouble(input);         System.out.println("Integer: "+intNumber);
             System.out.println("Double: "+doubleNumber);         System.exit(0);
        }
    }
      

  12.   

    能解释一下子 dunai2003() 的代码吗?
    1)token.TT_NUMBER  2)token.nval
      

  13.   

    To: dunai2003():谢谢,了解中......,感觉JAVA的跨平台性其实牺牲了好多的便利呀。
      

  14.   

    token.TT_NUMBER: a constant number indicating that a number token has been read.
    token.nval: if the current token is a number, this field contains the value of
    that number.