in.read(read); 
 
read[2] 可能没付值 ,
改为
byte[] read=new byte[3]; 
read[0]=0;
read[1]=0;  
read[2]=0;就没事了byte 的范围是 0 - 128 溢出就会不正确

解决方案 »

  1.   

    不对吧,byte不是 -128 - 128 吗? 我现在只想要 1-99的值啊
      

  2.   

    奇怪,你怎么又贴了一次?
    这样可以,关键是用readLine()。
    不过就不能做到只读两位数了,你可以在判断是否小于0时加入 ||是否大与99的判断语句。import java.io.*;
    public class Test { 
    public static void main(String args[]) { 
    char[] lread=new char[2];
    String mgroup = new String();
    int g;
    boolean  flag = false;
    BufferedReader lin =
            new BufferedReader(
              new InputStreamReader(System.in));      while (!flag) {
          System.out.println("Please input how many groups number you want to purchase(1-99):");
    // System.in.reset();
          try {
            
            mgroup=(lin.readLine()).trim();
          }
          catch (Exception e) {
            System.out.println(e.toString());
          }
                g=Integer.parseInt(mgroup); //这里会执行错误?
          System.out.println(g);
          if (g<=0){
            flag=false;
          }
          else
            flag=true;} 
    }
    }   
      

  3.   

    如果用readLine确实是可以解决了。但是我还有问题。1、是否最先我使用的那种方法是一定无法实现的呢?也就是说是错误的呢?
    2、用readLine的话如何判断输入的是字符串啊?
      

  4.   

    我刚才在那个贴上给你发了,你去看看,要不我再给你发一个,请参考,import javax.swing.UIManager;
    import java.awt.*;
    import java.io.*;public class Application1 {public Application1() {
    }
      /**Main method*/
      public static void main(String[] args) {
        try {
          UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }
        catch(Exception e) {
          e.printStackTrace();
        }
        new Application1();
        byte rea[] = new byte[2];
        String group;
        int g;
        boolean flag=false;
        while (!flag) {
          System.out.print("Please input how many groups number you want to purchase(1-99):");
          try {
           System.in.read(rea);
          }
          catch (Exception e) {
            System.out.println(e.toString());
          }
          try {
             group=new String(rea).trim();
             g=Integer.parseInt(group);
            if (g<=0){
              flag=false;
            }
            else
              flag=true;
           System.out.println("i love you"+g);      }catch(Exception e){
          }
       }  }
    }
    干吗这么自责,知识总是无止境,共同探讨吧
      

  5.   

    算了,太累了,我现在还是改成那个readLine了,你能告诉如何判断输入是数字型而不是字符串吗?
      

  6.   

    不可能吧,比如限定长度不超过3位,然后逐位取ASCII,如果不属于数字范围就报错,这不就可以了吗?
      

  7.   

    1。用原来的方法确实无法实现,因为你用byte数组read[]作为读入的buffer,则in.read(read[])只会读取read.length个输入的字符,而你是无法控制用户输入几个字符的,一旦用户输入了2个以上字符(包括回车)而你只读了两个字符,则在下一次循环时它看到in中还有可读的内容,则直接读取,不会再停下来等用户重新输入,就会出现所说的问题。readline是读取回车符以前的内容(包括回车符),就解决了这个问题。
       另外,很少有例程中直接用in去读,它的上面的很多stream类有更多、更简便的方法可以利用。
    2。关于对输入内容的判断可以根据parseInt是否出现NumberFormatExeption,把try和catch放入一个while(1)循环中,在catch块中加入continue,在while最后一行加入break;try it!
      

  8.   

    哦,你已经有循环了,那就更好办了。
    while (!flag) {
          System.out.println("Please input how many groups number you want to purchase(1-99):");
          try {
            
            mgroup=(lin.readLine()).trim();
            g=Integer.parseInt(mgroup); //这里会执行错误?
          }
          catch (Exception e) {
            continue;
          }
          if (g<=0||g>100){
            flag=false;
          }
          else
            flag=true;} 
      

  9.   

    程序可以更简单:
    import java.io.*;
    public class Happy { 
    public static void main(String args[]) { 
    String mgroup = new String();
    int g;
    BufferedReader lin =
            new BufferedReader(
              new InputStreamReader(System.in));      while (true) {
          System.out.println("Please input how many groups number you want to purchase(1-99):");
          try {
            mgroup=(lin.readLine()).trim();
            g=Integer.parseInt(mgroup); //这里会执行错误?
            if (g<=0||g>100) throw new Exception();
          }
          catch (Exception e) {
            continue;
          }
          break;} 
    }
      

  10.   

    我还是觉得应该利用exepiton,为了防止上面的方法把其它的exeption给放过了,可以先catch(NumberFormatExeption)
    {  continue;}
    catch (Exepiton e)
    { e.printStackTrace();}